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

时间:2013-11-25 08:40:29

标签: linux gcc shared-libraries

这是我的系统:

# 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 World\n");
}

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知道并自动加载我的lib。这是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。编辑:此外,您在ld.so手册页(例如LD_LIBRARY_PATH)中看到的那些环境变量未设置。

为什么会这样?一个有趣的说明是,在Red Hat系统(CentOS 6)上,所有内容都按预期运行(我必须执行ldconfig重新加载缓存)

1 个答案:

答案 0 :(得分:1)

关于ldconfig的Linux man page目前还不清楚缓存的真实意图,所以我引用BSD manpage(强调我的):

  

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

不需要运行ldconfig。它只能加快速度。运行时链接器知道它需要查看/usr/lib,但它实际上只会在它无法在其缓存中找到lib之后执行此操作。

相关问题