为什么libc_nonshared.a存在?它的目的是什么?我一直无法在网上找到关于它存在的好答案。
据我可以告诉它提供了某些符号(stat,lstat,fstat,atexit,等等)。如果有人在他们的代码中使用这些函数之一,它将被链接到这个存档中的最终可执行文件。这些函数是 POSIX 标准的一部分并且非常常见,所以我不明白为什么它们不会分别放在 shared 或 staticlibc.so.6或 中libc.a。
这可能只是我迁移到的构建系统的一个问题,但我将在两个系统中包含差异以及我是如何遇到问题的.
我的旧构建系统是SLES 10机器.gcc/cpp/g ++版本是4.1.0
我的新系统在SLES 11 SP4上,gcc/cpp/g ++版本是4.3.4.
我正在建立一个共享库; 建立和连接新系统的工作正常.但是,在新系统的加载时,我得到以下内容:
error ./mysharedlib.so: undefined symbol: stat
Run Code Online (Sandbox Code Playgroud)
由于stat()函数包含在/usr/include/sys/stat.h中,因此我查看了两个系统上的glibc.旧:
# rpm -q -f /usr/include/sys/stat.h
glibc-devel-2.4-31.2
Run Code Online (Sandbox Code Playgroud)
新的:
# rpm -q -f /usr/include/sys/stat.h
glibc-devel-2.11.3-17.95.2
Run Code Online (Sandbox Code Playgroud)
我还查看了旧系统上与stat()相关的objdump输出:
# objdump -T mysharedlib.so | grep stat
0000000000000000 D *UND* 0000000000000000 __xstat
# objdump -x mysharedlib.so | grep stat
00000000000e3f8a l F .text 0000000000000024 stat
0000000000000000 *UND* 0000000000000000 __xstat
Run Code Online (Sandbox Code Playgroud)
而新系统:
# objdump -T mysharedlib.so | grep stat
0000000000000000 D *UND* 0000000000000000 stat
0000000000000000 D *UND* 0000000000000000 lstat
# …Run Code Online (Sandbox Code Playgroud)