【问题标题】:starting point of ELF executable file?ELF 可执行文件的起点?
【发布时间】: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,因为没有可执行代码。

我在这里有问题。

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

【问题讨论】:

标签: linux disassembly entry-point


【解决方案1】:

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

您可能还想阅读Assembly HowtoX86 calling conventionsthis questionthe X86-64 ABIthese notes on X86-64 programming

【讨论】:

    猜你喜欢
    • 2015-09-10
    • 1970-01-01
    • 2023-03-04
    • 2017-11-18
    • 2011-06-09
    • 2015-11-23
    • 2014-08-10
    • 1970-01-01
    • 2011-02-23
    相关资源
    最近更新 更多