如何查找外部函数定义

时间:2010-11-12 10:26:59

标签: c linker shared-libraries objdump

我正在编写一个大项目。这个项目使用的是共享库,尤其是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找到了一些东西!是否有任何选项可以显示它找到的共享库?或者另外一个程序呢?

1 个答案:

答案 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 $@
}