Je sais qu'il y a des questions similaires, mais je n'ai trouvé aucune solution ni ce cas précis. Le binaire a été construit sur Arch Linux en utilisant son GCC 4.7. Le package fonctionne bien sur le système de génération. Les commandes ci-dessous ont été exécutées sur:
Linux vbox-ubuntu 3.2.0-29-generic # 46-Ubuntu SMP ven 27 juil 17:03:23 UTC 2012 x86_64 x86_64 x86_64 GNU / Linux
Le fichier en question se trouve ici . Il s'agit d'un compilateur croisé Linux 64 bits vers Windows 64 bits. Le décompresser ~/
donne un ~/mingw64
répertoire unique qui contient tout le nécessaire.
Quand j'essaye de lancer ~/mingw64/x86_64-w64-mingw32/bin/as
c'est ce que j'obtiens:
bash: /home/ruben/mingw64/x86_64-w64-mingw32/bin/as: No such file or directory
La course file ~/mingw64/x86_64-w64-mingw32/bin/as
me donne:
/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
La course ldd ~/mingw64/x86_64-w64-mingw32/bin/as
me donne:
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)
Je suis vraiment perdu. Toute aide est très appréciée.
EDIT : Quelques détails supplémentaires: Le système de construction est Arch Linux (actuellement glibc 2.16). La sortie de ls -l
est:
-rwxr-xr-x 2 ruben users 1506464 11 aug 23:49 /home/ruben/mingw64/bin/x86_64-w64-mingw32-as
La sortie de objdump -p
est:
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
La sortie de ldd -v
sur Ubuntu 12.04 est:
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
Les autres systèmes d'exploitation testés sont Fedora 17 (glibc 2.15) et Ubuntu 12.04 (eglibc 2.15). Les exigences des versions zlib et glibc sont respectées.
Réponses:
Si je tourne
ldd -v as
sur mon système, j'obtiens:Donc oui, il semble que ces fichiers binaires recherchent un
GLIBC_2.14
symbole, ce qui vous manque probablement sur votre système. Comme l'a fait remarquer Svenx, il semble qu'il cherche lememcpy@@GLIBC_2.14
symbole. Des informations supplémentaires sur les raisons pour lesquellesmemcpy
une nouvelle version a été fournie sont décrites dans ce rapport de bogue .L'installation d'une nouvelle version de
glibc
sur votre système cible devrait le corriger. Si vous souhaitez essayer de reconstruire le binaire pour continuer à fonctionner sur l'ancienne version deglibc
, vous pouvez essayer des astuces comme celle répertoriée ici . Vous pouvez également vous débrouiller avec une cale qui fournit simplement la version spécifique dumemcpy
symbole dont vous avez besoin, mais cela devient un peu hacky.Après avoir lu votre mise à jour : vous avez raison, ce n'était pas votre problème. Mais je pense que je l'ai trouvé: votre binaire demande l'interpréteur
/lib/ld-linux-x86-64.so.2
, qui n'existe pas sur les systèmes Ubuntu 12.04:Bien qu'il
ldd
sache le trouver à la/lib64
place, je suppose que le noyau ne le sait pas lorsqu'il essaie d'exécuter le binaire et ne peut pas trouver l'interpréteur demandé du fichier. Vous pouvez essayer de l'exécuter manuellement via l'interpréteur:Je ne suis pas sûr à 100% que cela fonctionne correctement - sur mon système, le fonctionnement de
gcc
cette façon donne un défaut de segmentation. Mais c'est au moins un problème différent.la source
:(
/lib64
sur amd64, et apparemment Arch corrige manuellement leurs sources gcc pour changer cela, garantissant ainsi une incompatibilité avec toutes les autres distributions Linux. Voir les commentaires de ce rapport de bogue pour leur raisonnement bizarre. Pour moi, ce serait un signe d'avertissement clair pour rester loin d'Arch Linux.patchelf
fonctionnait pour eux.Votre problème est une variante du message "Introuvable" lors de l'exécution d'un binaire 32 bits sur un système 64 bits : vous avez un exécutable qui mentionne un chargeur dynamique qui n'est pas là.
Dans votre cas, le chargeur dynamique
/lib/ld-linux-x86-64.so.2
existe mais à un emplacement différent/lib64/ld-linux-x86-64.so.2
. Le moyen le plus simple de faire fonctionner vos programmes serait de créer un lien symbolique:la source