将两个GCC编译的.o目标文件合并为第三个.o文件


84

一个人如何将两个由GCC编译的.o目标文件组合到第三个.o文件中?

$ gcc -c  a.c -o a.o
$ gcc -c  b.c -o b.o
$ ??? a.o b.o -o c.o
$ gcc c.o other.o -o executable

如果您有权访问源文件,则-combineGCC标志将在编译之前合并源文件:

$ gcc -c -combine a.c b.c -o c.o

但是,这仅适用于源文件,GCC不接受.o文件作为此命令的输入。

通常,链接.o文件无法正常工作,因为您无法使用链接器的输出作为输入。结果是一个共享库,并且没有静态链接到生成的可执行文件中。

$ gcc -shared a.o b.o -o c.o
$ gcc c.o other.o -o executable
$ ./executable
./executable: error while loading shared libraries: c.o: cannot open shared object file: No such file or directory
$ file c.o
c.o: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped
$ file a.o
a.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

1
gcc当前没有-combine选项。它存在于gcc 4.1.2中,而在gcc 6.3.0中不存在(其他人可以找出刚删除的时间)。
基思·汤普森

Answers:


98

传递-relocatable-rld将创建一个对象,它是适合作为输入ld

$ ld -relocatable a.o b.o -o c.o
$ gcc c.o other.o -o executable
$ ./executable

生成的文件与原始.o文件的类型相同。

$ file a.o
a.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
$ file c.o
c.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

2
可以进行逆运算吗?即从co生产ao和bo?
Bert Regelink 2014年

7
@BertRegelink不,因为没有唯一的逆,从数学上来说,不会形成组:P
Alec Teal

7
警告: --relocatable似乎不太方便携带。Android NDK随附的ld只能识别-relocatable。如果您需要便携性,请坚持使用-r
马丁·邦纳

3
@matthijs这个词是相同的;差是一减二。
马丁·邦纳

1
啊,没看到。因此,Android NDK仅识别-relocatable -r,而不能识别--relocatable。感谢您的澄清!
Matthijs Kooijman

10

如果要创建两个或更多.o文件的存档(即静态库),请使用以下ar命令:

ar rvs mylib.a file1.o file2.o

@Lucian但是你为什么要这样做?静态库比.o文件更方便链接。

5
我需要objcopy在生成的文件上运行,并在文件本地创建一些符号,以使它们在外部不可见。a.ob.o文件之间引用了一些需要本地化的符号。我无法本地化单个文件(因为在链接器时找不到符号),我也无法本地化静态档案中的符号。
Lucian Adrian Grijincu 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.