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

时间:2010-12-20 10:54:51

标签: gcc linker shared-libraries elf ld

我想用.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 个答案:

答案 0 :(得分:2)

如果使用ld

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

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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