我有一个奇怪的 Linux 系统,其中大部分软件都是针对 Glibc 编译的,而其他一些软件则是针对 uClibc 编译的。
因为当我启动和执行时 Linux 是标准发行版,所以从 glibc 调用标准动态链接器(/lib/ld.so.1)。
我正在寻找一种在启动任何可执行文件之前指定动态加载器的方法,因此当我想运行针对 uClibc 编译的软件时,我可以定义启动机制以使用 uClibc 动态加载器(/lib/ld-uClibc.so.0 )。
有任何想法吗?
我正在寻找一种在启动任何可执行文件之前指定动态加载程序的方法,所以当我想运行针对 uClibc 编译的软件时
您应该在构建时uClibc
使用链接器--dynamic-linker
参数指定正确的动态加载器。例如
gcc -nostdlib -Wl,--dynamic-linker=/lib/ld-uClibc.so.0 \
/lib/uClibc-crt1.o main.o -L/path/to/uClibc -lc
只需在调用可执行文件之前输入动态链接器的完整路径,例如:
/home/x20/tools/codescape-2016.05-3-mips-mti-linux-gnu/2016.05-03/sysroot/mipsel-r2-hard/lib64/ld-2.20.so out.gn/mipsel/d8
d8 是我们要执行的二进制文件,ld-2.20.so 是动态链接器
在我看来,好像您需要将 PT_INTERP 设置为指向另一个解释器,该解释器反过来更喜欢您喜欢的 ld.so 设备。请参阅 elf(5) 的手册页。请参阅 readelf 转储您拥有和看到的内容;您正在尝试将 ld-linux-xxx.so.x 更改为您想出的任何内容。
实际上,在我看来,您似乎只想将替代 ld.so 指向 INTERP。