Làm cách nào để chạy các chương trình 32 bit trên Fedora 17 64 bit?


10

Mặc dù gói Công cụ phát triển Android (ADT) có sẵn dưới dạng gói zip cho 'Linux 64 Bit', nhưng nó nêu các yêu cầu sau :

Phân phối 64 bit phải có khả năng chạy các ứng dụng 32 bit.

Và quả thực, chỉ cần chạy eclipse đóng gói trên Fedora 17 64 bit kết quả hệ thống trong các lỗi, bởi vì nó không thể 'tìm' một số công cụ phát triển, ví dụ như adbhay aapt:

Lỗi khi thực hiện aapt: Không thể chạy chương trình "/ home / juser / local / adt-bundle-linux / sdk / platform-tools / aapt": error = 2, Không có tệp hoặc thư mục như vậy: error = 2, Không có tệp hoặc thư mục như vậy

'Không có tệp nào như vậy' gây hiểu lầm vì nó ở đó (dưới $ HOME / địa phương):

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

Nhưng tôi không thể thực hiện nó trên shell:

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

Nhìn vào tập tin

$ 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

chúng tôi thấy rằng đó là một nhị phân 32. Và dường như hệ thống của tôi (hiện tại) không có khả năng chạy các ứng dụng 32 bit.

Làm thế nào để tôi thay đổi điều đó? Làm cách nào để tạo một hệ thống Fedora 64 bit hiện tại có khả năng chạy các ứng dụng 32 bit?

(Tất nhiên người ta cũng có thể hỏi tại sao cuối cùng lại có người đưa nhị phân 32 bit vào gói nhị phân có tên 'Linux 64 bit' ...)


Câu hỏi tương tự với câu trả lời trên AskFedora: ask.fedoraproject.org/question/365/iêu
gertvdijk

Để hiểu lý do tại sao bạn nhận được thông báo này: Nhận
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


9

Liên quan đến nhật thực không thể tìm thấy adb, v.v., bởi vì không có thư viện chia sẻ 32 bit cần thiết để chạy chúng trên hệ thống, chúng không thể thực thi được.

Đối với các thư viện 32 bit, tình huống khá đơn giản: bạn chỉ cần cài đặt các lib 32 bit thích hợp. Trong cài đặt fedora 17 bit 64 tôi có ở đây, các thư viện 64 bit chính nằm trong / usr / lib64 và các lib 32 bit tùy chọn nằm trong / usr / lib. Vì vậy, nếu tôi gọi lddtrên sdk / 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)

Lưu ý đây là tất cả trong / lib, là một liên kết tượng trưng đến / usr / lib (không phải / usr / lib64). Nhìn:

»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 [...]

Một thư viện C tiêu chuẩn 32 bit. Những gì bạn có thể làm là đi qua các công cụ sdk 32 bit và kiểm tra xem chúng được liên kết với cái gì ldd. Tôi không có ví dụ trong tay, nhưng nếu thiếu lddthứ gì đó báo cáo một cái gì đó như:

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

Đầu tiên , để ldd hoạt động, bạn sẽ cần trình tải 32 bit đi kèm với glibc 32 bit (không có cái này, ldd sẽ gọi nó là tệp không thể thực thi và không cho bạn biết gì):

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

Điều đó đã bị cắt ngắn, nhưng gói x86_64 là những gì bạn đã có; i686 là phiên bản 32 bit. Vì vậy, chỉ cần cài đặt đó.

Bạn không cần bất kỳ gói 'devel' nào, vì không có gì được biên dịch. Ngoài ra, những phỏng đoán có giáo dục và yum whatprovides/ yum searchnên giúp đỡ (nhìn vào danh sách cho adb, cũng có các phiên bản 32-bit của lib C ++, ncurses, pthreads và một vài điều tôi không biết).

Mẹo nhanh về cách sử dụng whatprovides:

»yum whatprovides libtinfo
No matches found.
»yum whatprovides libtinfo.so.5
[2 matches]
»yum whatprovides "*/libtinfo.so.5"
[4 matches]

