【问题标题】:In Linux stubs are used for standard libraries. Why are stubs required?在 Linux 中,存根用于标准库。为什么需要存根?
【发布时间】:2010-12-08 08:40:49
【问题描述】:

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

【问题讨论】:

    标签: c linux


    【解决方案1】:

    需要存根来确保在不构建目标文件的情况下跨各种 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 中看到一个未定义的符号。 除非我们在上述命令的 lz 之后将 libc 传递给链接器,否则无法解决。

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

    修改链接线:

    gcc -o a 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
    

    【讨论】:

      猜你喜欢
      • 2014-07-07
      • 2021-11-05
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2015-06-07
      相关资源
      最近更新 更多