关于GCC链接检索顺序的几个问题 [英] some questions about search order of GCC linker

查看:21
本文介绍了关于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,下一个要处理的目标文件是链接器能够从中解析printflibprintf.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