这是我的系统:
# 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
重新加载缓存)
答案 0 :(得分:1)
关于ldconfig的Linux man page目前还不清楚缓存的真实意图,所以我引用BSD manpage(强调我的):
ldconfig实用程序用于准备一组“提示”,供动态链接器使用,以便快速查找多个目录中可用的共享库。它扫描一组内置系统目录和命令行上指定的任何目录(按给定顺序),查找共享库并将结果存储在系统文件中,以防止由于目录搜索操作而导致的开销。动态链接器必须执行才能加载所需的共享库。
不需要运行ldconfig。它只能加快速度。运行时链接器知道它需要查看/usr/lib
,但它实际上只会在它无法在其缓存中找到lib之后执行此操作。