由网友(5dě瑷↗巳淶臨)分享简介:可以将--export-dynamic传递给ld,这将导出程序中的符号(以便它们可用于运行时加载的任何共享库):$ cat > test.cvoid foo() {}int main() { foo(); }^D$ gcc test.c$ nm -D a.out | grep foo...没什么。现在:$ gc...![elf文件解析二](https://p.xsw88.cn/allimgs/daicuo/20230904/6652.png)
可以将--export-dynamic
传递给ld
,这将导出程序中的符号(以便它们可用于运行时加载的任何共享库):
$ cat > test.c
void foo() {}
int main() { foo(); }
^D
$ gcc test.c
$ nm -D a.out | grep foo
...没什么。现在:
$ gcc -Wl,--export-dynamic test.c
$ nm -D a.out | grep foo
0000000000001129 T foo
![elf文件解析二](https://p.xsw88.cn/allimgs/daicuo/20230904/6652.png)
...有效。
https://sourceware.org/binutils/docs-2.34/ld/Options.html#Options
中记录了这一点是否可以仅从一个特定的静态库中导出符号?
类似于:
$ gcc myprogram.cc lib1.a lib2.a lib3.a
假设我只想从lib2.a中导出程序中的符号,而不是lib1.a或lib3.a?
我已尝试:
$ gcc myprogram.cc lib1.a -Wl,--export-dynamic lib2.a -Wl,--no-export-dynamic lib3.a
但它不起作用,看起来--export-dynamic
是全局的。
(文档提到--dynamic-list=listfile
,但我不理解文件的格式,或者如何从静态库中提取符号列表?)
推荐答案
如何从静态库提取符号列表?
nm staticlib.a | awk 'some parsing here, mostly {print $3}'
无法理解文件的格式
我也没有,但我找到了这个链接:https://sourceware.org/legacy-ml/binutils/2010-01/msg00416.html。该文件应包含:
{
foo;
};
ld--导出-仅一个库的动态?
未测试:
gcc myprogram.cc lib1.a lib2.a
-Wl,--dynamic-list=<(echo '{'; nm lib1.a | awk '{print $3";"}'; echo '};')
相关推荐
最新文章