ELF二进制文件来自内存

时间:2014-09-15 16:07:41

标签: c elf file-format

我刚刚在C中写了一个我正在玩的Hello世界程序。我想尝试从内存中转储二进制文件(使用gdb)并尝试从中创建另一个可执行文件。我尝试转储具有可执行权限的页面,然后是其数据页面;但它是段错误。有没有办法做到这一点?有什么方法可以调试并找出崩溃的原因吗?是否有任何通用建议?

感谢。

[编辑]

它在linux上,我在32位和64位x86上尝试过它。内核版本是3.13。我在_start上设置了一个断点,将可执行页面及其数据页面转储到一个文件中并尝试执行它。

2 个答案:

答案 0 :(得分:2)

等等,您只是将映射文本(exectuable页面)部分后跟映射数据部分转储到文件中吗?这本身不是有效的ELF对象,ELF文件也需要ELF头。我很惊讶操作系统甚至让你试图执行它,你应该得到一个关于无效的ELF标题或类似的错误。

除了标题之外,ELF文件还包含许多对于能够运行它的重要部分。

至于调试,我从GDB开始看它崩溃的地方。您的程序是否崩溃,或者在尝试加载程序时动态链接器是否崩溃?如果动态链接器崩溃,请尝试调试,例如与

gdb --args /lib64/ld-2.18.so <your program>

尝试从内存重新创建ELF文件之前已经完成了 - 看看Statifier,它甚至将所有加载的动态库静态地包含在生成的ELF中。

答案 1 :(得分:1)

它可能不是很简单,肯定是处理器和操作系统特定的。

您可以查看emacs源代码unexec.c,它正在执行您想要的操作。见this answer