การได้รับข้อความ“ ไม่พบ” เมื่อเรียกใช้ไบนารีแบบ 32 บิตบนระบบ 64 บิต


70

ขณะนี้ฉันมีปัญหาแปลก ๆ เกี่ยวกับเดเบียน (เสียงฮืด ๆ / amd64)

ฉันได้สร้าง chroot เพื่อติดตั้งเซิร์ฟเวอร์ (ฉันไม่สามารถให้รายละเอียดเพิ่มเติมเกี่ยวกับมันขอโทษ) /chr_path/ขอเรียกเส้นทางของมัน เพื่อทำให้สิ่งต่าง ๆ เป็นเรื่องง่ายฉันได้เริ่มต้น chroot นี้ด้วย debootstrap (เช่น wheezy / amd64)

ทั้งหมดดูเหมือนจะทำงานได้ดีภายใน chroot แต่เมื่อฉันเริ่มสคริปต์การติดตั้งของเซิร์ฟเวอร์ของฉันฉันได้รับ: zsh: Not found /some_path/perl(โปรแกรมติดตั้งมีไบนารี Perl ด้วยเหตุผลบางอย่าง)

โดยปกติฉันตรวจสอบ/some_path/สถานที่และพบไบนารี "perl" fileในสภาพแวดล้อม chroot ส่งคืน:

/some_path/perl ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped

ไฟล์มีอยู่ดูเหมือนว่าจะมีสิทธิ์ที่ถูกต้อง ฉันสามารถใช้file, ls, vimกับมัน แต่ทันทีที่ฉันพยายามที่จะดำเนินการได้ - ./perlเช่น - zsh: Not found ./perlฉันได้รับ:

สถานการณ์นี้ค่อนข้างเข้าใจได้สำหรับฉัน ยิ่งกว่านั้น:

  • ฉันสามารถรันไบนารีพื้นฐานอื่น ๆ (/ bin / ls, ... ) ใน chroot โดยไม่มีข้อผิดพลาด
  • ฉันมีปัญหาเหมือนกันสำหรับไบนารีอื่น ๆ ที่มาพร้อมกับโครงการ
  • เมื่อฉันพยายามรันไบนารีจากรูทหลัก ( /chr_path/some_path/perl) มันทำงานได้
  • lsฉันได้พยายามที่จะนำหนึ่งในไบนารีที่มีสำเนาของฉัน ฉันตรวจสอบว่าสิทธิ์การเข้าถึงเหมือนกัน แต่นี่ไม่ได้เปลี่ยนแปลงอะไรเลย (อันใดอันหนึ่งทำงานได้และอันอื่นไม่ได้)

1
นี้เป็นปัญหาเดียวกับ"ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว" อยู่บน Optware ติดตั้งไบนารี โปรดทราบว่า Perl ของคุณสามารถใช้งานได้แบบ 32 บิต คุณไม่มีระบบรันไทม์ 32- บิต ( libc6-i386แพ็คเกจหรือia32-libsถ้าคุณต้องการห้องสมุดจำนวนมาก)
Gilles

@Gilles: ขอบคุณมาก! ความสามารถในการติดตั้ง ia32-libs แก้ปัญหาได้แล้ว !! ฉันเห็นว่า perl เป็น 32 บิต แต่เนื่องจากมันทำงานบนระบบหลัก (distrib เดียวกัน) ฉันเพิ่งคิดว่ามันไม่ได้เชื่อมโยง จริงๆแล้วฉันต้องติดตั้งระบบรันไทม์ 32 บิตบนระบบหลักในบางจุด
Elenaher

1
@Gilles: ฉันคิดว่าฉันจะเพิ่มว่าเป็นคำตอบที่กระชับแทนที่จะทำเครื่องหมายว่าเป็นคำถามที่ซ้ำกัน สภาพแวดล้อมแตกต่างกันมากพอที่ถึงแม้ว่าปัญหาจะเหมือนกัน แต่การค้นหาผู้คนมีแนวโน้มที่จะกระทบกับคนอื่นมากกว่า
Caleb

1
@Caleb เราจะไม่ลบรายการที่ซ้ำกันด้วยเหตุผลนั้น; ผู้ค้นหาที่พบสิ่งนี้จะไปตามลิงก์ที่ซ้ำกันไปยังโพสต์อื่น หากนี่เป็นปัญหาเดียวกันมันน่าจะถูกปิด
Michael Mrozek

