Content #
当我们使用ld作为链接器来链接生产可执行文件时,它会为我们定义很多特殊的符号,这些符号并没有在你的程序中定义,但是你可以直接声明并且引用它,我们称之为特殊符号。其实这些符号是被定义在ld链接器的链接脚本中的。你无须定义它们,但可以声明它们并且使用。链接器会在将程序最终链接成可执行文件的时候将其解析成正确的值,注意,只有使用ld链接生产最终可执行文件的时候这些符号才会存在。几个很具有代表性的特殊符号如下。
- __executable_start 该符号为程序起始地址,注意,不是入口地址,是程序的最开始的地址。
- __etext或_etext或etext 该符号为代码段结束地址,即代码段最末尾的地址。
- _edata或edata 该符号为数据段结束地址,即数据段最末尾的地址。
- _end或end 该符号为程序结束地址。
以上地址都为程序被装载时的虚拟地址。我们可以在程序中直接使用这些符号:
/*
* SpecialSymbol.c
*/
#include <stdio.h>
extern char __executable_start[];
extern char etext[], _etext[], __etext[];
extern char edata[], _edata[];
extern char end[], _end[];
int main()
{
printf("Executable Start %X\n", __executable_start);
printf("Text End %X %X %X\n", etext, _etext, __etext);
printf("Data End %X %X\n", edata, _edata);
printf("Executable End %X %X\n", end, _end);
return 0;
}
$ gcc SpecialSymbol.c –o SpecialSymbol
From #
程序员的自我修养