【问题标题】:How to find an external function definition如何查找外部函数定义
【发布时间】:2010-11-12 10:26:59
【问题描述】:

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

【问题讨论】:

  • ldd 对 ~/bin/app 显示什么
  • ldd 很好地展示了 mkl 库。这是一个例子,当我不知道函数来自哪里时,我想要一个方法。

标签: c linker shared-libraries objdump


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 2019-09-22
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 2021-09-10
    相关资源
    最近更新 更多