4

我有一个由 (linux) gcc 4.8.2 编译的带有 -fvisibility=hidden 的小型静态库,它链接到一个共享库(我有两个版本,一个带有 C 代码的 gcc 和一个带有 Fortran 代码的 ifort)。静态库由一些内部函数组成,所有函数都以“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 取决于共享库)

4

1 回答 1

2

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_符号的测试程序。

于 2014-03-14T09:57:33.483 回答