我想用.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段。如何让它也适用于共享库?
答案 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