gpt4 book ai didi

c - 在 Linux 中, stub 用于标准库。为什么需要 stub ?

转载 作者:IT王子 更新时间:2023-10-29 00:06:15 27 4
gpt4 key购买 nike

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

最佳答案

需要 stub 以确保在不构建目标文件的情况下跨各种 linux 版本正确链接可执行文件。

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

gcc -o a 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 中看到一个 undefined symbol 。除非我们在上述命令中的 lz 之后将 libc 传递给链接器,否则无法解决此问题。

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

修改链接行:

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

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

链接器比 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

关于c - 在 Linux 中, stub 用于标准库。为什么需要 stub ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4385555/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com