Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在Linux中,存根用于标准库。为什么需要存根?_C_Linux - Fatal编程技术网

C 在Linux中,存根用于标准库。为什么需要存根?

C 在Linux中,存根用于标准库。为什么需要存根?,c,linux,C,Linux,在Linux中,为什么标准库需要存根?需要存根,以确保在各种Linux版本之间正确链接可执行文件,而无需构建目标文件 例如: 让a成为我们正在构建的可执行文件: gcc -o a test.o test1.o test2.o -lz 在上述情况下,可执行文件a依赖于libz.so(-lz将与libz.so链接)。链接器使用LD_LIBRARY_路径解析libz.so 现在让我们看看问题: In RHEL4(Linux Zseries): objdump -T /usr/lib64/libz.s

在Linux中,为什么标准库需要存根?

需要存根,以确保在各种Linux版本之间正确链接可执行文件,而无需构建目标文件

例如: 让a成为我们正在构建的可执行文件:

gcc -o a test.o test1.o test2.o -lz
在上述情况下,可执行文件a依赖于libz.so(
-lz
将与libz.so链接)。链接器使用LD_LIBRARY_路径解析libz.so

现在让我们看看问题:

In RHEL4(Linux Zseries):
objdump -T /usr/lib64/libz.so.1 | grep stack_chk 

In RHEL5(Linux ZSeries);
objdump -T /usr/lib64/libz.so.1 | grep stack_chk

0000000000000000 DF UND 0000000000000031 GLIBC_2.4 __stack_chk_fail 
在RHEL5中,我们在libz.so中看到一个未定义的符号。 除非在上面的命令中将libc传递给lz之后的链接器,否则无法解决此问题

存根: 如果我们为libz.so生成存根,将libz.so的所有符号打包到存根库中,并链接到存根库而不是真正的库,我们不会看到任何错误:

修改链接行:

gcc -o a test.o test1.o test2.o -L/home/lib/stubs/ -lz
在/home/lib/stubs目录中,我们有一个libz.so的存根库,名为libzstub.so

链接器对link命令中给定的路径的优先级高于LD_LIBRARY_path

现在,即使我们在RHEL5版本中进行链接,链接器也会从/home/lib/stubs目录解析libz.so的符号

这里是我使用的盒子的配置细节

Loader负责在运行时加载响应函数

RHEL5:

libcmpiutil-0.4-2.el5
glibc-utils-2.5-42
libc-client-2004g-2.2.1
libcap-1.10-26
libcap-1.10-26
libchewing-devel-0.3.0-8.el5
libchewing-0.3.0-8.el5
libcxgb3-1.2.3-1.el5
libcap-devel-1.10-26
glibc-common-2.5-42
libcxgb3-static-1.2.3-1.el5
libcroco-devel-0.6.1-2.1
compat-glibc-headers-2.3.4-2.26
libcroco-0.6.1-2.1
compat-libcom_err-1.0-7
libcmpiutil-devel-0.4-2.el5
compat-glibc-2.3.4-2.26
glibc-headers-2.5-42
glibc-devel-2.5-42
libcap-devel-1.10-26
libc-client-2004g-2.2.1
libcmpiutil-0.4-2.el5
libcroco-0.6.1-2.1
libc-client-devel-2004g-2.2.1
glibc-2.5-42
libchewing-devel-0.3.0-8.el5
libcroco-devel-0.6.1-2.1
compat-libcom_err-1.0-7
libc-client-devel-2004g-2.2.1
libchewing-0.3.0-8.el5
libcxgb3-1.2.3-1.el5
libcmpiutil-devel-0.4-2.el5
glibc-2.5-42
glibc-devel-2.5-42
compat-glibc-2.3.4-2.26
RHEL4:

rpm -qa | grep libc
glibc-2.3.4-2.41
libcxgb3-1.1.4-1.el4
libc-client-2002e-14
libcroco-0.6.0-4
libcap-devel-1.10-20
glibc-kernheaders-2.4-9.1.103.EL
compat-libcom_err-1.0-5
glibc-devel-2.3.4-2.41
compat-glibc-2.3.2-95.30
compat-libcom_err-1.0-5
glibc-common-2.3.4-2.41
libcroco-devel-0.6.0-4
libcxgb3-1.1.4-1.el4
libc-client-2002e-14
glibc-utils-2.3.4-2.41
libcap-1.10-20
glibc-headers-2.3.4-2.41
glibc-profile-2.3.4-2.41
libcxgb3-static-1.1.4-1.el4
glibc-devel-2.3.4-2.41
compat-glibc-2.3.2-95.30