Chinaunix首页 | 论坛 | 博客
  • 博客访问: 187954
  • 博文数量: 40
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 418
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-26 22:37
文章存档

2015年(4)

2014年(27)

2013年(9)

我的朋友

分类: LINUX

2013-11-28 00:54:22

今天看《程序员的自我修养》一书,看到第三章,讲到链接的入口时,讲到几个链接器的特殊符号,怕自己忘记,所以记录如下:
__executable_start:程序的起始地址,不是程序的入口地址(入口地址是main函数啦),代表的是整个函数执行时最开始的地址;
__etext , _etext 以及 etext: 程序代码段的结束地址;
__edata, _edata 以及 edata: 程序代码段的结束地址;
_end 以及 end: 程序结束的地址;

注:所有的地址均为程序被装载时候的虚拟地址。

于是按照事例将这几个地址打印出来,代码如下:

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. extern char __executable_start[];
  3. extern char __etext[], _etext[], etext[];
  4. extern char __edata[], _edata[], edata[];
  5. extern char _end[], end[];

  6. int main(int argc, char *argv[])
  7. {
  8.     printf("Executable start:%x\n", __executable_start);
  9.     printf("Text section end: %x, %x, %x\n", __etext, _etext, etext);
  10.     printf("Data section end: %x, %x, %x\n", __edata, _edata, edata);
  11.     printf("Program exit: %x, %x\n", _end, end);
  12.     
  13.     return 0;
  14. }
由于本机只有cygwin,编译不了,错误如下,感慨手头还是要有一套linux环境才行啊。(在公司环境亲自验证过)

点击(此处)折叠或打开

  1. Administrator@PC-20131104QZTY ~/link_load_lib/chap_3
  2. $ gcc specialsymbol.c -o specialsymbol
  3. /tmp/ccNEfQhW.o:specialsymbol.c:(.text+0x12):对‘__executable_start’未定义的引用
  4. /tmp/ccNEfQhW.o:specialsymbol.c:(.text+0x2e):对‘_etext’未定义的引用
  5. /tmp/ccNEfQhW.o:specialsymbol.c:(.text+0x36):对‘__etext’未定义的引用
  6. /tmp/ccNEfQhW.o:specialsymbol.c:(.text+0x4a):对‘edata’未定义的引用
  7. /tmp/ccNEfQhW.o:specialsymbol.c:(.text+0x52):对‘_edata’未定义的引用
  8. /tmp/ccNEfQhW.o:specialsymbol.c:(.text+0x5a):对‘__edata’未定义的引用
  9. /tmp/ccNEfQhW.o:specialsymbol.c:(.text+0x76):对‘_end’未定义的引用
  10. /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) |
给主人留下些什么吧!~~