GNU链接器:替代--version-script在命令行列出导出的符号?

Posted

技术标签:

【中文标题】GNU链接器:替代--version-script在命令行列出导出的符号?【英文标题】:GNU linker: alternative to --version-script to list exported symbols at the command line? 【发布时间】:2010-10-21 23:43:22 【问题描述】:

在带有 GNU 工具链的 Linux 上,我知道如何使用版本脚本 (gcc -Wl,--version-script=symbols.map) 控制从共享库中导出的符号,但我想在而是命令行。 IOW,我想要相当于

link /EXPORT:foo 

来自 MS 工具链。有可能吗?

编辑:

我的问题可能不是很清楚:如果我有一个库 libfoo.so,并且我只想导出库 foo1 和 foo2,我可以去创建一个版本脚本 foo.linux,如下所示

libfoo.so

global:
    foo1;
    foo2;
local:
    *;

然后做

gcc -shared foo.c -Wl,--version-script=foo.linux -o libfoo.so -soname libfoo.so

我希望能够做这样的事情:

gcc -shared foo.c -Wl,--export-symbol=foo1 -Wl,--export-symbol=foo2 -o libfoo.so -soname libfoo.so

【问题讨论】:

【参考方案1】:

我不确定您是否可以按照自己的意愿执行此操作。 一种方法是使用您提到的链接器版本脚本。另一种方法是在你的源代码中添加__attribute__ ((visibility("default"))) 用于你想要导出的任何内容,并使用-fvisibility=hidden 编译所有内容

【讨论】:

是的,目前看来,做我想做的事根本不可能。使用属性正是我想要避免的【参考方案2】:

我可能迟到了八年,但是是的,你实际上可以为所欲为。

使用 Bash process substitution:

gcc -shared foo.c -Wl,--version-script=<(echo "global:foo1;foo2;local:*;;") -o libfoo.so -soname libfoo.so

【讨论】:

【参考方案3】:

readelf 和 objdump 有很多选项。怎么样:

readelf --symbols --use-dynamic $yourlib.so

【讨论】:

以上是关于GNU链接器:替代--version-script在命令行列出导出的符号?的主要内容,如果未能解决你的问题,请参考以下文章

非 GNU 链接器是不是有与 GNU 链接器“--just-symbols”选项等效的选项?

AVR - GNU 链接器脚本 - 如何获取 .data 部分的加载地址

使用 GNU 链接器的正确方法

GNU 链接器脚本 - 将闪存移动到新区域

重新排序 gnu autotools 链接器标志

GNU 链接器:适应名称修改算法的更改