大佬教程收集整理的这篇文章主要介绍了linux – 关于GCC链接器搜索顺序的一些问题,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_22_19@main.c中
#include <stdio.h> #include <stdlib.h> int main() { printf("HelLO WROLD\n"); return 0; }
printf.c
#include <stdio.h> #include <stdlib.h> int printf(const char *fmt,...) { write(1,"AAA\n",4); } [root@lenovo TESTCode]# gcc -c -fno-builTin-printf *.c [root@lenovo TESTCode]# gcc -o test main.o printf.o [root@lenovo TESTCode]# ./test AAA [root@lenovo TESTCode]# gcc -o test printf.o main.o [root@lenovo TESTCode]# ./test AAA [root@lenovo TESTCode]# ar rcs libprintf.a printf.o [root@lenovo TESTCode]# gcc -o test libprintf.a main.o [root@lenovo TESTCode]# ./test HelLO WROLD [root@lenovo TESTCode]# gcc -o test main.o libprintf.a [root@lenovo TESTCode]# ./test AAA [root@lenovo TESTCode]# gcc -shared -o libprintf.so printf.o [root@lenovo TESTCode]# gcc -o test libprintf.so main.o [root@lenovo TESTCode]# export LD_LIBRARY_PATH=. [root@lenovo TESTCode]# ./test AAA [root@lenovo TESTCode]# gcc -o test main.o libprintf.so [root@lenovo TESTCode]# ./test AAA
从结果中,我们可以看到.o和.o,.o和.so的顺序没有区别,只有.o和.a的顺序才有效.但这与gcc手册页不一致.所以为什么?
gcc -o test libprintf.a main.o
gcc看到的第一个目标文件是libprintf.a.此时输出对象没有未解析的符号,因此使用/需要libprintf.a中的任何内容.接下来,处理main.o,链接器记录了printf未解析的事实,然后继续处理隐式库,它可以解析main.o中未解析的printf符号.
同样,当你有:
gcc -o test main.o libprintf.a
要处理的第一个目标文件是main.o,其中记录了未解析的符号printf,下一个要处理的目标文件是libprintf.a,链接器可以从中解析printf.最终处理libc时,printf已经解析,因此不使用libc中的printf实例.
gcc -o test main.o printf.o
再次将libc库视为在命令行末尾指定,因此printf符号从定义它的第一个(从左到右)目标文件中解析.
对于这两个libprintf.so情况,libc库再次被视为在命令行末尾指定了它.与静态库情况的不同之处在于* .so库的从左到右排序决定了运行时动态符号搜索顺序.由于此命令在隐式libc.so之前具有libprintf.so,因此使用libprintf.so中的printf版本.
gcc -o test libprintf.so main.o gcc -o test main.o libprintf.so
作为额外的实验,您可以尝试:
gcc -o test main.o -lc libprintf.so
这应该显示从libc.so而不是libprintf.so使用的printf的版本,因为-lc以从左到右的顺序出现在libprintf.so之前.
以上是大佬教程为你收集整理的linux – 关于GCC链接器搜索顺序的一些问题全部内容,希望文章能够帮你解决linux – 关于GCC链接器搜索顺序的一些问题所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。