关于GCC链接检索顺序的几个问题 [英] some questions about search order of GCC linker
本文介绍了关于GCC链接检索顺序的几个问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有几个关于GCC链接顺序的问题。GCC说,默认情况下,链接器从左到右搜索符号,不重复搜索。这是我的测试:
main.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("HELLO WROLD
");
return 0;
}
printf.c
#include <stdio.h>
#include <stdlib.h>
int printf(const char *fmt, ...)
{
write(1, "AAA
", 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和.a的顺序没有差异,只有.o和.a的顺序有效。但这与GCC手册页不一致。那为什么呢?
推荐答案
GCC确实从左到右处理目标文件。当您拥有
gcc -o test libprintf.a main.o
GCC看到的第一个对象文件是libprintf.a
。此时输出对象没有未解析的符号,因此不使用/需要libprintf.a
中的任何符号。接下来,main.o
被处理,链接器记下printf
未解析的事实,然后继续处理隐式库,其中它能够解析未解析的printf
符号。
同样,当您有:
gcc -o test main.o libprintf.a
第一个要处理的目标文件是main.o
,其中记录了未解析的符号printf
,下一个要处理的目标文件是链接器能够从中解析printf
的libprintf.a
。当最终处理libc
时,printf
已被解析,因此不使用libc
中的printf
实例。
链接.o文件时:
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
之前。
这篇关于关于GCC链接检索顺序的几个问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文