C 如何找到外部函数定义
我正在编译一个大项目。该项目使用共享库,尤其是lapack库 我想确定,对于给定的函数,系统在哪个共享库中找到它 此处为nm输出:C 如何找到外部函数定义,c,linker,shared-libraries,objdump,C,Linker,Shared Libraries,Objdump,我正在编译一个大项目。该项目使用共享库,尤其是lapack库 我想确定,对于给定的函数,系统在哪个共享库中找到它 此处为nm输出: $ nm -DC ~/bin/app | grep potrf U dpotrf_ 正如所料,dpotrf_u是未定义的 以下是objdump的结果: $ objdump -TR ~bin/app | grep potrf 0000000000925428 R_X86_64_JUMP_SLOT dpotrf_ 所以objdu
$ nm -DC ~/bin/app | grep potrf
U dpotrf_
正如所料,dpotrf_u是未定义的
以下是objdump的结果:
$ objdump -TR ~bin/app | grep potrf
0000000000925428 R_X86_64_JUMP_SLOT dpotrf_
所以objdump找到一些东西!是否有任何选项显示它在哪个共享库中找到它?或者另一个程序来实现这一点?ldd肯定是找到候选库的起点。以下是我在.bashrc中为这些目的所做的(不漂亮,但符合我的目的) 基本上,我对子目录中的所有库(.a、.so)执行nm。如果nm生成搜索符号的输出,我将打印库名和nm中的相关行。最后一步是搜索以“T”开头的行,因为这些行将符号定义为程序代码(文本)
ldd绝对是找到候选库的起点。以下是我在.bashrc中为这些目的所做的(不漂亮,但符合我的目的) 基本上,我对子目录中的所有库(.a、.so)执行nm。如果nm生成搜索符号的输出,我将打印库名和nm中的相关行。最后一步是搜索以“T”开头的行,因为这些行将符号定义为程序代码(文本)
ldd为~/bin/appldd显示的内容很好地显示了mkl库。这是一个例子,当我不知道函数来自何处时,我需要一个方法。ldd为~/bin/appldd显示的内容很好地显示了mkl库。这是一个例子,当我不知道函数来自何处时,我需要一个方法。
# 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 $@
}