วิธีรันโปรแกรม 32 บิตบน 64 บิต Fedora 17


10

แม้ว่าบันเดิลเครื่องมือการพัฒนา Android (ADT) มีให้ใช้งานเป็นแพ็กเกจ zip สำหรับ 'Linux 64 Bit' แต่จะระบุข้อกำหนดดังต่อไปนี้ :

การแจกแจงแบบ 64 บิตต้องสามารถเรียกใช้แอปพลิเคชันแบบ 32 บิตได้

และที่จริงแล้วการรัน eclipse แบบแพ็คเกจบนระบบ Fedora 17 64 บิตทำให้เกิดข้อผิดพลาดเนื่องจากไม่สามารถ 'พบ' เครื่องมือพัฒนาหลายอย่างเช่นadbหรือaapt:

ข้อผิดพลาดในการใช้งาน aapt: ไม่สามารถรันโปรแกรม "/ home / juser / local / adt-bundle-linux / sdk / platform-tools / aapt": ข้อผิดพลาด = 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

เพื่อให้เข้าใจว่าทำไมคุณถึงได้รับข้อความนี้: รับ
Gilles 'ดังนั้นหยุดชั่วร้าย'

คำตอบ:


9

สำหรับ eclipse ที่ไม่สามารถหาได้adbฯลฯ เนื่องจากไม่มีไลบรารีที่แบ่งใช้แบบ 32 บิตที่จำเป็นต่อการรันบนระบบพวกมันไม่สามารถเรียกใช้งานได้

สำหรับไลบรารีแบบ 32 บิตสถานการณ์ค่อนข้างง่าย: คุณเพียงแค่ต้องติดตั้ง libs 32 บิตที่เหมาะสม ในการติดตั้ง fedora 17 แบบ 64 บิตฉันมีอยู่ที่นี่ไลบรารี 64 บิตหลักอยู่ใน / usr / lib64 และ libs 32 บิตที่เป็นตัวเลือกอยู่ใน / usr / lib ดังนั้นถ้าฉันเรียกlddใช้ 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)

โปรดสังเกตว่าทั้งหมดอยู่ใน / lib ซึ่งเป็น symlink ไปยัง / 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 [...]

ไลบรารี่มาตรฐาน C แบบ 32 บิต สิ่งที่คุณสามารถทำได้คือผ่านเครื่องมือ sdk 32 บิตและตรวจสอบเพื่อดูว่ามีการเชื่อมโยงกับ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 เวอร์ชัน 32 บิต 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จอแสดงผลรุ่นมัด: เอลฟ์ 32- บิต LSB ที่ปฏิบัติการได้, Intel 80386 - ไม่มีส่วนเกี่ยวข้องกับการจำลอง ARM - และ / usr / bin / adb (จากชุดเครื่องมือ Android fedora) สามารถใช้ได้จริงเป็นเอลฟ์ 64 บิต LSB ปฏิบัติการx86-64
maxschlepzig

ถ้าฉันเรียก ldd adt-bundle-linux/sdk/platform-tools/adbมันจะแสดง 'ไม่ปฏิบัติการแบบไดนามิก' เกี่ยวกับ PATH - นี่ไม่ใช่ปัญหา - การระบุพา ธ ของเช่น./adt-bundle-linux/sdk/platform-tools/adbในเทอร์มินัลไม่ทำงาน (ผลลัพธ์เป็น 'zsh: ไม่มีไฟล์หรือไดเรกทอรี [.. ]')
maxschlepzig

คุณติดตั้ง glibc.i686 แล้วหรือยัง อย่างที่ฉันบอกไปแล้วว่าคุณ (น่าจะ) ต้องการโหลดเดอร์ 32- บิตเพื่อให้ ldd ทำงานได้และนั่นจะเป็นแพ็คเกจ glibc WRT adb เป็นarch intel intelแบบ 32 บิตนั่นเป็นเพราะนั่นคือระบบของคุณบางสิ่งที่คอมไพล์สำหรับ ARM จะไม่ทำงานที่นั่น อย่างไรก็ตามสิ่งที่ 32- บิตเดียวกันสามารถรวบรวมสำหรับ ARM และฉันคิดว่าบางส่วนของมันเมื่อใช้กับอุปกรณ์ Android ฉันยอมรับว่าอาจผิดเกี่ยวกับความจำเป็น แต่ในกรณีใด ๆ นั่นคือสิ่งที่มีอยู่และมันก็ไม่ได้เป็นเรื่องยุ่งยากเท่าไรนัก
goldilocks

WRT พา ธ อาจไม่จำเป็นสำหรับ eclipse และ (ตามที่คุณพูด) คุณอาจได้รับข้อผิดพลาดเดียวกันในบรรทัดคำสั่งหากไฟล์ไม่สามารถดำเนินการได้ เพิ่งได้รับ libs ติดตั้ง ฯลฯ และคุณจะพบ
goldilocks

2
ไม่มีความสัมพันธ์ระหว่างอีมูเลเตอร์ซึ่งเป็นโปรแกรม 32 บิตและแพลตฟอร์มที่มีการจำลองซึ่งมีโปรเซสเซอร์ 32 บิต Android emulator นั้นใช้ Qemu ซึ่งสามารถจำลอง armv7 (32- บิต), armv8 (64- บิต), x86, amd64, mips, mips64 และอื่น ๆ โดยไม่คำนึงถึงสถาปัตยกรรมโฮสต์
Gilles 'หยุดชั่วร้าย'

8

คุณต้องติดตั้ง glibc 32 บิต:

# yum install glibc.i686

สิ่งนี้จะลบข้อความ 'ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว' ที่ทำให้เข้าใจผิดเมื่อพยายามเรียกใช้ไบนารี 32 บิต ด้วยความที่ระบบ Fedora 64 บิตนั้นมีความสามารถในการประมวลผลไบนารี 32 บิต

สิ่งนี้จะลบข้อความ 'ไม่ใช่ executable ที่ทำให้เข้าใจผิด' lddเมื่อเรียกlddใช้ executable 32 บิต

ตอนนี้คุณต้องติดตั้งไลบรารี 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)
    [..]

หมายความว่าไลบรารี 2 รายการยังคงหายไปสำหรับ adb

สำหรับ 'ไม่พบ' เราจะต้องค้นหาชื่อแพ็คเกจเช่น:

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

ตอนนี้เราใช้ชื่อฐานแพ็กเกจและเพิ่ม '.i686' เพื่อรับรุ่น 32 บิต


คำตอบนี้ยอดเยี่ยมโดยเฉพาะในส่วนแรก - การติดตั้งแน่นอนglibc.i686ช่วยให้lddทำงานได้อย่างถูกต้องกับไบนารี i386
Krystian

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.