强制 .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
引用的符号。
如果您需要导出多个符号(例如 aaab
、aaac
等),您需要同时调整 ld
和 objcopy
命令列出它们。
假设我有 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
引用的符号。
如果您需要导出多个符号(例如 aaab
、aaac
等),您需要同时调整 ld
和 objcopy
命令列出它们。