是否可以使用ELF查找函数的位置?类似于什么
void *f = dlopen(NULL,..);
void *func = dlsym(f, "myfunc");但是在编译过程中不需要-rdynamic?
我可以使用nm看到条目的命名仍然存在于编译的二进制文件中?:
0000000000400716 T lookup
0000000000400759 T main一旦程序加载到内存中,我是否可以使用此信息定位这些项?
发布于 2018-05-23 14:08:44
一旦程序加载到内存中,我是否可以使用此信息定位这些项?
当然可以:遍历a.out中的所有符号,直到找到匹配的符号为止。迭代符号的示例代码是这里。或者使用诽谤。
如果需要执行多个符号查找,对所有符号迭代一次(慢速),从符号名生成映射到其地址,并使用该映射执行查找。
更新:
你指出的例子似乎不完整?它使用数据和精灵,它们从哪里来?
是的,你需要在这个例子上涂一点肘部的油脂。
data是内存中的a.out被read进入的位置,或者(更好的) mmaped。
您可以自己创建mmap a.out,也可以通过getauxval(AT_PHDR)等方法查找现有的映射,将其舍入到页面大小。
ehdr是(ElfW(Ehdr) *)data (即,根据需要将data转换为Elf32_Ehdr或Elf64_Ehdr )。
如果这一点还不清楚,那么您可能应该只使用libelf,它为您处理细节。
另外,ELF只允许我找到符号的名称,还是它能给我指向符号在内存中的位置的指针?
它可以同时给您两个:str + sym[i].st_name是名称,sym[i].st_value是指针(nm显示的值)。
(例如0000000000400716大概是一些相对的基本地址,而不是内存中的实际位置,对吗?)
不,实际上(这个二进制)是绝对地址。
与位置无关的二进制文件确实使用相对地址(因此您需要类似于上面提到的getauxval来查找此类可执行文件的基本位置),但是这个特定的二进制文件看起来像ET_EXEC (使用readelf -h a.out验证这个位置)。address 0x400000是在Linux x86_64上加载非饼式可执行文件的典型地址(这可能就是您的系统)。
https://stackoverflow.com/questions/50488137
复制相似问题