【问题标题】:Given a library function how can I get its file offset?给定一个库函数,我如何获得它的文件偏移量?
【发布时间】:2021-04-19 04:15:11
【问题描述】:

使用 backtrace 和 backtrace_symbols,我可以获得一个感兴趣的重整函数名称(我们将其称为属于 libfsw.so 的 funcA_mangledName。

我的目标是获取源文件和定义它的行号。我可以对未在库文件中定义的函数执行此操作,如下所示。 stacktrace 保存回溯。 filename = S_main_executable 在一般情况下。

sprintf(syscom[jj], "addr2line %p -e %s", stacktrace[jj], filename);
system(syscom[jj]);

但是,当函数是库的一部分时,这不起作用,即文件名 = libfsw.so。

向后工作,我可以在 linux 终端上执行此操作:

nm libfsw.so | grep funcA_mangledName

获取:000000000020cbea T funcA_mangledName

然后当我进入linux终端时:

addr2line 0x000000000020cbea -e libfsw.so

我得到了正确的源文件和行号。

从开头到正确的文件偏移量,我缺少什么?

【问题讨论】:

    标签: function shared-libraries offset nm addr2line


    【解决方案1】:

    我想通了!通过减去库文件的虚拟基地址,我能够将回溯给出的“虚拟地址”转换为文件偏移量。我假设只要库被加载到连续内存中,这应该总是有效的。

    for (jj=2; jj < trace_size; ++jj) {
       void *handle;
       struct link_map *map;
    
       handle = dlopen(filename, RTLD_LAZY);
       dlinfo(handle, RTLD_DI_LINKMAP, &map);
    
       // Override the address given by backtrace (only needed for library files)
       stacktrace[jj] = stacktrace[jj] - map->l_addr;
    
       sprintf(syscom[jj], "addr2line %p -e %s", stacktrace[jj], filename);
       system(syscom[jj]);
       dlclose(handle);
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      相关资源
      最近更新 更多