thực thi tệp nhị phân: không tìm thấy tệp


9

Tôi biết có những câu hỏi tương tự ngoài kia, nhưng tôi đã không tìm thấy một giải pháp cũng như trường hợp chính xác này. Nhị phân được xây dựng trên Arch Linux bằng GCC 4.7. Gói hoạt động tốt trên hệ thống xây dựng. Các lệnh dưới đây đã được thực hiện trên:

Linux vbox-ub Ubuntu 3.2.0-29-generic # 46-Ubuntu SMP Thứ Sáu 27 tháng 7 17:03:23 UTC 2012 x86_64 x86_64 x86_64 GNU / Linux

Các tập tin trong câu hỏi được đặt ở đây . Đó là trình biên dịch chéo Linux 64 bit sang Windows 64 bit. Tháo gỡ nó để ~/cung cấp một ~/mingw64thư mục chứa tất cả mọi thứ cần thiết.

Khi tôi cố chạy, ~/mingw64/x86_64-w64-mingw32/bin/asđây là những gì tôi nhận được:

bash: /home/ruben/mingw64/x86_64-w64-mingw32/bin/as: No such file or directory

Chạy file ~/mingw64/x86_64-w64-mingw32/bin/ascho tôi:

/home/ruben/mingw64/x86_64-w64-mingw32/bin/as: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x0b8e50955e7919b76967bac042f49c5876804248, not stripped

Chạy ldd ~/mingw64/x86_64-w64-mingw32/bin/ascho tôi:

    linux-vdso.so.1 =>  (0x00007fff3e367000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f2ceae7e000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2ceaac1000)
    /lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f2ceb0a8000)

Tôi thực sự thua lỗ. Bất kỳ sự giúp đỡ nào cũng được đánh giá cao.

EDIT : Một số chi tiết khác: Hệ thống xây dựng là Arch Linux (hiện tại là glibc 2.16). Đầu ra của ls -llà:

-rwxr-xr-x 2 ruben users 1506464 11 aug 23:49 /home/ruben/mingw64/bin/x86_64-w64-mingw32-as

Đầu ra của objdump -plà:

Version References:
  required from libz.so.1:
    0x0827e5c0 0x00 05 ZLIB_1.2.0
  required from libc.so.6:
    0x0d696917 0x00 06 GLIBC_2.7
    0x06969194 0x00 04 GLIBC_2.14
    0x0d696913 0x00 03 GLIBC_2.3
    0x09691a75 0x00 02 GLIBC_2.2.5

Đầu ra của ldd -vUbuntu 12.04 là:

    linux-vdso.so.1 =>  (0x00007fff225ff000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fd525c71000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd5258b4000)
/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fd525e9b000)

Version information:
/home/ruben/mingw64/x86_64-w64-mingw32/bin/as:
    libz.so.1 (ZLIB_1.2.0) => /lib/x86_64-linux-gnu/libz.so.1
    libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
    libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
    libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
    libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libz.so.1:
    libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
    libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
    libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libc.so.6:
    ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
    ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2

Các hệ điều hành khác được thử nghiệm là Fedora 17 (glibc 2.15) và Ubuntu 12.04 (eglibc 2.15). Cả hai yêu cầu phiên bản zlib và glibc đều được đáp ứng.


Đây chỉ là một lỗi đánh máy hay bạn thực sự đang cố chạy '~ / mingw64 / x86_64-w64-mingw32 / as' ... nó thiếu thư mục 'bin'.
tăng gấp ba lần

@tripledes loại, và sửa.
rubenvb

Thật kỳ lạ, chỉ cần cố gắng tải xuống, cho đến khi tôi ~ và tôi nhận được kết quả bỏ qua. Bạn có thể cung cấp một ls -l ~ / mingw64 / x86_64-w64-mingw32 / bin / as?
tăng gấp ba

1
Nó có thể là một phiên bản libc không phù hợp? Hãy thử chạy "objdump -p <path / to / as>" và kiểm tra phần "Tham chiếu phiên bản". Có vẻ như nó phụ thuộc vào GLIBC_2,14, có thể được coi là khá mới. Phiên bản hệ thống của bạn là gì? "Readelf -a <path / to / as> | less" và grep cho GLIBC, bạn sẽ thấy rằng nó sử dụng memcpy từ 2.14. Tôi không biết tại sao phiên bản sẽ thay đổi nhiều giữa các cuộc gọi thư viện khác nhau.
svenx

Câu trả lời:


8

Nếu tôi chạy ldd -v astrên hệ thống của mình, tôi nhận được:

