“ ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว” ในไฟล์ที่เรียกใช้งานได้ แต่มีไฟล์อยู่และ ldd จะรายงานไลบรารีทั้งหมดที่มีอยู่


13

ดังนั้นโดยคำสั่งอื่น ๆ ไฟล์ปฏิบัติการอยู่ แต่เมื่อฉันพยายามที่จะรันมันก็อ้างว่ามันไม่ได้มี

มันไม่ใช่ตัวละครพิเศษในชื่อเพราะฉันเปลี่ยนชื่อมันเป็น "cat" และดูเหมือนว่าจะเป็นเลขฐานสองสำหรับสถาปัตยกรรมที่ถูกต้อง ... "ดูเหมือน" ฉันเดาว่าคำถามคืออะไรข้อผิดพลาดอื่น ๆ เลยททท. BESIDES ... ไฟล์ไม่ได้อยู่ที่นั่นเพราะเห็นได้ชัดคือ!

ldd xls

    linux-gate.so.1 =>  (0xb77bc000)
    libQtGui.so.4 => /usr/lib/i386-linux-gnu/libQtGui.so.4 (0xb6cc2000)
    libpng12.so.0 => /lib/i386-linux-gnu/libpng12.so.0 (0xb6c98000)
    libSM.so.6 => /usr/lib/i386-linux-gnu/libSM.so.6 (0xb6c8f000)
    libICE.so.6 => /usr/lib/i386-linux-gnu/libICE.so.6 (0xb6c76000)
    libXrender.so.1 => /usr/lib/i386-linux-gnu/libXrender.so.1 (0xb6c6d000)
    libfreetype.so.6 => /usr/lib/i386-linux-gnu/libfreetype.so.6 (0xb6bd1000)
    libfontconfig.so.1 => /usr/lib/i386-linux-gnu/libfontconfig.so.1 (0xb6b9b000)
    libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0xb6b88000)
    libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0xb6a50000)
    libm.so.6 => /lib/i386-linux-gnu/i686/cmov/libm.so.6 (0xb6a2a000)
    libQtSql.so.4 => /usr/lib/i386-linux-gnu/libQtSql.so.4 (0xb69ea000)
    libQtCore.so.4 => /usr/lib/i386-linux-gnu/libQtCore.so.4 (0xb6704000)
    libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb66ea000)
    libgthread-2.0.so.0 => /usr/lib/i386-linux-gnu/libgthread-2.0.so.0 (0xb66e7000)
    libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xb65ea000)
    libgobject-2.0.so.0 => /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 (0xb6598000)
    librt.so.1 => /lib/i386-linux-gnu/i686/cmov/librt.so.1 (0xb658f000)
    libpthread.so.0 => /lib/i386-linux-gnu/i686/cmov/libpthread.so.0 (0xb6575000)
    libdl.so.2 => /lib/i386-linux-gnu/i686/cmov/libdl.so.2 (0xb6571000)
    libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb6485000)
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb6468000)
    libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb6305000)
    libaudio.so.2 => /usr/lib/i386-linux-gnu/libaudio.so.2 (0xb62ea000)
    libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0xb62e4000)
    libexpat.so.1 => /lib/i386-linux-gnu/libexpat.so.1 (0xb62ba000)
    libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb6297000)
    /lib/ld-lsb.so.3 => /lib/ld-linux.so.2 (0xb77bd000)
    libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xb6258000)
    libffi.so.5 => /usr/lib/i386-linux-gnu/libffi.so.5 (0xb624f000)
    libXt.so.6 => /usr/lib/i386-linux-gnu/libXt.so.6 (0xb61f1000)
    libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0xb61ee000)
    libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0xb61e8000)

uname -m (การกระจายของฉันคือ Debian wheezy)

i686

ไฟล์ xls

xls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 
     dynamically linked (uses shared libs), for GNU/Linux 2.6.15,
     BuildID[sha1]=0xa9786f61b371a683ae4306792f95e0636c288883, not stripped

ls -ld xls

-rwxr-xr-x 1 root root 4634064 May 20 14:35 xls

แมว

