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.