静态库常常需要链接到程序中。
在链接的过程中有三个符号集合: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处执行相应的代码。
阅读(1331) | 评论(0) | 转发(0) |