我有一个小的静态库,由(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,取决于共享库)
我想确保在链接到共享库的任何可执行文件/库中都不能使用静态库中声明的函数。在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,取决于共享库)
nm -g
会给你26个结果?-g
(或--extern-only
)应该只给出外部可见符号(正是你所要求的)。因此,你可能有26个不是静态的ST_LIB_*
函数。 - Shahbaz