强制.o文件在.a中使用一些符号



假设我有foo.a

a.o
T aaa
U bbb
b.o
T bbb

我怎样才能修改foo.a或创建一个可重新定位的foo.o,这样当它被链接到另一个项目时,a.o:bbb使用b.o:bbb而不是可能在其他地方定义的bbb?请注意,我不能使用--whole-archive,因为main是在foo.a中的一个。0中定义的。还请注意,如果有帮助的话,我可以知道保持全局(例如aaa)或使用局部(例如bbb)的符号。

我试图创建一个版本脚本只导出aaa的可重定位对象,希望bbb将隐式链接到本地。不幸的是,生成的。o不包含符号:

$ cat version.script
{ global: aaa; local: *; };
$ ld -relocatable --version-script version.script foo.a -o foo.o
$ nm foo.o
nm: foo.o: no symbols

这可能不是正确的方法,所以我愿意接受建议。谢谢你!

如何修改foo。A或创建一个可重定位的foo。

ld -r --whole-archive foo.a -o foo1.o &&
objcopy -w -L.* -Gaaa foo1.o foo.o &&
rm foo1.o
nm foo.o
0000000000000000 T aaa
0000000000000010 t bbb
U _GLOBAL_OFFSET_TABLE_

我尝试用版本脚本创建一个可重定位的对象

链接器版本脚本不能用于可重定位对象,它们只能控制动态符号表中的符号,而这些符号是可重定位对象所没有的。

请注意,我不能使用——whole-archive,因为main是在foo.a中的.o中定义的

这是微不足道的修复:

ld -r -u aaa foo.a -o foo1.o

这将导致只有定义了aaa(这里是a.o)的对象和任何其他定义了a.o引用的符号的对象被拉入。

如果您需要导出多个符号(例如aaab,aaac等),您需要调整ldobjcopy命令以列出它们。

最新更新