root@pc170:# cat xls > zls
root@pc170:# ./zls
-su: ./zls: Permission denied
root@pc170:# chmod +x zls
root@pc170:# ./zls
-su: ./zls: No such file or directory

เวลา

root@pc170:# time ./zls
-su: ./zls: No such file or directory

real    0m0.002s
user    0m0.000s
sys     0m0.000s

1
เกี่ยวกับLD_DEBUG=all /lib/ld-lsb.so.3 ./zlsอะไร
Stéphane Chazelas

1
สิ่งหนึ่งเกี่ยวกับเรื่องนี้: มันบอกว่ามัน"su: "ทำให้ดูเหมือนว่าคุณกำลังรันsystem()หรืออะไรบางอย่างจากภายในโปรแกรมและมันก็บอกว่าหลังจากนั้นมันไม่suสามารถหาไฟล์ที่เรียกใช้งานได้ในไดเรกทอรีมันจะเกิดอะไรขึ้นถ้าคุณ คัดลอกหรือเชื่อมโยงไปยัง/binหรืออะไร
Bratchley

มาลองobjdump -j .interp -s ./zlsกัน ฉันสงสัยว่าจะแสดงรายการไฟล์ที่ไม่มีอยู่
Derobert

คำตอบ:


20

นี้จะมีลักษณะเหมือนรถตักดินหายไป เรื่องย่อ: ตัวโหลดแบบไดนามิกที่โปรแกรมคาดไว้หายไปและข้อความแสดงข้อผิดพลาดทำให้เข้าใจผิดในกรณีนี้ lddตั้งแต่ฉันไม่คิดว่าฉันได้กล่าวว่าก่อนที่จะให้ฉันอธิบายส่วนที่เกี่ยวข้องของการส่งออกของ ส่วนใหญ่ก็ constists library_soname => /path/to/library_fileของเส้นของรูปแบบ

/lib/ld-lsb.so.3 => /lib/ld-linux.so.2 (0xb77bd000)

ในบรรดาห้องสมุดเราเห็นสิ่งที่ไม่ใช่ห้องสมุดสาธารณะ: เป็นโปรแกรมที่โหลดห้องสมุดสาธารณะ โปรแกรมกำลังร้องขอ/lib/ld-lsb.so.3แต่เคอร์เนลไม่พบดังนั้นจึงรายงาน“ ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว” ยังlddหาตัวโหลดได้เนื่องจากlddเป็นสคริปต์ตัวห่อหุ้มที่เรียกตัวโหลดแบบเข้ารหัสในสภาพแวดล้อมพิเศษและตัวโหลดจะรายงานเส้นทางของตัวเองเสมอไม่ว่าเส้นทางตัวโหลดที่โปรแกรมคาดไว้

คุณมี/lib/ld-linux.so.2ในระบบของคุณซึ่งเป็นตำแหน่งมาตรฐานของพฤตินัยสำหรับโหลดเอลฟ์บนระบบ x86_32 Linux โปรแกรมต้องใช้/lib/ld-lsb.so.3ซึ่งเป็นทางนิตินัยมาตรฐานที่ตั้ง

ติดตั้งการสนับสนุน LSB ขั้นต่ำของการแจกจ่ายของคุณตัวอย่างเช่นlsb-coreแพ็คเกจบน Debian ถ้าการกระจายของคุณไม่ได้ที่ (ส่วนใหญ่ทำ) /lib/ld-lsb.so.3 -> ld-linux.so.2สร้างการเชื่อมโยงสัญลักษณ์ ในความสิ้นคิดคุณสามารถเรียกโหลดเดอร์ได้อย่างชัดเจน: /lib/ld-linux.so.2 ./xls.


อันที่จริงตัวโหลดคือสิ่งที่บรรทัด objdump จะพิมพ์ออกมา ฉันลืมมันเป็นเรื่องจริงในlddผลลัพธ์ จับดี!
Derobert

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

ขอบคุณสำหรับการโพสต์ที่เป็นประโยชน์มากที่สุดนี้ในกลุ่มโพสต์ที่พูดถึง libs 32- บิตที่หายไปในระบบ 64- บิต
Michael Burr

readelf -a zls | grep "Requesting program interpreter"จะพิมพ์ตัวโหลด
Kevin Smyth
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.