构建gcc/glibc时如何指定默认的动态链接器名称?

问题描述 投票:0回答:1

我想为目标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)

linux gcc glibc toolchain
1个回答
0
投票

我想为目标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
的符号链接。

© www.soinside.com 2019 - 2024. All rights reserved.