ldd บอกแอปของฉันว่า“ ไม่ใช่แบบปฏิบัติการได้”


17

ฉันมีแอปพลิเคชั่น 32 บิต (เรียกว่า uclsyn) ฉันได้รับจากอาจารย์ดาราศาสตร์ ฉันจัดการเพื่อให้มันทำงานบน CentOS ปีที่แล้ว แต่ตอนนี้เมื่อฉันตั้งค่า CentOS VM ใหม่มันจะไม่ทำงานและฉันไม่สามารถหาสาเหตุได้ มันกลับมาพร้อมกับ "ฆ่า"

นี่คือการแลกเปลี่ยนในบรรทัดคำสั่ง:

$ ./uclsyn_linux
Killed

$ ldd ./uclsyn_linux
not a dynamic executable

$ file ./uclsyn_linux
uclsyn_linux: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped

บนเครื่องที่ทำงานอยู่ "ldd ./uclsyn_linux" จะส่งคืนรายการการพึ่งพาทั้งหมด ฉันพบแพ็คเกจที่ให้บริการไลบรารีที่ใช้ร่วมกันเหล่านี้และดูเหมือนว่าจะติดตั้งทั้งหมด

แพ็คเกจที่ต้องการ

  • libSM-1.1.0-7.1.el6.i686
  • libX11-1.3-2.el6.i686
  • libgcc-4.4.6-3.el6.i386
  • glibc-2.12-1.47.el6_2.9.i686
  • libuuid-2.17.2-12.4.el6.i686
  • libXau-1.0.5-1.el6.i686
  • นอกจากนี้ยังมีไลบรารีจำนวนมากในแอปพลิเคชันที่ฉันได้ตรวจสอบและติดตั้งแล้ว

สภาพแวดล้อมของฉัน

CentOS ทำงานภายใต้ VirtualBox

uname -a: Linux localhost.localdomain 2.6.32-358.el6.i686 # 1 SMP พฤ. 21 ก.พ. 12:50:49 UTC 2013 i686 i686 i386 GNU / Linux


1
wild เดา: คุณกำลังพยายามรันไบนารีแบบ 32 บิตบนระบบปฏิบัติการ 64 บิตโดยไม่ต้องติดตั้งไลบรารีแบบ 32 บิต
michas

มันเป็นไบนารี 32 บิต แต่ระบบปฏิบัติการที่ฉันติดตั้งเป็น CentOS รุ่น 32 บิต อย่างน้อยนั่นคือคำสั่ง uname-a ที่บอกฉันใช่
Carl

3
@ คาร์ลออกจากความอยากรู้สิ่งที่strace ./uclsynส่งออก? นั่นอาจให้คำแนะนำแก่เราเกี่ยวกับสิ่งที่ขาดหายไปก่อน
lgeorget

