Linux下ELF文件的格式(4) -> 符号
【说明】本文章从本人的CSDN博客搬过来的,因个人感觉CSDN的博客系统太差,so,搬到这里。 这篇主要说明【符号】这一概念。 那么首先从链接开始说起,源文件到可执行文件一般经过4个步骤,预处理,编译,汇编,链接。作为最后一个阶段,链接到底干什么了? 其实前面也说到了,链接就是将多个目标文件,链接成可执行文件。这样就得考虑一件事,假如我在led.c里定义一个变量led1,而我们要在test.c里使用这个变量。 根据前面几篇我们可以知道,led.c和test.c在汇编这一步,会变成led.o和test.o,并且变量led1的运行地址是不存在的,通常为0 。 而程序运行起来,肯定位于真实的地址上【这里的真实也是虚拟地址】,那么就得靠链接器来确定这些变量的真实地址。 同样,我们的外部函数也是需要确定的,通常这些统称为符号。 每一个目标文件都有一个符号表,这个表中记录了目标文件用到的所有符号,每个符号都有一个对应的值,对于变量和函数来讲,这个值就是他们的地址。 除此之外,还有特殊的符号。总的来讲,分为以下几类: 1.定义在本目标文件中的全局符号,可以被其他模块引用。如:function1,main,global_init等 2.定义在其他文件,被本目标引用的符号,也叫外部符号,如:printf等 3.段名,这是由编译器产生的,如.text .data 等,它的值就是该段的起始地址。 4