64 비트 Fedora 17에서 32 비트 프로그램을 실행하는 방법은 무엇입니까?


10

ADT (Android Development Tools) 번들은 'Linux 64 Bit'에 대한 zip 패키지로 제공되지만 다음 요구 사항이 있습니다 .

64 비트 배포는 32 비트 응용 프로그램을 실행할 수 있어야합니다.

실제로 Fedora 17 64 비트 시스템에서 패키지 된 이클립스를 실행하면 오류가 발생합니다. 예를 들어 adb또는 aapt:

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 비트'라는 바이너리 패키지에 넣는 이유를 물을 수 있습니다.)


AskFedora에 대한 답변과 비슷한 질문 : ask.fedoraproject.org/question/365/…
gertvdijk

답변:


9

이클립스가 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 비트 버전입니다. 설치 만하면됩니다.

아무것도 컴파일되지 않으므로 'devel'패키지가 필요하지 않습니다. 즉, 교육 추측을 넘어 및 yum whatprovides/ yum search도움이 될 것입니다 (ADB의 목록을보고, 또한 C ++ LIB, ncurses를, pthreads의, 그리고 나는 내가 모르는 몇 가지의 32 비트 버전이있다).

사용에 대한 빠른 팁 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 실행, 인텔 80386 - ARM 에뮬레이션과는 아무 - 그리고는 / usr / 빈 / ADB를 (안드로이드-도구 페도라 패키지에서) 실제로 ELF 64 비트 LSB 실행 파일 x86-64 로 사용할 수 있습니다 .
maxschlepzig

ldd를 호출하면 adt-bundle-linux/sdk/platform-tools/adb'동적 실행 파일이 아닙니다'가 표시됩니다. PATH와 관련하여-이것은 문제가 아닙니다. 예를 들어 ./adt-bundle-linux/sdk/platform-tools/adb터미널에서 경로를 완전히 지정하면 작동하지 않습니다 ( 'zsh : no such file or directory [..]').
maxschlepzig

glibc.i686이 (가) 아직 설치되어 있습니까? 내가 말했듯이 ldd가 작동하려면 32 비트 로더가 필요하며 이는 glibc 패키지와 함께 제공됩니다. WRT adb는 32 비트 인텔 아치입니다. 시스템이기 때문에 ARM 용으로 컴파일 된 것은 작동하지 않습니다. 그러나 ARM 용으로 동일한 32 비트 내용 컴파일 할 수 있으며 Android 장치에서 사용되는 부분이 있다고 생각합니다. 나는 그것이 필요하다는 것에 대해 틀릴 수도 있지만, 어쨌든 그것이 가능한 것이므로 실제로 그렇게 많은 번거 로움은 아닙니다.
goldilocks

경로를 WRT로 설정하면 이클립스에 필요하지 않을 수 있으며 파일을 실행할 수 없으면 명령 줄에 동일한 오류가 발생할 수 있습니다. libs 등을 설치하면 알 수 있습니다.
goldilocks

2
32 비트 프로그램 인 에뮬레이터와 32 비트 프로세서를 갖는 에뮬레이트 된 플랫폼 사이에는 아무런 관계가 없습니다. Android 에뮬레이터는 실제로 Qemu를 기반으로하며 호스트 아키텍처와 상관없이 armv7 (32 비트), armv8 (64 비트), x86, amd64, mips, mips64 등을 에뮬레이트 할 수 있습니다.
Gilles 'SO- 악의를 멈춰라

8

32 비트 glibc를 설치해야합니다.

# yum install glibc.i686

32 비트 바이너리를 실행하려고 할 때 잘못된 파일이나 디렉토리가 없다는 메시지를 제거합니다. 이를 통해 64 비트 Fedora 시스템은 32 비트 바이너리를 실행할 수 있습니다.

또한 32 비트 동적 실행 파일을 ldd호출 할 때 잘못된 "동적 실행 파일이 아닌"메시지를 제거합니다 ldd.

이제 바이너리 adt-bundle-linux/sdk/platform-tools가 링크 된 누락 된 32 비트 라이브러리를 설치해야합니다 .

# 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하면 lddi386 바이너리와 올바르게 작동 할 수 있습니다 .
Krystian

2

다음과 같이 필요한 패키지를 설치할 수 있습니다.

sudo yum install redhat-lsb.i686
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.