今天看《程序员的自我修养》一书,看到第三章,讲到链接的入口时,讲到几个链接器的特殊符号,怕自己忘记,所以记录如下:
__executable_start:程序的起始地址,不是程序的入口地址(入口地址是main函数啦
),代表的是整个函数执行时最开始的地址;
__etext , _etext 以及 etext: 程序代码段的结束地址;
__edata, _edata 以及 edata: 程序代码段的结束地址;
_end 以及 end: 程序结束的地址;
注:所有的地址均为程序被装载时候的虚拟地址。
于是按照事例将这几个地址打印出来,代码如下:
-
#include <stdio.h>
-
-
extern char __executable_start[];
-
extern char __etext[], _etext[], etext[];
-
extern char __edata[], _edata[], edata[];
-
extern char _end[], end[];
-
-
int main(int argc, char *argv[])
-
{
-
printf("Executable start:%x\n", __executable_start);
-
printf("Text section end: %x, %x, %x\n", __etext, _etext, etext);
-
printf("Data section end: %x, %x, %x\n", __edata, _edata, edata);
-
printf("Program exit: %x, %x\n", _end, end);
-
-
return 0;
-
}
由于本机只有cygwin,编译不了,错误如下,感慨手头还是要有一套linux环境才行啊。(在公司环境亲自验证过)
-
Administrator@PC-20131104QZTY ~/link_load_lib/chap_3
-
$ gcc specialsymbol.c -o specialsymbol
-
/tmp/ccNEfQhW.o:specialsymbol.c:(.text+0x12):对‘__executable_start’未定义的引用
-
/tmp/ccNEfQhW.o:specialsymbol.c:(.text+0x2e):对‘_etext’未定义的引用
-
/tmp/ccNEfQhW.o:specialsymbol.c:(.text+0x36):对‘__etext’未定义的引用
-
/tmp/ccNEfQhW.o:specialsymbol.c:(.text+0x4a):对‘edata’未定义的引用
-
/tmp/ccNEfQhW.o:specialsymbol.c:(.text+0x52):对‘_edata’未定义的引用
-
/tmp/ccNEfQhW.o:specialsymbol.c:(.text+0x5a):对‘__edata’未定义的引用
-
/tmp/ccNEfQhW.o:specialsymbol.c:(.text+0x76):对‘_end’未定义的引用
-
/usr/lib/gcc/i686-pc-cygwin/4.8.2/../../../../i686-pc-cygwin/bin/ld: /tmp/ccNEfQhW.o: bad reloc address 0x20 in section `.eh_frame
留下思考,有变量
__etext以及__edata分别标识代码段结束位置和数据段结束位置,那么是否有变量标识代码段起始地址和数据段结束标志?猜测是__stext和__sdata。哈哈不过
联想到前面的文章
http://blog.chinaunix.net/uid-29004880-id-3990770.html中对进程内存布局的介绍,我的理解如下:
__executable_start其实对应的就是
__stext,而因为代码段紧接着数据段之后,所以__etext + 4也就对应着__sdata了。
阅读(3333) | 评论(0) | 转发(0) |