ELF 可执行文件的起点?

Posted

技术标签:

【中文标题】ELF 可执行文件的起点?【英文标题】:starting point of ELF executable file? 【发布时间】:2012-12-09 18:19:28 【问题描述】:

我在 lubuntu 12.10 上使用 anjuta 编译以下 C 程序

int main()

return 0;

文件名为 foobar

然后我打开终端并编写命令

ndisasm foobar -b 32 1>asm.txt

(使用32位指令选项反汇编foobar并将反汇编结果保存到asm.txt)

我打开 asm.txt 有很多 0x0000 和无法理解的代码。

指令jg 0x47(0x7F45) on 0x00000000 and dec esp(0x4C) on 0x00000002 似乎是 ELF 文件格式签名。 (因为十六进制代码 0x454c46 在 ascii 中是 'ELF')

Linux 可能会将此代码加载到内存中,并且不会跳转到 0x00000000,因为没有可执行代码。

我在这里有问题。

    我怎么知道起始地址的地址? 哪些代码可以忽略?(也许很多 0x0000 可以忽略,但还有什么?)

【问题讨论】:

为什么不objdump -d foobar?它只会反汇编 elf 文件的可执行(文本)部分。还可以尝试readelf -e foobar 获取有关部分的信息并查找入口地址。 是否可以手动获取起点? 检查精灵标题:sco.com/developers/gabi/1998-04-29/ch4.eheader.html - e_entry 字段。但是您还需要解析程序头 sco.com/developers/gabi/1998-04-29/ch5.pheader.html 并找到所有 PT_LOAD 段以将虚拟地址转换为文件偏移量。以下是 ELF 和加载过程的快速介绍:wiki.osdev.org/ELF 【参考方案1】:

即使对于像你这样的最简单的程序,gcc 也会链接一些库和一些目标文件(特别是crt0.o,它调用你的main 并包含_start,ELF 的起点)。而且您的二进制文件可能动态链接到某些libc.so.6,因此需要动态链接器(使用ldd foobar 查找)。使用gcc -v 了解gcc 在做什么。而objdump 有很多有趣的标志或选项。

您可能还想阅读Assembly Howto、X86 calling conventions、this question、the X86-64 ABI、these notes on X86-64 programming 等

【讨论】:

以上是关于ELF 可执行文件的起点?的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向ELF 文件格式 ( ELF 文件类型 | ELF 文件对应 CPU 架构 | ELF 目标文件版本 | 可执行程序起始地址 )

Android 逆向ELF 文件格式 ( ELF 文件类型 | ELF 文件对应 CPU 架构 | ELF 目标文件版本 | 可执行程序起始地址 )

Android adb执行可执行文件elf

可执行文件(ELF)格式的理解

ELF文件格式

GCC编译器原理------编译原理一:ELF文件