假设我有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
等),您需要调整ld
和objcopy
命令以列出它们。