Linux 列出ld链接器可用的所有符号
我有一个由(linux)GCC4.8.2编译的、带有-fvisibility=hidden的小型静态库,它链接到一个共享库(我有两个版本,一个是带有C代码的gcc,另一个是带有Fortran代码的ifort)。静态库由一些内部函数组成,所有函数的前缀都是“ST_LIB” 我想确保静态库中声明的函数不能被链接到共享库的任何可执行文件/库使用在Linux上,检查带有某些前缀的函数不能被任何外部库使用的最佳命令是什么? 我试过:Linux 列出ld链接器可用的所有符号,linux,gcc,intel-fortran,nm,readelf,Linux,Gcc,Intel Fortran,Nm,Readelf,我有一个由(linux)GCC4.8.2编译的、带有-fvisibility=hidden的小型静态库,它链接到一个共享库(我有两个版本,一个是带有C代码的gcc,另一个是带有Fortran代码的ifort)。静态库由一些内部函数组成,所有函数的前缀都是“ST_LIB” 我想确保静态库中声明的函数不能被链接到共享库的任何可执行文件/库使用在Linux上,检查带有某些前缀的函数不能被任何外部库使用的最佳命令是什么? 我试过: nm——动态共享库grep-i“ST_-lib”| wc-l(输出0)
nm——动态共享库grep-i“ST_-lib”| wc-l
(输出0)
readelf-d共享库| grep-i“ST|u lib|wc-l
(输出0)
nm-g共享库| grep-i“ST|u库| 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)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\uuu
符号。为什么nm-g
会给你26个结果-g
(或--extern only
)应该只提供外部可见的符号(正是您所要求的)。所以您可能有26个非静态的ST_LIB.*
函数。静态库由gcc编译,但我有一个由gcc编译的共享库和一个由ifort编译的共享库。nm-g为gcc的链接共享库输出0,但为ifort的链接库输出26。这就是为什么我要请求一个命令来真正显示链接器readsI并没有谈论的是静态库还是共享库。我说的是C的static
关键字。如果函数是静态的,那么链接器应该在外部看不到它。如果gcc正确地告诉您没有外部可见的函数(前缀为ST_LIB_u
),但ifort链接器使这些函数外部可见,那么可能是ifort有问题,或者您调用它的方式有问题。静态库中的函数没有以static关键字作为前缀,那么它们在共享库中就根本无法使用了。我想在共享库中使用ST_LIB_函数,但我不想让共享库公开它们。那也许你在找什么?