6

我想用一个.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 段放入程序头中。如何让它也适用于共享库?

4

3 回答 3

3

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

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

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

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

于 2015-07-21T23:44:58.020 回答
1

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

于 2011-07-14T06:26:15.930 回答
0

在大多数 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

于 2012-04-13T04:28:15.337 回答