这是我的系统:

# 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]
...

现在我有了这些文件:
食物:
void foo();

食品c:
#include <stdio.h>
void foo(){
    printf("Hello World\n");
}

主要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生成noRPATH。编辑:同样,您在ld.so手册页(如LD_LIBRARY_PATH)中看到的那些环境变量没有设置。
为什么会这样?一个有趣的注意事项是,在一个红帽系统(CentOS 6)上,一切都按预期运行(我必须执行ldconfig来重新加载缓存)

最佳答案

ldconfig上的Linux man page不清楚缓存的真正意图,因此我引用BSD manpage(强调我的意图):
ldconfig实用程序用于准备一组供动态链接器使用的“提示”,以便快速查找多个目录中可用的共享库。它扫描一组内置的系统目录和在命令行上指定的任何目录(按给定顺序)以查找共享库,并将结果存储在系统文件中,以防止动态链接器加载所需共享的目录搜索操作所产生的开销图书馆。
不需要运行ldconfig。它只会加快速度。运行时链接器知道它需要在/usr/lib中查找,但它实际上只在无法在其缓存中找到lib之后才执行此操作。

关于linux - SUSE Linux上的gcc编译程序不需要ld.so.cache更新吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20187990/

10-09 01:22