《程序员的自我修养》第三章 目标文件里有什么

在PC端的可执行文件,主要是linux下的ELF(Executable Linkable Format)文件和windows下的PE文件。

一般c语言执行代码都保存在.text段上,已经初始化的全局变量或者局部静态变量保存在.data段上。未初始化的全局变量和局部静态变量保存在.bss段上。.rodata代码段存放的是只读数据。

ELF结构:头文件(ELF文件的描述信息),段表(描述了每个段的基本信息),重定位表,字符串表。

链接的本质是把不同的目标文件之间相互粘合在一起。目标文件的相互拼合实际上是对地址的引用。

强符号和弱符号:对于c/c++来说,编译器默认的函数和初始化的全局变量为强符号,未初始化的全局变量为弱符号。链接器会按照下面的方式选择强符号和弱符号:如果一个符号在其他文件中是弱符号,在某个文件中时强符号,则是强符号;强符号不能够被多次定义;如果一个符号在所有文件中都是弱符号,则选择占空间最大的一个。

强引用和弱引用:未被定义的弱引用,链接器不认为它是一个错误,而是会将其值设置为0或者某个特殊值。在gcc中,我们在函数前面添加 __attribute__ ((weakref))  关键字,将改函数声明为弱引用。如果该函数只有函数签名没有函数体,并且前面被声明了该关键字__attribute__((weakref)),改函数在编译和链接的时候编译器不会报错,但是在调用时会报地址访问错误的错。

弱引用和弱符号对用户来说十分有用。比如库中的弱引用或者弱符号能够被用户定义的强引用或者强符号覆盖。这样方便程序的裁剪和组合。

猜你喜欢

转载自blog.csdn.net/eriHanami/article/details/82844165