如何在 64 位 Fedora 17 上运行 32 位程序?

max*_*zig 10 fedora 64bit 32bit android

尽管 Android 开发工具 (ADT) 捆绑包可用作“Linux 64 位”的 zip 包,但它声明了以下要求

64 位发行版必须能够运行 32 位应用程序。

事实上,只是在运行在Fedora 17 64位系统导致错误的包装日食,因为它无法“找到”几个开发工具,例如adbaapt

执行 aapt 时出错:无法运行程序“/home/juser/local/adt-bundle-linux/sdk/platform-tools/aapt”:错误=2,没有那个文件或目录:错误=2,没有那个文件或目录

“没有这样的文件”具有误导性,因为它在那里(在 $HOME/local 下):

adt-bundle-linux/sdk/platform-tools/aapt
Run Code Online (Sandbox Code Playgroud)

但是我不能在shell上执行它:

~/local $ ./adt-bundle-linux/sdk/platform-tools/aapt 
zsh: no such file or directory: ./adt-bundle-linux/sdk/platform-tools/aapt
Run Code Online (Sandbox Code Playgroud)

看着文件

$ file adt-bundle-linux/sdk/platform-tools/aapt
adt-bundle-linux/sdk/platform-tools/aapt: ELF 32-bit LSB executable, Intel 80386,
 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8,
 not stripped
Run Code Online (Sandbox Code Playgroud)

我们看到它是一个 32 位的二进制文件。而且我的系统(目前)似乎无法运行 32 位应用程序。

我该如何改变?如何使当前的 Fedora 64 位系统能够运行 32 位应用程序?

(当然也有人会问为什么有人最终将 32 位二进制文​​件放入一个名为“Linux 64 位”的二进制包中......)

gol*_*cks 9

关于eclipse无法找到adb等,这是因为没有在系统上运行它们所需的32位共享库,它们是不可执行的。

对于 32 位库,情况相当简单:您只需要安装适当的 32 位库。在我这里的 64 位 fedora 17 安装中,主要的 64 位库位于 /usr/lib64 中,可选的 32 位库位于 /usr/lib 中。所以,如果我调用lddsdk/platform-tools/adb:

linux-gate.so.1 =>  (0xf7791000)
librt.so.1 => /lib/librt.so.1 (0xf776c000)
libncurses.so.5 => /lib/libncurses.so.5 (0xf7747000)
libpthread.so.0 => /lib/libpthread.so.0 (0xf772d000)
libstdc++.so.6 => /lib/libstdc++.so.6 (0xf7644000)
libm.so.6 => /lib/libm.so.6 (0xf7618000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xf75fb000)
libc.so.6 => /lib/libc.so.6 (0xf7449000)
/lib/ld-linux.so.2 (0xf7792000)
libdl.so.2 => /lib/libdl.so.2 (0xf7444000)
libtinfo.so.5 => /lib/libtinfo.so.5 (0xf7424000)
Run Code Online (Sandbox Code Playgroud)

请注意,这些都在 /lib 中,它是 /usr/lib(不是 /usr/lib64)的符号链接。看:

»file /lib/libc.so.6
/lib/libc.so.6: symbolic link to `libc-2.15.so'
»file /lib/libc-2.15.so
/lib/libc-2.15.so: ELF 32-bit LSB shared object [...]
Run Code Online (Sandbox Code Playgroud)

一个 32 位标准 C 库。您可以做的是通过 32 位 sdk 工具并检查它们与ldd. 我手头没有示例,但如果缺少某些内容,请ldd报告如下内容:

libc.so.6 => ??????
Run Code Online (Sandbox Code Playgroud)

首先,为了使 ldd 工作,您将需要 32 位 glibc 附带的 32 位加载程序(没有这个,ldd 将称其为不可执行的文件并且什么也不告诉您):

»yum search glibc
glibc.i686 : The GNU libc libraries
glibc.x86_64 : The GNU libc libraries
Run Code Online (Sandbox Code Playgroud)

这被截断了,但是 x86_64 包是你已经拥有的;i686 是 32 位版本。所以只需安装它。

您不需要任何“开发”包,因为没有编译。除此之外,有根据的猜测和yum whatprovides/yum search应该会有所帮助(查看 adb 列表,还有 32 位版本的 C++ lib、ncurses、pthreads 和一些我不知道的东西)。

关于使用的快速提示whatprovides

»yum whatprovides libtinfo
No matches found.
»yum whatprovides libtinfo.so.5
[2 matches]
»yum whatprovides "*/libtinfo.so.5"
[4 matches]
Run Code Online (Sandbox Code Playgroud)

;)

  • 模拟器是 32 位程序和模拟平台具有 32 位处理器之间没有关系。Android 模拟器实际上是基于 Qemu 的,它可以模拟 armv7(32 位)、armv8(64 位)、x86、amd64、mips、mips64 等中的任何一种,而不管主机架构如何。 (2认同)

max*_*zig 9

您必须安装 32 位 glibc:

# yum install glibc.i686
Run Code Online (Sandbox Code Playgroud)

这消除了尝试执行 32 位二进制文​​件时误导性的“没有这样的文件或目录”消息。这样,64 位 Fedora 系统就能够执行 32 位二进制文​​件。

这也消除了ldd在调用ldd32 位动态可执行文件时误导性的“不是动态可执行文件”消息。

现在您必须安装缺少的 32 位库,其下的二进制文件adt-bundle-linux/sdk/platform-tools链接到:

# yum install zlib.i686 libstdc++.i686 ncurses-libs.i686 libgcc.i686
Run Code Online (Sandbox Code Playgroud)

就是这样。

背景

如何派生上述包名的一些背景知识。例如查看输出

$ ldd adb
linux-gate.so.1 =>  (0xf774f000)
librt.so.1 => /lib/librt.so.1 (0xf7725000)
libncurses.so.5 => not found
libpthread.so.0 => /lib/libpthread.so.0 (0xf770b000)
libstdc++.so.6 => not found
libm.so.6 => /lib/libm.so.6 (0xf76df000)
    [..]
Run Code Online (Sandbox Code Playgroud)

意味着,adb 仍然缺少 2 个库。

对于每个“未找到”,我们必须查找包名称,例如:

$ yum whatprovides '*libstdc++.so.6'
[..]
libstdc++-4.7.2-2.fc17.i686 : GNU Standard C++ Library
[..]
Run Code Online (Sandbox Code Playgroud)

现在我们获取包基本名称并在其中添加“.i686”以获得 32 位版本。