Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1436842
  • 博文数量: 209
  • 博客积分: 464
  • 博客等级: 下士
  • 技术积分: 3772
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-24 18:25
个人简介

阿弥陀佛

文章分类

全部博文(209)

文章存档

2019年(3)

2018年(5)

2017年(6)

2016年(10)

2015年(9)

2014年(73)

2013年(90)

2012年(13)

分类: 服务器与存储

2014-10-22 15:27:12

静态库常常需要链接到程序中。
在链接的过程中有三个符号集合:E,U,D
E:该集合中的文件会被合并起来形成可执行文件。
U:表示未定义的符号集合。
D:表示已定义的符号集合。
该算法有一个问题:
利用gcc来链接程序时,
unix> gcc -static  linkerror.a linkerror.c
/tmp/ccSz5uti.o: In function ‘main’:
/tmp/ccSz5uti.o(.text+0x7): undefined reference to ‘foo’
collect2: ld returned 1 exit status

在处理linkerror.a的时候由于U为空,所以不会有内容加进符号表中。而分析输入文件linkerror.c的时候,会根据该文件的引用向U和E中添加很多的元素。所以导致会出现函数未定义的情况。可见,链接时的先后顺序也非常重要。

这也就是为什么要把想要加入的lib库放入到编译参数的最后的原因了。
在shell中执行一个程序时,shell先fork一个子进程,调用execve启动加载器,将该进程的虚拟存储器都清空成0,然后将可自执行文件的数据段和bss,text等段加载进内存,然后地址跳转到__startup处执行相应的代码。


阅读(866) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~