我正在编写一个大项目。这个项目使用的是共享库,尤其是lapack库。
对于给定的函数,我希望确定系统找到它的共享库。
这里是nm输出:
$ nm -DC ~/bin/app | grep potrf
U dpotrf_
正如预期的那样,dpotrf_是不受限制的。
这里是objdump的结果:
$ objdump -TR ~bin/app | grep potrf
0000000000925428 R_X86_64_JUMP_SLOT dpotrf_
所以objdump找到了一些东西!是否有任何选项可以显示它找到的共享库?或者另外一个程序呢?
答案 0 :(得分:3)
ldd绝对是找到候选库的起点。这是我在.bashrc中出于这些目的所做的事情(不是很漂亮,但却符合我的目的)。
基本上,我对子目录中的所有库(.a,.so)执行nm操作。如果nm为搜索符号生成输出,则打印库名称和nm中的相关行。然后,您的最后一步是搜索以“T”开头的行,因为这些是将符号定义为程序代码(文本)的行。
# run nm on a set of objects (ending with the 1st parameter) and
# grep the output for the 2nd parameter
function nmgrep ()
{
for i in $( find \. -name \*$1 ); do
if [[ ! -e $i ]]; then
continue;
fi
nm $i | grep $2 > /tmp/foo.tmp;
if [[ -s /tmp/foo.tmp ]]; then
echo $i;
cat /tmp/foo.tmp | grep $2
fi
rm /tmp/foo.tmp
done
}
# find symbols definied/referenced in libs
function libgrep ()
{
nmgrep .a $@
nmgrep .so $@
}