SUSE Linux 上的 gcc 编译程序不需要 ld.so.cache 更新吗?



这是我的系统:

# cat /etc/SuSE-release
openSUSE 11.4 (i586)
VERSION = 11.4
CODENAME = Celadon
# uname -r
2.6.37.1-1.2-default
# gcc --version
gcc (SUSE Linux) 4.5.1 20101208 [gcc-4_5-branch revision 167585]
...

现在我有这些文件:

foo.h:

void foo();

foo.c:

#include <stdio.h>
void foo(){
    printf("Hello Worldn");
}

main.c:

#include <foo.h>
int main(){
    foo();
    return 0;
}

我做以下事情:

# gcc -c -fpic foo.c
# gcc -shared -o libfoo.so foo.o

然后,我将foo.h复制到/usr/include,将libfoo.so复制到/lib(注意,没有运行ldconfig),然后使用:进行编译

# gcc -o test main.c -l foo

问题是:

不运行ldconfig,意味着ld.so.cache没有libfoo.so。然而,# ./test运行得很好(!?)。不知怎的,ld知道并自动加载了我的库。这是ldd:的输出

# ldd test
linux-gate.so.1 =>  (0xffffe000)
libfoo.so => /lib/libfoo.so (0xb77d1000)
libc.so.6 => /lib/libc.so.6 (0xb7668000)
/lib/ld-linux.so.2 (0xb77e1000)

我环顾四周,已经排除了RPATH在这里工作的可能性。(运行readelf -d test不会产生RPATH。EDIT:此外,您在ld.so手册页中看到的那些环境变量(如LD_LIBRARY_PATH)也没有设置。

为什么会发生这种情况?一个有趣的注意事项是,在Red Hat系统(CentOS 6)上,一切都按预期运行(我必须执行ldconfig来重新加载缓存)

ldconfig上的Linux手册页不清楚缓存的真正意图,所以我引用了BSD手册页(重点是我的):

ldconfig实用程序用于准备一组"提示"供动态链接器使用,以便于快速查找多个目录中可用的共享库。它扫描一组内置系统目录和命令行上指定的任何目录(按给定顺序),寻找共享库,并将结果存储在系统文件中,以避免动态链接器加载所需共享库时必须执行的目录搜索操作所带来的开销。

不需要运行ldconfig。这只是为了加快速度。运行时链接器知道它需要在/usr/lib中查找,但实际上只有在无法在其缓存中定位lib之后才会这样做。

最新更新