系统相关
首页 > 系统相关> > linux-ELF可执行文件的起点?

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 HowtoX86 calling conventionsthis questionthe X86-64 ABIthese notes on X86-64 programming

标签:entry-point,disassembly,linux
来源: https://codeday.me/bug/20191031/1976067.html