64비트 Fedora 17에서 32비트 프로그램을 어떻게 실행합니까?

64비트 Fedora 17에서 32비트 프로그램을 어떻게 실행합니까?

ADT(Android 개발 도구) 번들은 "Linux 64비트" zip 패키지로 제공되지만다음 요구 사항을 명시하십시오.:

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

실제로 Fedora 17 64비트 시스템에서 패키지된 Eclipse를 실행하면 adb다음과 같은 여러 개발 도구를 "찾을" 수 없기 때문에 오류가 발생합니다 aapt.

aapt 실행 오류: '/home/juuser/local/adt-bundle-linux/sdk/platform-tools/aapt' 프로그램을 실행할 수 없습니다. 오류=2, 해당 파일 또는 디렉터리 없음: 오류=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비트 응용 프로그램을 실행하려면 어떻게 해야 합니까?

(물론 누군가가 왜 "Linux 64-bit"라는 바이너리 패키지에 32비트 바이너리를 넣었는지 물어볼 수도 있습니다...)

답변1

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)

이는 /usr/lib(/usr/lib64가 아님)에 대한 심볼릭 링크인 /lib에 있습니다. 바라보다:

»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 목록을 확인하세요. 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]

;)

답변2

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

# yum install glibc.i686

이는 32비트 바이너리를 실행하려고 할 때 "해당 파일이나 디렉터리가 없습니다"라는 오해의 소지가 있는 메시지를 제거합니다. 이를 통해 64비트 Fedora 시스템은 32비트 바이너리를 실행할 수 있습니다.

이는 또한 ldd32비트 동적 실행 파일을 호출할 때 나타나는 오해의 소지가 있는 "동적 실행 파일이 아님" 메시지를 제거합니다.ldd

이제 누락된 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비트 버전을 얻습니다.

답변3

다음 명령을 사용하여 필요한 패키지를 설치할 수 있습니다.

sudo yum install redhat-lsb.i686

관련 정보