我想为目标ARM系统编译一个程序,该系统的程序使用
/lib/ld-linux.so.3
作为动态链接器路径,但我的工具链使用/lib/ld-linux-armhf.so.3
。即使我使用命令编译我的程序:
arm-linux-gnueabihf-gcc -std=c17 -Wall -pipe -O3 -flto -s prog.c -Wl,-dynamic-linker,/lib/ld-linux.so.3 -Wl,--build-id=none -lcrypto -lcurl -ljson-c -ldl -o prog
它仍然链接默认链接器:
[root@archlinux d]# readelf -dW prog
Dynamic section at offset 0x1ef0 contains 30 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libcrypto.so.1.1]
0x00000001 (NEEDED) Shared library: [libcurl.so.4]
0x00000001 (NEEDED) Shared library: [libjson-c.so.2]
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x00000001 (NEEDED) Shared library: [ld-linux-armhf.so.3]
0x0000000c (INIT) 0x9d8
0x0000000d (FINI) 0x1740
0x00000019 (INIT_ARRAY) 0x2ee8
0x0000001b (INIT_ARRAYSZ) 4 (bytes)
0x0000001a (FINI_ARRAY) 0x2eec
0x0000001c (FINI_ARRAYSZ) 4 (bytes)
0x6ffffef5 (GNU_HASH) 0x188
0x00000005 (STRTAB) 0x500
0x00000006 (SYMTAB) 0x1d0
0x0000000a (STRSZ) 666 (bytes)
0x0000000b (SYMENT) 16 (bytes)
0x00000015 (DEBUG) 0x0
0x00000003 (PLTGOT) 0x3000
0x00000002 (PLTRELSZ) 288 (bytes)
0x00000014 (PLTREL) REL
0x00000017 (JMPREL) 0x8b8
0x00000011 (REL) 0x860
0x00000012 (RELSZ) 88 (bytes)
0x00000013 (RELENT) 8 (bytes)
0x6ffffffb (FLAGS_1) Flags: PIE
0x6ffffffe (VERNEED) 0x800
0x6fffffff (VERNEEDNUM) 3
0x6ffffff0 (VERSYM) 0x79a
0x6ffffffa (RELCOUNT) 6
0x00000000 (NULL) 0x0
在构建 glibc/gcc 时,是否有任何配置选项可以将默认动态链接器更改为
ld-linux.so.3
?或者有任何编译选项来指定程序的动态加载器? (P.S. 在目标系统上,程序使用 libld.so.2 而不是 ld-linux*.so.3)
我想为目标ARM系统编译一个程序,该系统的程序使用
作为动态链接器路径,但我的工具链使用/lib/ld-linux.so.3
。/lib/ld-linux-armhf.so.3
您可以使用链接命令上的
-Wl,--dynamic-linker=/lib/ld-linux.so.3
指定动态加载程序。
更简单的解决方案可能是在目标系统上创建符号链接:
ln -sf /lib/ld-linux.so.3 /lib/ld-linux-armhf.so.3
此外,您还应该在安装目标系统时查找错误 - 据我了解,正确安装的系统应该已经拥有这两个文件,其中
ld-linux.so.3
是指向 ld-linux-armhf.so.3
的符号链接。