在SUSE Linux上编译的gcc程序不';是否需要ld.so.cache更新?

在SUSE Linux上编译的gcc程序不';是否需要ld.so.cache更新?,linux,gcc,shared-libraries,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: #includ

这是我的系统:

# 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");
}
然后我将
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
。编辑:另外,您在
ld中看到的那些环境变量。因此
手册页(如
ld\u LIBRARY\u PATH
)没有设置

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

在ldconfig上的配置不清楚缓存的真正意图,因此我引用(我的重点):

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


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

我目前没有任何BSD系统,因此我无法确定是否存在问题,但在Red Hat系统上,缓存中缺少库(即使库仍在
/lib
/usr/lib
中)仍将导致找不到库。此外,我在同一SuSE系统上的另一个二进制文件(二进制文件
/usr/bin/ssh
libz
中尝试了这一点,并且行为与预期的一样(每次添加内容时都需要重新加载缓存)。
# gcc -o test main.c -l foo
# 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)