mengeksekusi file biner: file tidak ditemukan

9

Saya tahu ada pertanyaan serupa di luar sana, tetapi saya belum menemukan solusi atau kasus yang tepat ini. Biner dibangun di Arch Linux menggunakan GCC 4.7-nya. Paket ini berfungsi dengan baik pada sistem build. Perintah di bawah ini dijalankan pada:

Linux vbox-ubuntu 3.2.0-29-generic # 46-Ubuntu SMP Jumat 27 Jul 17:03:23 UTC 2012 x86_64 x86_64 x86_64 GNU / Linux

File yang dimaksud terletak di sini . Ini adalah Linux 64-bit untuk Windows 64-bit cross-compiler. Batalkan untarring untuk ~/memberikan ~/mingw64direktori tunggal yang berisi semua yang dibutuhkan.

Ketika saya mencoba menjalankan ~/mingw64/x86_64-w64-mingw32/bin/asinilah yang saya dapatkan:

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

Berlari file ~/mingw64/x86_64-w64-mingw32/bin/asmemberi saya:

/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

Berlari ldd ~/mingw64/x86_64-w64-mingw32/bin/asmemberi saya:

    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)

Saya benar-benar bingung. Bantuan apa pun sangat kami hargai.

EDIT : Beberapa detail lebih lanjut: Sistem build adalah Arch Linux (saat ini glibc 2.16). Output dari ls -ladalah:

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

Output dari objdump -padalah:

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

Output dari ldd -vpada Ubuntu 12.04 adalah:

    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

OS lain yang diuji adalah Fedora 17 (glibc 2.15) dan Ubuntu 12.04 (eglibc 2.15). Persyaratan versi zlib dan glibc terpenuhi.

rubenvb
sumber
apakah ini hanya kesalahan ketik atau Anda benar-benar mencoba menjalankan '~ / mingw64 / x86_64-w64-mingw32 / as' ... itu tidak ada folder 'bin'.
tripledes
Jenis @ tripledes, dan diperbaiki.
rubenvb
aneh, baru mencoba mengunduh, untar di bawah ~ saya dan saya mendapatkan hasil yang diharapkan. Bisakah Anda memberikan ls -l ~ / mingw64 / x86_64-w64-mingw32 / bin / as?
lipat
1
Mungkinkah itu versi ketidakcocokan libc? Coba jalankan "objdump -p <path / to / as>" dan periksa bagian "Referensi Versi". Itu bisa terlihat seperti itu tergantung pada GLIBC_2.14, yang dapat dianggap cukup baru. Apa versi sistem Anda? "readelf -a <path / to / as> | less" dan grep untuk GLIBC, Anda akan melihat bahwa ia menggunakan memcpy dari 2.14. Saya tidak tahu mengapa versinya akan sangat bervariasi antara panggilan perpustakaan yang berbeda.
svenx

Jawaban:

8

Jika saya menjalankan ldd -v assistem saya, saya mendapatkan:

./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)

Jadi ya, sepertinya binari-binari ini mencari GLIBC_2.14simbol, yang mungkin Anda lewatkan pada sistem Anda. Seperti yang ditunjukkan oleh svenx, sepertinya memcpy@@GLIBC_2.14simbol itu sedang dicari . Beberapa informasi lebih lanjut tentang mengapa memcpydiberi versi baru dijelaskan dalam laporan bug ini .

Menginstal versi baru glibcpada sistem target Anda harus memperbaikinya. Jika Anda ingin mencoba membangun kembali biner agar tetap berfungsi pada versi lama glibc, Anda bisa mencoba trik seperti yang tercantum di sini . Anda mungkin juga bisa bertahan dengan shim yang hanya menyediakan versi spesifik dari memcpysimbol yang Anda butuhkan, tetapi itu akan menjadi sedikit berantakan.


Setelah membaca pembaruan Anda: Anda benar, itu bukan masalah Anda. Tapi saya rasa saya sudah menemukannya: biner Anda meminta penerjemah /lib/ld-linux-x86-64.so.2, yang tidak ada di sistem Ubuntu 12.04:

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

Meskipun lddtahu untuk menemukannya /lib64, saya kira kernel tidak tahu bahwa ketika mencoba menjalankan biner dan tidak dapat menemukan penerjemah yang diminta file. Anda dapat mencoba menjalankannya melalui interpreter secara manual:

$ 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'.

Saya tidak 100% yakin ini berfungsi dengan benar - pada sistem saya, menjalankan gcccara ini memberikan kesalahan segmentasi. Tapi itu setidaknya masalah yang berbeda.

Jim Paris
sumber
1
Itu akan menyenangkan, jika ini masalahnya. Lihat pembaruan:(
rubenvb
Saya telah memperbarui jawaban saya.
Jim Paris
Wow, baiklah. Jenis ini menyebalkan. Saya tidak bisa memikirkan cara yang layak untuk mengatasi masalah ini (dan terus membangun di Arch). Apakah Anda punya ide cemerlang?
rubenvb
1
Tidak juga. Arch hanya bersikap bodoh - Filesystem Heirarchy Standard dengan jelas mengatakan bahwa perpustakaan harus /lib64menggunakan amd64, dan tampaknya Arch secara manual menambal sumber gcc mereka untuk mengubah ini, sehingga menjamin ketidakcocokan dengan setiap distribusi Linux lainnya di luar sana. Lihat komentar laporan bug ini untuk alasan aneh mereka. Bagi saya, ini akan menjadi tanda peringatan yang jelas untuk menjauh dari Arch Linux.
Jim Paris
1
Yang mengatakan, Anda dapat mengubah lokasi juru bahasa menggunakan patchelf . Lihat posting ini untuk orang lain yang mengalami masalah ini, yang mengklaim bahwa itu patchelfberhasil untuk mereka.
Jim Paris
0

Masalah Anda adalah varian dari Mendapatkan pesan "Tidak ditemukan" ketika menjalankan biner 32-bit pada sistem 64-bit : Anda memiliki executable yang menyebutkan loader dinamis yang tidak ada.

Dalam kasus Anda, pemuat dinamis /lib/ld-linux-x86-64.so.2ada tetapi di lokasi yang berbeda /lib64/ld-linux-x86-64.so.2. Cara paling sederhana untuk membuat program Anda berfungsi adalah dengan membuat tautan simbolik:

ln -s ../lib64/ld-linux-x86-64.so.2 /lib/
Gilles 'SANGAT berhenti menjadi jahat'
sumber
baik, karena ini adalah paket yang dimaksudkan untuk mendistribusikan kembali, symlink seperti itu tidak benar-benar dalam kendali saya. Saya pikir binari Linux akan lebih portabel ... kira tidak.
rubenvb