Không có tệp hoặc thư mục nào như vậy trên một tệp thực thi, nhưng tệp tồn tại và ldd báo cáo tất cả các thư viện hiện tại


13

Vì vậy, bằng bất kỳ lệnh nào khác, tập tin thực thi tồn tại, nhưng khi tôi cố gắng thực thi nó, nó tuyên bố nó không có ở đó.

Nó không phải là một ký tự đặc biệt trong tên bởi vì tôi đã đổi tên nó thành một "con mèo". Và nó dường như là một hệ nhị phân cho kiến ​​trúc chính xác ... "dường như", tôi đoán câu hỏi là, cái gì khác ném thông báo lỗi BESIDES ... tập tin không có ở đó, vì rõ ràng nó là IS!

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 (Ngoài ra, bản phân phối của tôi là Debian wheezy.)

i686

tập tin 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

con mèo

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

thời gian

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

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

1
Thế còn LD_DEBUG=all /lib/ld-lsb.so.3 ./zls?
Stéphane Chazelas

1
Một điều về điều này: nó nói rằng "su: "có vẻ như bạn đang thực thi một system()hoặc một cái gì đó từ bên trong chương trình và nó nói rằng sau khi nó không suthể tìm thấy tệp thực thi trong thư mục mà nó kết thúc. Điều gì xảy ra nếu bạn sao chép hoặc symlink nó đến /binhoặc cái gì đó?
Bratchley

Hãy thử xem objdump -j .interp -s ./zls. Tôi nghi ngờ rằng sẽ liệt kê các tập tin không tồn tại.
derobert

Câu trả lời:


20

Điều này trông giống như một trình tải bị thiếu . Câu chuyện ngắn: trình tải động mà chương trình mong đợi bị thiếu và các thông báo lỗi bị sai trong trường hợp này. Vì tôi không nghĩ rằng tôi đã thảo luận về điều đó trước đây, hãy để tôi giải thích phần có liên quan của đầu ra ldd. Hầu hết nó bao gồm các dòng của hình thức library_soname => /path/to/library_file.

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

Trong số các thư viện, chúng tôi thấy một cái gì đó không phải là thư viện dùng chung: đó là chương trình tải các thư viện dùng chung. Chương trình đang yêu cầu /lib/ld-lsb.so.3, nhưng kernel không tìm thấy nó, vì vậy nó báo cáo không có tập tin hoặc thư mục nào như vậy. Tuy nhiên, lddkhông tìm thấy trình tải, vì lddlà một tập lệnh bao bọc gọi trình tải mã hóa cứng trong một môi trường đặc biệt và trình tải luôn báo cáo đường dẫn của chính nó cho dù chương trình của trình tải dự kiến ​​là gì.

Bạn có /lib/ld-linux.so.2trên hệ thống của mình, đó là vị trí tiêu chuẩn thực tế cho trình tải ELF trên các hệ thống Linux x86_32. Chương trình yêu cầu /lib/ld-lsb.so.3, đó là vị trí tiêu chuẩn de jure .

Cài đặt hỗ trợ LSB tối thiểu của bản phân phối của bạn, ví dụ như lsb-coregói trên Debian. Nếu bản phân phối của bạn không có điều đó (hầu hết làm), hãy tạo một liên kết tượng trưng /lib/ld-lsb.so.3 -> ld-linux.so.2. Trong tuyệt vọng, bạn có thể gọi trình tải một cách rõ ràng : /lib/ld-linux.so.2 ./xls.


Thật vậy, trình tải là những gì mà dòng objdump sẽ in ra. Tôi quên nó thực sự là trong lddđầu ra. Nắm bắt tốt!
derobert

Đây chính xác là vấn đề tôi thấy, với thông báo lỗi sai. Một vấn đề là 'ldd' sẽ không chạy nếu trình tải động không xuất hiện bởi vì nó (ít nhất là trên centos) một tập lệnh shell.
dajobe

Cảm ơn bạn vì bài đăng hữu ích nhất này trong số các bài đăng nói về các lib 32 bit bị thiếu trên hệ thống 64 bit.
Michael Burr

readelf -a zls | grep "Requesting program interpreter"sẽ in bộ nạp.
Kevin Smyth
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.