首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >静态ELF替代dlsym

静态ELF替代dlsym
EN

Stack Overflow用户
提问于 2018-05-23 12:13:48
回答 1查看 391关注 0票数 2

是否可以使用ELF查找函数的位置?类似于什么

代码语言:javascript
运行
复制
void *f = dlopen(NULL,..);
void *func = dlsym(f, "myfunc");

但是在编译过程中不需要-rdynamic

我可以使用nm看到条目的命名仍然存在于编译的二进制文件中?:

代码语言:javascript
运行
复制
0000000000400716 T lookup
0000000000400759 T main

一旦程序加载到内存中,我是否可以使用此信息定位这些项?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-23 14:08:44

一旦程序加载到内存中,我是否可以使用此信息定位这些项?

当然可以:遍历a.out中的所有符号,直到找到匹配的符号为止。迭代符号的示例代码是这里。或者使用诽谤

如果需要执行多个符号查找,对所有符号迭代一次(慢速),从符号名生成映射到其地址,并使用该映射执行查找。

更新:

你指出的例子似乎不完整?它使用数据和精灵,它们从哪里来?

是的,你需要在这个例子上涂一点肘部的油脂。

data是内存中的a.outread进入的位置,或者(更好的) mmaped。

您可以自己创建mmap a.out,也可以通过getauxval(AT_PHDR)等方法查找现有的映射,将其舍入到页面大小。

ehdr(ElfW(Ehdr) *)data (即,根据需要将data转换为Elf32_EhdrElf64_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上加载非饼式可执行文件的典型地址(这可能就是您的系统)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50488137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档