列出ld链接器可用的所有符号

时间:2014-03-11 14:08:46

标签: linux gcc intel-fortran nm readelf

我有一个由(linux)gcc 4.8.2编译的小型静态库,其中-fvisibility = hidden,它链接到一个共享库(我有两个版本,gcc一个带有C代码,ifort一个带有Fortran代码)。静态库由一些内部函数组成,所有函数都以“ST_LIB _”为前缀。

我想确保链接到共享库的任何可执行文件/库都不能使用静态库中声明的函数。 Linux上检查具有某些前缀的函数不能被任何外部库使用的最佳命令是什么?

我试过了:

nm --dynamic shared_lib | grep -i "ST_LIB_" | wc -l(输出0)

readelf -d shared_lib | grep -i "ST_LIB_" | wc -l(输出0)

nm -g shared_lib | grep -i "ST_LIB_" | wc -l(根据共享库输出26或0)

readelf -s shared_lib | grep -i "ST_LIB_" | wc -l(根据共享库输出26或0)

readelf -Ws shared_lib | grep -i "ST_LIB_" | grep -i "HIDDEN" | wc -l(根据共享库输出26或0)

1 个答案:

答案 0 :(得分:1)

nm --dynamic应该是您要查找的选项,因为它会显示您可以链接的符号(来自共享库)。 readelf --dyn-syms应显示相同的信息(不同的输出)。

使用nm时,请检查具有"T"属性的符号。从手册页:

The symbol type.  At least the following types are used; others are, as well, depending 
on the object file format.  If lowercase, the symbol is usually local; if uppercase, the
symbol is global (external).  There are however a few lowercase symbols that are shown
for special global symbols ("u", "v" and "w").
[...]
"T"
"t" The symbol is in the text (code) section.

如果您想100%确定,您可以随时编写一个链接到您的共享库的测试程序,并尝试使用其中一个ST_LIB_符号。