@lgeorget มันส่งคืน: execve ("./ uclsyn_linux", ["./uclsyn_linux"], [/ * 56 vars * /] <ยังไม่เสร็จ ... > +++ ถูกฆ่าโดย SIGKILL +++
Carl

@ คาร์ลโอเคดังนั้นมันไม่ได้ไปถึงจุดที่มันพยายามโหลดไลบรารี่บางอัน ฉันไม่เคยลองมาก่อนกับstraceโปรแกรมที่ลิงก์ไม่ถูกต้อง
lgeorget

คำตอบ:


13

ฉันเพิ่งมีปัญหากับไบนารี 32 บิตทางออกคือ:

apt-get install gcc-multilib

$ uname -a
Linux bla 2.6.32-028stab094.3 #1 SMP Thu Sep 22 12:47:37 MSD 2011 x86_64 GNU/Linux

3
คุณพบได้อย่างไรว่า lib นั้นหายไป
Yehudahs

1
วิธีนี้ใช้ได้ผลสำหรับฉัน +1
FractalSpace

@yehudahs ฉันใช้แอพพลิเคชั่น 32 บิตที่คอมไพล์แล้วบน Linux มาระยะหนึ่งแล้วบวกวิศวกรรมย้อนกลับพวกมันเลยเก็บประสบการณ์การถ่ายปัญหา : D
lama12345

1
ดีนี้ทำงานได้ดีสำหรับฉันเช่นเดียวกับฉันเกาหัวของฉันสิ่งที่ฉันทำผิด
Marvin Effing

1
ได้ผลสำหรับฉันด้วย: ldd ไม่พบอะไรเลยในขณะที่มันใช้งานได้ ^^
jy95

8

ข้อผิดพลาดที่นี่เกิดจากการมี RAM ไม่เพียงพอบน VirtualMachine การรันstrace ./programnameระบุว่าโปรแกรมนั้นถูกฆ่าเช่นเดียวกับที่เริ่มทำงานก่อนที่จะโหลดไลบรารีใด ๆ การเพิ่มจำนวน RAM ที่มีอยู่ทำให้มั่นใจว่าโปรแกรมสามารถทำงานได้

คำตอบที่เป็นประโยชน์

มีการตอบกลับที่เป็นประโยชน์จากผู้อื่น ได้แก่ @slm ซึ่งให้คำสั่งที่มีประโยชน์เพื่อตรวจสอบว่ามีไลบรารีแต่ละรายการอยู่และ @lgeorget ผู้แนะนำการลองใช้straceคำสั่ง


5

คุณสามารถโพสต์ไลบรารี่บางส่วนที่มันลิงก์ไปยัง (จากระบบดั้งเดิม) ได้หรือไม่? คุณอาจต้องติดตั้งไลบรารีที่ขาดหายไป

โดยทั่วไปในระบบ CentOS มันเป็นเรื่องของการรันคำสั่ง yum ดังนี้:

yum install <package name>

คุณสามารถย้อนกลับจากระบบดั้งเดิมได้ดังนี้:

$ ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007fff519ff000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x00000034e8e00000)
    librt.so.1 => /lib64/librt.so.1 (0x00000034e8a00000)
    libcap.so.2 => /lib64/libcap.so.2 (0x0000003d6fe00000)
    libacl.so.1 => /lib64/libacl.so.1 (0x00000034fae00000)
    libc.so.6 => /lib64/libc.so.6 (0x00000034e7200000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00000034e7a00000)
    /lib64/ld-linux-x86-64.so.2 (0x00000034e6e00000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00000034e7e00000)
    libattr.so.1 => /lib64/libattr.so.1 (0x00000034f7600000)

ในการส่งออกที่คุณสามารถดูที่สำเนาของฉัน/bin/lsจะถูกหยิบขึ้นมาใช้ร่วมกันดังนั้นห้องสมุดเช่นพูดที่เกิดขึ้นจะอยู่ที่นี่:librt.so.1/lib64/librt.so.1

เมื่อรู้อย่างนี้แล้วในระบบดั้งเดิมคุณสามารถเรียกใช้คำสั่งนี้เพื่อหาว่าแพ็คเกจใดมีไลบรารีนี้:

$ rpm -qf /lib64/librt.so.1
glibc-2.13-2.x86_64

glibc-2.13-2.x86_64ดังนั้นแพคเกจที่เรียกว่า ดังนั้นในการติดตั้งคุณต้องทำสิ่งนี้:

$ sudo yum install glibc-2.13-2.x86_64

ขอบคุณมากสำหรับความช่วยเหลือ ฉันได้รับเพิ่มเติม ได้อัปเดตคำถามของฉันพร้อมกับข้อมูลเพิ่มเติมตอนนี้หากคุณต้องการอัปเดตคำตอบของคุณด้วยคำถามเดียวกันจะได้รับการชื่นชมมาก :)
Carl

คุณyum install <package>แพคเกจที่คุณอ้างถึงในคำถามของคุณหรือไม่
slm

ใช่ฉันทำ. พวกเขาทั้งหมดได้รับการติดตั้งยกเว้น libuuid.i686 ซึ่งตอนนี้ แต่ฉันยังคงมีปัญหาเดิมอยู่
Carl

2

คำตอบอยู่ในคำถามของคุณ: คุณพยายามเรียกใช้แอปพลิเคชันที่รวบรวมไว้สำหรับ GNU / Linux เมื่อหนึ่งปีที่แล้วและคุณพยายามเรียกใช้งานด้วยห้องสมุดใหม่ซึ่งอาจไม่สามารถใช้งานได้หรือใช้งานได้อีกต่อไป

