【发布时间】: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
标签: linux disassembly entry-point