如何为共享库设置动态链接器路径?

7

我想编译一个带有 .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段放入程序头中。那么我如何使其对共享库也起作用呢?

3个回答

4
如果使用-sharedld不会包含.interp部分,正如@MichaelDillon所说。但是,您可以自己提供这个部分。
const char interp_section[] __attribute__((section(".interp"))) = "/path/to/dynamic/linker";

使用GCC属性,上面的代码将字符串"/path/to/dynamic/linker"保存在.interp部分。

如果你想构建一个既是共享对象又可以独立执行的程序,请查看这个问题。它有一个更全面的描述过程。


2

INTERP 段仅适用于需要在首次加载 ELF 解释器 (ld.so) 的二进制文件中。共享库没有 INTERP 段,因为 ELF 解释器在加载共享库之前已经被加载。


1
这只是默认情况下的说法。你可以通过在@jacwah回复OP中所述的方式添加一个INTERP部分,使共享对象成为可执行文件。例如,glibc共享对象也是一个可执行文件,你可以通过执行readelf -a /lib/x86_64-linux-gnu/libc.so.6 | grep INTERP来查看。 - Jonathan Ben-Avraham

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接