ณ จุดนี้คุณมีสองทางเลือก หากคุณสามารถคอมไพล์ซ้ำได้ (ซึ่งฉันสงสัยว่าถ้าฉันเข้าใจกรณีของคุณดี) มันจะทำงานเพราะมันจะถูกเชื่อมโยงกับไลบรารีที่เข้ากันได้อีกครั้ง มิฉะนั้นคุณสามารถลองสร้าง sandbox ประเภทหนึ่งซึ่งเป็น VM ที่ทำงานกับไลบรารี GNU เวอร์ชันเก่าเพื่อใช้งานแอปพลิเคชัน


1
สิ่งนี้ไม่ถูกต้อง โปรแกรมเชื่อมโยงแบบสแตติกไม่มีไลบรารีบนระบบโฮสต์ที่จะอ้างอิง ในขณะที่ ABI อาจยังทำให้เกิดความไม่ลงรอยกันก็ไม่น่าเป็นไปได้ระหว่าง revs เล็กน้อยของเคอร์เนล linux (สมมติว่าสถาปัตยกรรมเดียวกัน)
ckhan

1
fileมันไม่ได้เชื่อมโยงแบบคงดูเอาท์พุทจาก และข้อความเช่นNo package xyz foundแนะนำว่าห้องสมุดที่ต้องการไม่มีให้บริการอีกต่อไป (อย่างน้อยไม่ใช่วิธีที่พวกเขาอยู่ในแพ็คเกจเดียวกัน) นั่นเป็นเหตุผลที่ฉันแนะนำให้สร้างใหม่โปรแกรมถ้าเป็นไปได้หรือเรียกใช้ในระบบที่เป็นที่รู้จักในการทำงานกับห้องสมุดเก่า
lgeorget

น่าเสียดายที่การรวบรวมซ้ำไม่ใช่ตัวเลือกที่นี่ ฉันทำให้มันทำงานบนระบบอื่นในแบบเดียวกับที่ฉันลองที่นี่ แต่ด้วยเหตุผลบางอย่างคราวนี้มันไม่ชอบ
Carl

นี่เป็นสิ่งที่ผิด การเปลี่ยนที่อยู่ไม่สำคัญเลย ฟังก์ชั่นที่ถูกลบหรือตัวแบ่ง ABI อื่น ๆ เกิดขึ้นที่การแก้ไขที่สำคัญของไลบรารี (ซึ่งหายาก) ในกรณีนี้คุณจะได้รับข้อผิดพลาดในการโหลด libfoo2 หากคุณไม่ได้ติดตั้ง libfoo2 ไม่ว่าคุณจะติดตั้ง libfoo3 หรือไม่
psusi

โอเครู้ดี ฉันคิดว่าการเปลี่ยนแปลงใด ๆ ในห้องสมุดอาจทำให้การเชื่อมโยงหยุดชะงัก ฉันกำลังใช้งาน gentoo อยู่บ่อยครั้งและฉันต้องคอมไพล์การอ้างอิงย้อนกลับอีกครั้งเมื่อฉันอัพเกรดไลบรารีดังนั้นฉันจึงไม่คิดว่าการเชื่อมโยงนั้นต้านทานการเปลี่ยนแปลงห้องสมุดได้
lgeorget

0

ลองreadelf -l uclsyn_linux ขอโปรแกรมล่ามจะบอกคุณว่าคุณพลาดอะไรไป


1
ฉันreadelf -l <file>พบไฟล์ที่มีlddพฤติกรรมเหมือนกัน( not a dynamic executable) แต่ฉันไม่เห็นสิ่งใดที่บ่งบอกถึงห้องสมุดที่ขาดหายไปในทันที ฉันเห็นElf file type is EXEC (Executable file), Entry point, และProgram Headers Section to Segment mappingสิ่งที่ฉันควรมองหาในผลลัพธ์?
StockB

0

ในArch Linuxหากไฟล์นั้นเป็น 32- บิต elf คุณสามารถติดตั้งlib32-gcc-libs (จากที่เก็บ multilib) เพื่อแก้ไขปัญหา

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