编译链接的过程,ELF文件格式

![][build-png]

[build-png]: /imgs/gcc-build-process-1.png “生成可执行程序的过程” { width=100%}

生成可执行程序的过程 1

  • C代码(.c)经过编译器预处理生成中间代码(图中未显示),然后编译成汇编代码(.asm)
  • 汇编代码(.asm)经过 汇编器,生成目标文件(.o)
  • 目标文件(.o) 经过链接器,链接成可执行文件(.out)
  • OS将可执行文件加载到内存里执行.

其中,.o文件 和 可执行文件,都是目标文件,Linux上面目标文件格式是 Elf,window上面是PE格式

ELF格式的目标文件种类1,2

  • 可重定位(relocatable)文件,保存着代码和适当的数据,用来和其它的object文件一起来创建一个可执行文件或者是一个共享文件(主要是.o文件)
  • 可执行(executable)文件,保存着一个用来执行的程序,该文件指出了exec(BA_OS)如何来创建程序进程映象(操作系统怎么样把可执行文件加载起来并且从哪里开始执行)
  • 一个共享文件(如Linux中的.so,.dso文件)即动态链接库,保存着代码和合适的数据,链接方式有两种,静态链接(装载时连接),动态链接(程序运行时连接)

动态链接库的这两种使用方式

gdb跟踪execve系统调用 — 可执行程序的装载过程

设置断点

 b sys_execve
 b load_elf_binary
 b start_thread

从哪里开始执行的