@MichaelMrozek ฉันเปลี่ยนใจในคำถามนี้: ในขณะที่ปัญหาพื้นฐานเหมือนกันการรักษาที่เป็นรูปธรรมจะแตกต่างกันเล็กน้อย (ไม่ได้ผสม ARM ABIs ในกรณีหนึ่งเปิดใช้งานการสนับสนุน 32 บิตในการกระจาย amd64 Linux ในที่อื่น ๆ ) . ดังนั้นฉันเดาว่าคำถามนี้เป็นคำถามที่เปิดหลังจากทั้งหมด
Gilles

คำตอบ:


72

เมื่อคุณไม่สามารถเรียกใช้งานไฟล์ที่ขึ้นอยู่กับ“ ตัวโหลด” ข้อผิดพลาดที่คุณได้รับอาจหมายถึงตัวโหลดโหลดแทนไฟล์ที่คุณกำลังเรียกใช้งาน

  • โหลดเดอร์ของ executable native ที่เชื่อมโยงแบบไดนามิกนั้นเป็นส่วนหนึ่งของระบบที่รับผิดชอบโหลดไลบรารีแบบไดนามิก มันเป็นสิ่งที่ชอบ/lib/ld.soหรือ/lib/ld-linux.so.2และควรเป็นไฟล์ที่ปฏิบัติการได้
  • โหลดสคริปต์เป็นโปรแกรมที่กล่าวถึงในบรรทัด shebang e กรัมสำหรับสคริปต์ที่เริ่มต้นด้วย/bin/sh #!/bin/sh(ทุบตีและ zsh ให้ข้อความ“ ล่ามที่ไม่ดี” แทน“ ไม่พบคำสั่ง” ในกรณีนี้)

