关于.strtab,.symtab,.shstrtab
.strtab是字符串表(STRING TABLE)
.shstrtab是段表字符串表(Section Header String Table),针对段表
.symtab是符号表,一般是变量、函数
shstrtab及symtab经常引用strtab中的字符串。
ld链接脚本中将会定义很多特殊的符号,这些符号并没有在你的程序中定义,但是你可以直接声明并应用,我们称之为特殊符号。
查看ld的默认链接脚本:
ld -verbose
对于这些特殊符号,我们不必定义它,只需声明引用即可使用。链接器会在将程序最终链接成可执行文件的时候将其解析成正确的值,只有
在使用ld链接生成最终可执行文件的时候这些符号才会存在。
下列地址都是程序被装载时的虚拟地址:
__executable_start,该符号为程序的起始地址,注意,不是入口地址,是程序最开始的地址。
__etext或_etext或etext,该符号为代码段结束地址,即代码段最末尾的地址。
_edata或edata,该符号为数据段结束地址,即数据段最末尾的地址。
_end或end,该符号为程序结束地址。
1 #include <stdio.h>
2
3 extern char __executable_start [];
4 extern char etext[], _etext[], __etext[];
5 extern char edata[], _edata[];
6 extern char end[], _end[];
7
8 int main(void)
9 {
10 printf("Executable Start %p\n", __executable_start);
11 printf("Text End %p %p %p\n", etext, _etext, __etext);
12 printf("Data End %p %p\n", edata, _edata);
13 printf("Executable End %p %p\n", end, _end);
14 return 0;
15 }
输出结果:
Executable Start 0x400000
Text End 0x400656 0x400656 0x400656
Data End 0x601020 0x601020
Executable End 0x601030 0x601030
1 #include <stdio.h>
2
3 extern char __executable_start;
4 extern char etext[], _etext[], __etext[];
5 extern char edata[], _edata[];
6 extern char end[], _end[];
7
8 int main(void)
9 {
10 printf("Executable Start %x\n", __executable_start);
11 printf("Executable Start %p\n", &__executable_start);
12 printf("Text End %p %p %p\n", etext, _etext, __etext);
13 printf("Data End %p %p\n", edata, _edata);
14 printf("Executable End %p %p\n", end, _end);
15 return 0;
16 }
输出结果:
Executable Start 7f
Executable Start 0x400000
Text End 0x400676 0x400676 0x400676
Data End 0x601020 0x601020
Executable End 0x601030 0x601030