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

Force .o files in .a to use some symbols from within that .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 中的一个 .o 中定义的。另请注意,如果有帮助,我可以知道保持全局(例如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

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

How can I either modify foo.a or create a relocatable foo.o such that

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_

I tried to create a relocatable object with a version script

链接器版本脚本对 relocatable 对象不起作用,它们只能控制 dynamic 符号中的符号 table which relocatable 缺少对象。

Note that I can't use --whole-archive because main is defined in one the .o in foo.a

修复起来很简单:

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

这将导致定义的对象aaa(此处为a.o)和任何其他对象定义要引入的 a.o 引用的符号。

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