;)


ok, tôi sẽ cố gắng cài đặt các phiên bản i686 của các thư viện được hiển thị qua ldd. Vì lý do: Tôi không bị thuyết phục, khi gọi filephiên bản gói adbmàn hình: ELF 32 bit LSB thực thi, Intel 80386 - không liên quan gì đến mô phỏng ARM - và / usr / bin / adb (từ gói fedora của công cụ Android) thực sự có sẵn dưới dạng thực thi LSB 64 bit, x86-64 .
maxschlepzig

Nếu tôi gọi ldd trên adt-bundle-linux/sdk/platform-tools/adbnó sẽ hiển thị 'không phải là tệp thực thi động'. Về PATH - đây không phải là vấn đề - chỉ định đầy đủ đường dẫn của ví dụ ./adt-bundle-linux/sdk/platform-tools/adbtrong thiết bị đầu cuối không hoạt động (kết quả là 'zsh: không có tệp hoặc thư mục như vậy [..]').
maxschlepzig

Bạn đã cài đặt glibc.i686 chưa? Như tôi đã nói, bạn (có thể) cần một trình tải 32 bit để ldd hoạt động, và đó sẽ là với gói glibc. WRT adb là một vòm intel 32 bit , đó là vì đó là hệ thống của bạn, một thứ được biên dịch cho ARM sẽ không hoạt động ở đó. Tuy nhiên, những thứ 32 bit tương tự có thể được biên dịch cho ARM và tôi tưởng tượng các phần của nó là khi được sử dụng trên các thiết bị Android. Tôi thừa nhận có thể sai về việc đó là điều cần thiết, nhưng trong mọi trường hợp, đó là những gì có sẵn, và nó không thực sự quá rắc rối.
goldilocks

WRT đường dẫn, có thể không cần thiết cho nhật thực và (như bạn nói) bạn có thể gặp lỗi tương tự trên dòng lệnh nếu tập tin không thể được thực thi bằng mọi cách. Chỉ cần cài đặt libs, vv, và bạn sẽ tìm ra.
goldilocks

2
Không có mối quan hệ nào giữa trình giả lập là chương trình 32 bit và nền tảng giả lập có bộ xử lý 32 bit. Trình giả lập Android trên thực tế dựa trên Qemu, có thể mô phỏng bất kỳ armv7 (32-bit), armv8 (64-bit), x86, amd64, mips, mips64, và nhiều hơn nữa, bất kể kiến ​​trúc máy chủ.
Gilles 'SO- ngừng trở nên xấu xa'

8

Bạn phải cài đặt glibc 32 bit:

# yum install glibc.i686

Điều này loại bỏ thông báo 'không có tệp hoặc thư mục' gây hiểu lầm khi cố gắng thực hiện nhị phân 32 bit. Cùng với đó, hệ thống Fedora 64 bit có khả năng thực thi nhị phân 32 bit.

Điều này cũng loại bỏ thông báo 'không phải là tệp thực thi động' gây hiểu lầm lddkhi gọi lddtrên tệp thực thi động 32 bit.

Bây giờ bạn phải cài đặt các thư viện 32 bit bị thiếu, các nhị phân bên dưới adt-bundle-linux/sdk/platform-toolsđược liên kết với:

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

Đó là nó.

Lý lịch

Một số nền tảng làm thế nào để lấy được tên gói trên. Ví dụ nhìn vào đầu ra của

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

có nghĩa là, 2 thư viện vẫn còn thiếu cho adb.

Đối với mỗi 'không tìm thấy', chúng tôi phải tra cứu tên gói, ví dụ:

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

Bây giờ chúng tôi lấy tên cơ sở gói và thêm '.i686' vào đó để có phiên bản 32 bit.


Câu trả lời này rất hay, đặc biệt là phần đầu tiên - thực sự cài đặt glibc.i686cho phép lddhoạt động đúng với các nhị phân i386.
Kirtian

2

Bạn có thể cài đặt gói cần thiết với:

sudo yum install redhat-lsb.i686
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.