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

问题描述

假设我有 _

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.oaaab 等),您需要同时调整 aaacld 命令以列出