给定一个库函数,我怎样才能得到它的文件偏移量?

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

我的目标是获取定义它的源文件和行号。我可以对库文件中未定义的函数执行此操作,如下所示。 stacktrace 保存回溯。文件名 = 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

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

从一开始到正确的文件偏移量我错过了什么?

XHLIZIMING 回答:给定一个库函数,我怎样才能得到它的文件偏移量?

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

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);
}
本文链接:https://www.f2er.com/1104769.html

大家都在问