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


10

尽管Android开发工具(ADT)捆绑包可作为“ Linux 64位”的zip包提供,但它指出以下要求

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

实际上,仅在Fedora 17 64位系统上运行打包的Eclipse会导致错误,因为它无法“找到”多个开发工具,例如adbaapt

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

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

adt-bundle-linux/sdk/platform-tools/aapt

但是我不能在外壳上执行它:

~/local $ ./adt-bundle-linux/sdk/platform-tools/aapt 
zsh: no such file or directory: ./adt-bundle-linux/sdk/platform-tools/aapt

看文件

$ 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

我们看到它是32位二进制文​​件。而且看来,我的系统(当前)不能运行32位应用程序。

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

(当然,也可能会问为什么有人最终将32位二进制文​​件放入名为“ Linux 64 bit”的二进制程序包中……)


与AskFedora回答类似的问题:ask.fedoraproject.org/question/365/...
gertvdijk

Answers:


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)

请注意,所有这些都在/ 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 [...]

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

libc.so.6 => ??????

首先,为了使ldd正常工作,您将需要32位glibc随附的32位加载程序(否则,ldd会将其称为不可执行文件,什么也不会告诉您):

»yum search glibc
glibc.i686 : The GNU libc libraries
glibc.x86_64 : The GNU libc libraries

这被截断了,但是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]

;)


好的,我将尝试安装通过展示的i686版本的库ldd。出于以下原因:我不确信要调用显示器file的捆绑版adb:ELF 32位LSB可执行文件,Intel 80386-与ARM仿真无关-和/ usr / bin / adb(来自android-tools fedora软件包)实际上可以作为ELF 64位LSB可执行文件x86-64使用
maxschlepzig 2012年

如果我在adt-bundle-linux/sdk/platform-tools/adb其上调用ldd,则显示“不是动态可执行文件”。关于PATH-这不是问题-完全指定./adt-bundle-linux/sdk/platform-tools/adb终端中的路径是行不通的(导致“ zsh:没有这样的文件或目录[..]”)。
maxschlepzig 2012年

您是否已安装glibc.i686?就像我说过的那样,您(可能)需要一个32位加载程序才能使ldd正常工作,而glibc软件包将附带该加载程序。WRT adb是32位intel拱门,这是因为这是您的系统,因此为ARM编译的某些内容将无法在其中运行。但是,可以为ARM编译相同的32位内容,我想其中的一部分是在Android设备上使用的。我承认这样做的必要性可能是错误的,但是无论如何,这是可用的,而且实际上并没有那么麻烦。
goldilocks 2012年

WRT路径,也许没有必要进行蚀,并且(如您所说),如果仍然无法执行该文件,则可能在命令行上遇到相同的错误。只需安装libs等,您就会发现。
goldilocks 2012年

2
在仿真器是32位程序与在仿真平台上具有32位处理器之间没有任何关系。实际上,Android仿真器基于Qemu,它可以仿真armv7(32位),armv8(64位),x86,amd64,mips,mips64等中的任何一个,而与主机架构无关。
吉尔(Gilles)'所以

8

您必须安装32位glibc:

# yum install glibc.i686

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

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

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

# yum install zlib.i686 libstdc++.i686 ncurses-libs.i686 libgcc.i686

而已。

背景

一些背景如何得出上述包名称。例如看的输出

$ 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)
    [..]

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

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

$ yum whatprovides '*libstdc++.so.6'
[..]
libstdc++-4.7.2-2.fc17.i686 : GNU Standard C++ Library
[..]

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


这个答案很好,尤其是第一部分-确实glibc.i686可以ldd通过i386二进制文件正确安装。
克里斯蒂安

2

您可以使用以下方法安装必要的软件包:

sudo yum install redhat-lsb.i686
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.