linux-ELF可执行文件的起点?
作者:互联网
我用anjuta在lubuntu 12.10上编译以下C程序
int main()
{
return 0;
}
文件名是foobar
然后我打开终端并编写命令
ndisasm foobar -b 32 1>asm.txt
(使用32位指令选项反汇编foobar,并将反汇编的结果保存到asm.txt中)
我打开asm.txt
有很多0x0000和容易理解的代码.
在0x00000000上执行指令jg 0x47(0x7F45)在0x00000002上执行dec esp(0x4C)
似乎是ELF文件格式签名.
(因为十六进制代码0x454c46在ascii中为’ELF’)
Linux可能会将此代码加载到内存中,并且不会跳转到0x00000000,因为没有可执行代码.
我在这里有问题.
>我如何知道起始地址?
>哪个代码可以忽略?(也许很多0x0000可以忽略,但是还有什么?)
解决方法:
即使对于像您这样的最简单的程序,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等
标签:entry-point,disassembly,linux 来源: https://codeday.me/bug/20191031/1976067.html