给定一个函数或variables的运行时地址,我的代码需要找出名称,如果它是一个variables,input符号的信息。 或者至less提供足够的信息,以便离线提取名称(和types信息)。
这是Linux代码,假设debugging信息可用。
我试图看看ELF文件格式,binutils和所有,但主题是巨大的,所以我希望有人能帮我缩小范围。
我可以看到以下types的解决scheme:
find当前加载到内存中的模块的代码/数据段的范围 – 如何做? 保存地址的模块和段名称和偏移量在它的段中。 离线,然后使用binutils在模块的debugging信息中find符号 – 再次,如何做?
使用一些API /系统服务我不知道在运行时find符号和信息 – 如何?
先谢谢你。
GNU libc为这个确切的目的提供了一个dladdr
函数 。 但是,它只适用于函数,而不是变量。
#define _GNU_SOURCE /* See feature_test_macros(7) */ #include <dlfcn.h> int dladdr(void *addr, Dl_info *info); The function dladdr() takes a function pointer and tries to resolve name and file where it is located. Information is stored in the Dl_info structure: typedef struct { const char *dli_fname; /* Pathname of shared object that contains address */ void *dli_fbase; /* Address at which shared object is loaded */ const char *dli_sname; /* Name of symbol whose definition overlaps addr */ void *dli_saddr; /* Exact address of symbol named in dli_sname */ } Dl_info; If no symbol matching addr could be found, then dli_sname and dli_saddr are set to NULL. dladdr() returns 0 on error, and nonzero on success.
当然,通常我从gdb做这种事情,而不是在程序本身。
你想看的是二进制文件描述符库,特别是符号处理函数 。 libbfd提供了一组通用的函数来操作和读取各种对象格式。 它通过提供对象文件的抽象视图,然后具有特定的后端来处理特定对象类型和体系结构的细节。 支持ELF文件格式,最有可能是您要使用的体系结构。
我没有发现libbfd很难使用,但我总是开放的替代品,libelf是另一个。 您可能需要专门查看gelf_getsym
函数。
C是一种完全编译的语言。 在编译过程中,通常会丢弃有关变量的名称,类型和其他信息。
一个例外是,大多数编译器将生成一个包含调试信息的可执行文件,以便现场调试器可以访问这些信息。 这个信息完全是操作系统特定的,甚至是编译器特定的,甚至可能是程序不能访问的内存部分。