【问题标题】:How to set the dynamic linker path for a shared library?如何为共享库设置动态链接器路径?
【发布时间】:2011-05-28 04:46:27
【问题描述】:

我想编译一个带有.interp 段的共享库。

#include <stdio.h>

int foo(int argc, char** argv) {

    printf("Hello, world!\n");
    return 0;

}

我正在使用以下命令。

gcc -c -o test.o test.c
ld --dynamic-linker=blah -shared -o test.so test.o

我最终没有 INTERP 段,就好像我从未通过 --dynamic-linker=blah 选项一样。请与readelf -l test.so 联系。构建可执行文件时,链接器会正确处理选项并将 INTERP 段放入程序头中。如何让它也适用于共享库?

【问题讨论】:

    标签: gcc linker shared-libraries elf ld


    【解决方案1】:

    ld 如果使用-shared,则不包含 .interp 部分,正如@MichaelDillon 已经说过的那样。但是,您可以自己提供此部分。

    const char interp_section[] __attribute__((section(".interp"))) = "/path/to/dynamic/linker";
    

    上面的行将使用GCC attributes将字符串“/path/to/dynamic/linker”保存在.interp部分中。

    如果您正在尝试构建一个自身也可执行的共享对象,请检查this question。它对过程有更全面的描述。

    【讨论】:

      【解决方案2】:

      INTERP 段只进入需要首先加载 ELF 解释器 (ld.so) 的二进制文件。共享库没有 INTERP 段,因为在加载共享库之前已经加载了 ELF 解释器。

      【讨论】:

      • 这只是默认的。正如@jacwah 在他对 OP 的回复中所写的那样,您可以通过添加一个 INTERP 部分来使共享对象自行执行。例如,glibc 共享对象也是一个可执行文件,您可以通过 readelf -a /lib/x86_64-linux-gnu/libc.so.6 | grep INTERP 看到。
      【解决方案3】:

      在大多数 linux 系统中,ldconfig 在每次系统启动时运行,它会在 /etc/ld.so.conf 中查找定义以查找具有共享库的目录。在文件 /etc/ld.so.cache 中有共享库 sonames 和库完整路径的映射。考虑阅读这篇文章:http://grahamwideman.wordpress.com/2009/02/09/the-linux-loader-and-how-it-finds-libraries/#comment-164

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多