问题描述
假设我有 _
与
foo.a
我如何修改 a.o
T aaa
U bbb
b.o
T bbb
或创建可重定位的 foo.a
,以便当它在另一个项目中链接时,foo.o
使用 a.o:bbb
而不是 {{1}可能在别处定义?请注意,我不能使用 b.o:bbb
,因为 bbb
是在 --whole-archive
中的 .o 中定义的。另请注意,如果有帮助,我可以知道保持全局(例如 main
)或使用局部(例如 foo.a
)的符号。
我尝试使用仅导出 aaa
的版本脚本创建可重定位对象,希望 bbb
将隐式链接到本地。不幸的是,生成的 .o 不包含任何符号:
aaa
这甚至可能不是正确的方法,所以我愿意接受建议。谢谢!
解决方法
我如何修改 foo.a 或创建一个可重定位的 foo.o 以便
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
)的对象以及定义{{1}引用的符号的任何其他对象} 被拉进来。
如果您需要导出多个符号(例如 a.o
、aaab
等),您需要同时调整 aaac
和 ld
命令以列出