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

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

需要存根来确保跨各种linux版本的可执行文件的正确链接,而无需构建目标文件。

例如:让我们正在建立的可执行文件:

gcc -oa test.o test1.o test2.o -lz 

在上面的情况下,可执行文件a依赖于libz.so( -lz是与libz.so链接)。 链接器使用LD_LIBRARY_PATH解析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中看到一个未定义的符号。 除非我们在上面的命令中将lc传递给lz之后的连接器,否则不能解决。

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

修改的链接线:

 gcc -oa test.o test1.o test2.o -L/home/lib/stubs/ -lz 

在/ home / lib / stubs目录中,我们有一个名为libzstub.so的libz.so的存根库。

链接器给予链接命令中给定的路径比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