linux - 将 uclibc 链接器用于 glibc 编译的二进制文件?

标签 linux shared-libraries ld glibc uclibc

我有一个二进制文件,我需要它才能在使用 uclibc 的嵌入式系统上工作,该二进制文件是针对 glibc 编译的,应该可以吗?

当我尝试运行它时,我收到一条错误消息,指出二进制文件不存在,因此我检查了缺少哪些库。

libc6: /lib/x86_64-linux-gnu/libdl.so.2
libc6: /lib/x86_64-linux-gnu/librt.so.1
libc6: /lib/x86_64-linux-gnu/libm.so.6
libc6: /lib/x86_64-linux-gnu/libc.so.6
libc6: /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
libc6: /lib/x86_64-linux-gnu/libnsl.so.1

我能够将所有这些符号链接(symbolic link)到我系统上的版本(旧版本,但我希望它能正常工作,因为二进制文件不需要这些新版本):

libc6: /lib/x86_64-linux-gnu/libdl.so.2      --------------------- ln -s /lib/libdl-0.9.33.2.so libdl.so.2
libc6: /lib/x86_64-linux-gnu/librt.so.1      --------------------- ln -s /lib/librt-0.9.33.2.so librt.so.1
libc6: /lib/x86_64-linux-gnu/libm.so.6       --------------------- ln -s /lib/libm.so.0 libm.so.6
libc6: /lib/x86_64-linux-gnu/libc.so.6       --------------------- ln -s /lib/libc.so.0 libc.so.6 
libc6: /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 ---------------- 
libc6: /lib/x86_64-linux-gnu/libnsl.so.1     --------------------- ln -s /lib/libnsl-0.9.33.2.so libnsl.so.1

ld-linux-x86-64.so.2 不存在(也不存在我要指向的任何库,例如 ld-2.19.so,它是它在我的主机上指向什么),这是一个特定于 glibc 的链接器吗?我有 /lib/ld64-uClibc.so.0///lib/ld64-uClibc-0.9.33.2.so 但链接到它没有效果(仍然得到No such file or directory), 即使是正确的事情我也需要将 ld-linux-x86-64.so.2 内置到系统中不知何故?

最佳答案

should this work?

没有。

ld-linux-x86-64.so.2 does not exist ... is this a glibc specific linker?

是的:ld-linux 是 GLIBC 的一部分。它的路径被硬编码到二进制文件中(参见 readelf -l a.out 输出)。

do I need to get ld-linux-x86-64.so.2 built into the system somehow?

你有两个选择:

  1. 针对 uClibc 重建您的二进制文件,或者
  2. 安装完整 GLIBC(您不仅需要ld-linux;您还需要libc.so.6libdl.so.2等)

关于linux - 将 uclibc 链接器用于 glibc 编译的二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43866223/

相关文章:

linux - 从两个嵌套程序设置 bash 变量

php - 如何重用一些 Laravel 代码?

c++ - 如何与命令 ld 链接

c - GCC:如何阻止 gcc 为 .o 文件创建随机临时文件名

c++ - 实例化同一类中的多个对象时,代码不会运行,但是实例化具有相同代码的重复类中的对象时,代码会起作用

python - 没有名为组合的模块(来自 import wx.combo) - pyspread

从多线程程序调用 system()

在c中将字符串转换为int

c - LD_PRELOAD 即使在 unsetenv ("LD_PRELOAD"之后也会影响新的 child )

赋予 'use lib' 的 perl 动态路径