阅读记录——ELF

《C语言编程透视》 http://tinylab.gitbooks.io/cbook
好书推荐一下,不仅内容实在,更值得学习的是作者在探索问题深度和方法

ELF文件结构

文件头(说明文件的类型、大小、运行平台、节区数目)
程序头表(段表,描述可执行文件和共享库)
节区头表(用于链接可重定位文件成可执行文件或者共享库)
 
查看方法 readelf -h or -l or -S
  • 对于可重定位文件,程序头是可选的,会包含这些基本节区 .text ,.rel.text , .data , .bss , .rodata , .comment , .note.GNU-stack ,.shstrtab , .symtab 和 .strtab 。 查看各个节区内容
    readelf -x 节区名 file.o
  • 对于可执行文件和共享库文件( 动态链接库) ,节区表则是可选的
3种类型的ELF

1、可重定位文件
2、执行文件
3、动态链接库
 
readelf -h file | grep Type
  • 可重定位文件本身不可以运行,仅仅是作为可执行文件、静态链接库( 也是可重定位文件) 、动态链接库的 “组件”。
  • 静态链接库和动态链接库(可以编译为可执行的)本身也不可以执行,作为可执行文件的“组件”,它们两者也不同,前者也是可重定位文件( 只不过可能是多个可重定位文件的集合) ,并且在链接时加入到可执行文件中去。
  • 而动态链接库在链接时,库文件本身并没有添加到可执行文件中,只是在可执行文件中加入了该库的名字等信息,以便在可执行文件运行过程中引用库中的函数时由动态链接器去查找相关函数的地址,并调用它们。动态链接库本身也具有可重定位的特征,含有可重定位的信息
链接

  • 重定位是将符号引用与符号定义进行链接的过程。
  • 链接是处理可重定位文件,把它们的各种符号引用和符号定义转换为可执行文件中的合适信息( 一般是虚拟内存地址) 的过程。
  • 链接又分为静态链接和动态链接,前者是程序开发阶段程序员用 ld (gcc 实际上在后台调用了 ld ) 静态链接器手动链接的过程,而动态链接则是程序运行期间系统调用动态链接器(ld-linux.so ) 自动链接的过程。

你可能感兴趣的:(阅读记录——ELF)