ikili dosyayı yürütme: dosya bulunamadı


9

Orada benzer sorular olduğunu biliyorum, ama bir çözüm bulamadım ya da tam olarak bu durumda. İkili, GCC 4.7 kullanılarak Arch Linux üzerinde oluşturuldu. Paket yapı sisteminde iyi çalışıyor. Aşağıdaki komutlar:

Linux vbox-ubuntu 3.2.0-29-genel # 46-Ubuntu SMP Cum 27 Temmuz 17:03:23 UTC 2012 x86_64 x86_64 x86_64 GNU / Linux

Söz konusu dosya burada bulunmaktadır . Bir Linux 64-bit Windows 64-bit çapraz derleyici. Bunu açmak ~/, ~/mingw64gereken her şeyi içeren tek bir dizin verir .

Ben çalıştırmak için çalıştığınızda ~/mingw64/x86_64-w64-mingw32/bin/asne olsun:

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

Koşmak file ~/mingw64/x86_64-w64-mingw32/bin/asbana:

/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

Koşmak ldd ~/mingw64/x86_64-w64-mingw32/bin/asbana:

    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)

Gerçekten kayboldum. Herhangi bir yardım çok takdir edilmektedir.

EDIT : Bazı ayrıntılar: Derleme sistemi Arch Linux (şu anda glibc 2.16). Çıktı ls -l:

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

Çıktı objdump -p:

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

ldd -vUbuntu 12.04'teki çıktı :

    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

Test edilen diğer işletim sistemleri Fedora 17 (glibc 2.15) ve Ubuntu 12.04'tür (eglibc 2.15). Hem zlib hem de glibc sürüm gereksinimleri karşılanır.


sadece bir yazım hatası mı yoksa aslında '~ / mingw64 / x86_64-w64-mingw32 /' olarak çalıştırmaya çalışıyorsunuz ... 'bin' klasörü eksik.
Üçlü

@ tripledes yazın ve düzeltildi.
rubenvb

garip, sadece indirmeye çalıştı, benim altında untar ~ ve beklenen sonucu elde. Bir ls -l ~ / mingw64 / x86_64-w64-mingw32 / bin / as sağlayabilir misiniz?
Üçlü

1
Bir libc sürümü uyuşmazlığı olabilir mi? "Objdump -p <path / to / as>" komutunu çalıştırmayı deneyin ve "Sürüm Referansları" bölümünü inceleyin. Oldukça yeni olarak kabul edilebilecek GLIBC_2.14'e bağlı gibi görünebilir. Sistem sürümünüz nedir? "readelf -a <yol / to / as> | less" ve GLIBC için grep, bunun 2.14'ten itibaren memcpy kullandığını göreceksiniz. Sürümün neden farklı kütüphane çağrıları arasında bu kadar çok değiştiğini bilmiyorum.
svenx

Yanıtlar:


8

ldd -v asSistemimde çalışırsam şunu elde ederim:

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

Evet, görünüşe göre, bu ikili dosyalar GLIBC_2.14sisteminizde muhtemelen eksik olan bir sembol arıyor . Svenx'in işaret ettiği gibi, memcpy@@GLIBC_2.14sembolü arıyor gibi görünüyor . Neden memcpyyeni sürümün verildiği hakkında daha fazla bilgi bu hata raporunda açıklanmaktadır .

glibcHedef sisteminize yeni bir sürümünün yüklenmesi sorunu çözmelidir. Hala eski sürümü üzerinde çalışmak için ikili yeniden oluşturmak glibcistiyorsanız, burada listelenen gibi hileler deneyebilirsiniz . Ayrıca, sadece memcpyihtiyacınız olan sembolün belirli bir sürümünü sağlayan bir şim ile de alabilirsiniz , ancak bu biraz hileli olur.


Güncellemenizi okuduktan sonra : haklısınız, bu sizin probleminiz değildi. Ama bence buldum: İkili /lib/ld-linux-x86-64.so.2programınız Ubuntu 12.04 sistemlerinde mevcut olmayan yorumlayıcıyı istiyor:

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

İken lddde nerede bulacağını bilen /lib64onun yerine, çekirdek bu ikili çalıştırmayı denediğinde bilmiyor ve dosyanın istenen tercüman bulamıyorum varsayalım. Sadece yorumlayıcı üzerinden manuel olarak çalıştırmayı deneyebilirsiniz:

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

% 100 emin değilim bu doğru çalışıyor - benim sistemde, gccbu şekilde çalışan bir segmentasyon hatası verir. Ama bu en azından farklı bir problem.


1
Durum böyleyse, bu hoş olurdu. Güncellemeye bakın:(
rubenvb

Cevabımı güncelledim.
Jim Paris

Vay canına tamam. Bu tür berbat. Bu soruna geçici bir çözüm bulmak (ve Arch üzerinde bina devam) düşünemiyorum. Parlak fikirleriniz var mı?
rubenvb

1
Pek sayılmaz. Arch sadece aptal - Dosya Sistemi Heirarchy Standardı açıkça kütüphanelerin amd64'te olması gerektiğini söylüyor /lib64ve görünüşe göre Arch bunu değiştirmek için gcc kaynaklarını elle yamalı ve böylece diğer tüm Linux dağıtımlarıyla uyumsuzluğu garanti ediyor . Tuhaf gerekçeleri için bu hata raporunun yorumlarına bakın . Bana göre, bu Arch Linux'tan uzak durmak için açık bir uyarı işareti olurdu.
Jim Paris

1
Bununla birlikte, patchelf kullanarak tercüman konumunu değiştirebilirsiniz . Bu sorunla karşılaşan ve onlar için çalıştığını iddia eden başka bir kişi için bu gönderiye bakın patchelf.
Jim Paris

0

Sorununuz, 64 bit bir sistemde 32 bit ikili dosya çalıştırırken "Bulunamadı" iletisinin alınmasının bir varyantıdır : Orada olmayan bir dinamik yükleyiciden bahseden bir çalıştırıcınız var.

Sizin durumunuzda, dinamik yükleyici /lib/ld-linux-x86-64.so.2var ancak farklı bir konumda /lib64/ld-linux-x86-64.so.2. Programlarınızı çalıştırmanın en basit yolu sembolik bir bağlantı oluşturmaktır:

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

Bu yeniden dağıtım amaçlı bir paket olduğundan, böyle bir sembolik bağlantı benim kontrolümde değil. Linux ikili dosyalarının daha taşınabilir olacağını düşündüm.
rubenvb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.