ข้อความแสดงข้อผิดพลาดค่อนข้างทำให้เข้าใจผิดในการไม่ระบุว่าโหลดเดอร์เป็นปัญหา น่าเสียดายที่การแก้ไขปัญหานี้อาจเป็นเรื่องยากเนื่องจากส่วนต่อประสานเคอร์เนลมีที่ว่างสำหรับการรายงานรหัสข้อผิดพลาดที่เป็นตัวเลขเท่านั้นไม่ใช่เพื่อระบุว่าข้อผิดพลาดนั้นเกี่ยวข้องกับไฟล์อื่น เชลล์บางตัวทำงานเพื่อสคริปต์ (อ่าน#!บรรทัดบนสคริปต์และแก้ไขข้อผิดพลาดอีกครั้ง) แต่ก็ไม่มีใครที่ฉันเคยเห็นพยายามทำแบบเดียวกันสำหรับไบนารีพื้นเมือง

lddจะไม่ทำงานบนไบนารีเพราะมันทำงานได้โดยการตั้งค่าตัวแปรสภาพแวดล้อมพิเศษบางอย่างแล้วเรียกใช้โปรแกรมเพื่อให้โหลดเดอร์ทำงานได้ straceจะไม่ให้ข้อมูลที่มีความหมายเช่นกันเนื่องจากจะไม่รายงานมากกว่าสิ่งที่เคอร์เนลรายงานและอย่างที่เราเห็นว่าเคอร์เนลไม่สามารถรายงานทุกสิ่งที่มันรู้

สถานการณ์นี้มักจะเกิดขึ้นเมื่อคุณพยายามเรียกใช้ไบนารีสำหรับระบบที่เหมาะสม (หรือตระกูลของระบบ) และ superarchitecture แต่เป็น subar Architecture ที่ไม่ถูกต้อง ที่นี่คุณมีเอลฟ์ไบนารีบนระบบที่คาดว่าเอลฟ์ไบนารีดังนั้นเคอร์เนลจึงโหลดได้ดี พวกเขาคือไบนารี i386 ที่ทำงานบนโปรเซสเซอร์ x86_64 ดังนั้นคำแนะนำจึงเหมาะสมและทำให้โปรแกรมตรงจุดที่สามารถมองหาตัวโหลด แต่โปรแกรมนี้เป็นโปรแกรม 32- บิต (ตามที่fileระบุ) เอาท์พุทมองหาโหลดเดอร์ 32- บิต/lib/ld-linux.so.2และคุณน่าจะติดตั้งเฉพาะโหลดเดอร์ 64- บิต/lib64/ld-linux-x86-64.so.2ใน chroot

คุณต้องติดตั้งระบบรันไทม์แบบ 32 บิตใน chroot: ตัวโหลดและไลบรารีทั้งหมดที่โปรแกรมต้องการ จาก Debian wheezy เป็นต้นไปถ้าคุณต้องการการสนับสนุนทั้ง i386 และ x86_64 ให้เริ่มด้วยการติดตั้ง amd64 และเปิดใช้งานการสนับสนุนmultiarch : รันdpkg --add-architecture i386แล้วapt-get updateและapt-get install libc6:i386 zlib1g:i386 …(ถ้าคุณต้องการสร้างรายการการพึ่งพาของแพ็คเกจ perl ของ Debian เพื่อดูว่าไลบรารี่ใดที่น่าจะเป็น เป็นสิ่งจำเป็นคุณสามารถใช้aptitude search -F %p '~Rdepends:^perl$ ~ri386') คุณสามารถดึงคอลเล็กชันของไลบรารีทั่วไปได้โดยการติดตั้งia32-libsแพคเกจ (คุณต้องเปิดใช้งานการสนับสนุน multiarch ก่อน) บน Debian amd64 มากถึง wheezy โหลดเดอร์ 32 บิตอยู่ในlibc6-i386แพ็คเกจ คุณสามารถติดตั้งชุดที่ใหญ่กว่าของห้องสมุด 32 ia32-libsบิตโดยการติดตั้ง


นี่เป็นสิ่งเดียวที่สามารถทริกเกอร์ข้อความแสดงข้อผิดพลาดได้หรือไม่ ฉันติดตั้งไลบรารี่ 32 บิตแล้วและนี่เป็นผลลัพธ์ของlddฉัน แต่ฉันยังคงได้รับข้อผิดพลาดเดียวกัน
นาธานออสมัน


ฉันพยายามติดตั้งlsb-coreแต่ดูเหมือนจะไม่ช่วย ฉันคิดว่าฉันควรเปิดคำถามใหม่ให้ดีกว่านี้
นาธานออสมัน

ขอบคุณสำหรับสิ่งนี้คุณเพิ่งสิ้นสุดการเกาหัวสองวัน ฉันคิดว่าทุกอย่างกำลังถูกรวบรวมแบบสแตติก แต่ไม่ใช่!
Finn O'leary

5

ทำงานldd(1)บนperlไบนารีของคุณ บ่อยครั้งที่Not foundข้อผิดพลาดที่ทำให้เกิดความสับสนดูเหมือนจะเกิดขึ้นกับไฟล์ที่เห็นได้ชัดว่าเป็นเพราะหนึ่งในไลบรารีที่ใช้ร่วมกันที่ใช้โดยโปรแกรมไม่พบ

ดังนั้นจึงเป็นไปได้ที่ chroot ของคุณจะไม่สมบูรณ์เมื่อเทียบกับไลบรารีแบบแบ่งใช้ที่ไบนารีของคุณต้องการ


จริง ๆ แล้วฉันได้รับ: perl is not a dynamic executableเมื่อฉันอยู่ใน chroot และฉันได้รับรายการอ้างอิงที่ถูกต้องจากภายนอก ขณะนี้ฉันกำลังตรวจสอบว่ามีบางสิ่งที่แปลก แต่ฉันใช้ debootstrap เพื่อหลีกเลี่ยงการขาดประเภทนี้และมี libs จำนวนมากอยู่แล้ว (มีการปฏิบัติการ Perl ในระบบ chroot ที่ทำงานได้ดี แต่มันเป็นเวอร์ชั่นที่แตกต่างกัน ลิงก์สัญลักษณ์?)
Elenaher

ความซื่อสัตย์ฉันคาดว่า debootstrap จะสร้าง chroot อย่างสมบูรณ์ดังนั้นฉันจึงไม่คาดว่าคำตอบของฉันจะถูกต้องในแง่นั้น แต่ฉันเคยเจอห้องสมุดที่ขาดหายไปในปัญหา chroot ก่อนดังนั้นฉันคิดว่าฉันจะดูว่าคำตอบของฉันจะบิน
camh

cf เลย ความคิดเห็นที่ Gilles ในการโพสต์หลัก: คุณถูกต้อง มี libs หายไปบางส่วน ประโยชน์หลักของ debootstrap คือว่าผมสามารถแก้ปัญหาที่มีความถนัดพื้นฐานติดตั้ง :)
Elenaher
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.