9

在具有 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
4

3 回答 3

3

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

于 2010-05-12T10:50:52.783 回答
3

我可能迟到了八年,但是是的,你实际上可以做你想做的事。

使用 Bash进程替换

gcc -shared foo.c -Wl,--version-script=<(echo "{global:foo1;foo2;local:*;};") -o libfoo.so -soname libfoo.so
于 2018-01-26T11:27:21.943 回答
-2

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

readelf --symbols --use-dynamic $yourlib.so
于 2009-04-27T15:55:29.787 回答