C 如何找到外部函数定义

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

我正在编译一个大项目。该项目使用共享库,尤其是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_

所以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 $@
}