./as: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by ./as)
        linux-vdso.so.1 =>  (0x00007fff89ab1000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f1e4c81f000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1e4c498000)
        /lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f1e4ca6d000)

Vì vậy, có vẻ như những nhị phân này đang tìm kiếm một GLIBC_2.14biểu tượng, mà bạn có lẽ đang thiếu trên hệ thống của bạn. Như svenx đã chỉ ra, có vẻ như nó đang tìm kiếm memcpy@@GLIBC_2.14biểu tượng. Một số thông tin thêm về lý do tại sao memcpyđược cung cấp một phiên bản mới được mô tả trong báo cáo lỗi này .

Cài đặt phiên bản mới glibctrên hệ thống đích của bạn sẽ khắc phục nó. Nếu bạn muốn thử xây dựng lại nhị phân để vẫn hoạt động trên phiên bản cũ glibc, bạn có thể thử các thủ thuật như được liệt kê ở đây . Bạn cũng có thể nhận được bằng một shim chỉ cung cấp phiên bản cụ thể của memcpybiểu tượng mà bạn cần, nhưng điều đó có một chút khó khăn.


Sau khi đọc cập nhật của bạn : bạn đã đúng, đó không phải là vấn đề của bạn. Nhưng tôi nghĩ rằng tôi đã tìm thấy nó: nhị phân của bạn đang yêu cầu trình thông dịch /lib/ld-linux-x86-64.so.2, không tồn tại trên các hệ thống Ubuntu 12.04:

$ readelf -a ./as | grep interpreter
      [Requesting program interpreter: /lib/ld-linux-x86-64.so.2]

Mặc dù lddbiết để tìm nó /lib64thay vào đó, tôi cho rằng kernel không biết rằng khi nó cố chạy nhị phân và không thể tìm thấy trình thông dịch được yêu cầu của tệp. Bạn có thể thử chạy nó thông qua trình thông dịch theo cách thủ công:

$ pwd
/home/jim/mingw64/x86_64-w64-mingw32/bin
$ ./as --version
-bash: ./as: No such file or directory
$ /lib64/ld-linux-x86-64.so.2 ./as --version
GNU assembler (rubenvb-4.7.1-1-release) 2.23.51.20120808
Copyright 2012 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `x86_64-w64-mingw32'.

Tôi không chắc chắn 100% điều này đang hoạt động chính xác - trên hệ thống của tôi, chạy gcctheo cách này gây ra lỗi phân đoạn. Nhưng đó ít nhất là một vấn đề khác.


1
Đó sẽ là tốt đẹp, nếu đây là trường hợp. Xem cập nhật:(
rubenvb

Tôi đã cập nhật câu trả lời của mình.
Jim Paris

Oh, tốt. Loại này hút. Tôi không thể nghĩ ra một cách hay để giải quyết vấn đề này (và tiếp tục xây dựng trên Arch). Bạn có ý tưởng tuyệt vời nào không?
rubenvb

1
Không hẳn vậy. Arch thật là ngu ngốc - Tiêu chuẩn gia truyền tập tin hệ thống tập tin rõ ràng nói rằng các thư viện nên có trong /lib64amd64 và rõ ràng Arch đã tự vá các nguồn gcc của mình để thay đổi điều này, do đó đảm bảo không tương thích với mọi bản phân phối Linux khác ngoài đó. Xem các bình luận của báo cáo lỗi này cho lý do kỳ lạ của họ. Đối với tôi, đây sẽ là một dấu hiệu cảnh báo rõ ràng để tránh xa Arch Linux.
Jim Paris

1
Điều đó nói rằng, bạn có thể thay đổi vị trí thông dịch viên bằng cách sử dụng patchelf . Xem bài đăng này cho một người khác gặp phải vấn đề này, người đã tuyên bố rằng patchelfđã làm việc cho họ.
Jim Paris

0

Vấn đề của bạn là một biến thể của thông báo "Không tìm thấy" khi chạy nhị phân 32 bit trên hệ thống 64 bit : bạn có một tệp thực thi có đề cập đến trình tải động không có ở đó.

Trong trường hợp của bạn, trình tải động /lib/ld-linux-x86-64.so.2tồn tại nhưng ở một vị trí khác /lib64/ld-linux-x86-64.so.2. Cách đơn giản nhất để làm cho chương trình của bạn hoạt động là tạo một liên kết tượng trưng:

ln -s ../lib64/ld-linux-x86-64.so.2 /lib/

tốt, vì đây là một gói có nghĩa là để phân phối lại, một liên kết tượng trưng như vậy không thực sự nằm trong tầm kiểm soát của tôi. Tôi nghĩ rằng nhị phân Linux sẽ dễ mang theo hơn ... đoán không.
rubenvb
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.