Comment faire pour résoudre “error while loading shared libraries” lorsque vous essayez d'exécuter un bras binaire avec qemu-arm?
Je suis sous Linux Mint 14 avec qemu, qemu-utilisateur, et le gnueabi de la chaîne d'installé. J'ai compilé test.c avec arm-linux-gnueabi-gcc test.c -o test
.
Quand j'essaie de l'exécuter qemu-arm /usr/arm-linux-gnueabi/lib/ld-linux.so.3 test
J'obtiens un message d'erreur disant: test: error while loading shared libraries: test: cannot open shared object file: No such file or directory
. L'exécution de qemu-arm test
, comme je l'ai déjà essayé, donne /lib/ld-linux.so.3: No such file or directory
Cependant, le fichier existe et est accessible.
$ stat /usr/arm-linux-gnueabi/lib/ld-linux.so.3
File: `/usr/arm-linux-gnueabi/lib/ld-linux.so.3' -> `ld-2.15.so'
Size: 10 Blocks: 0 IO Block: 4096 symbolic link
Device: 801h/2049d Inode: 4083308 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2013-04-22 16:19:48.090613901 -0700
Modify: 2012-09-21 08:31:29.000000000 -0700
Change: 2013-04-22 15:58:41.042542851 -0700
Birth: -
Personne ne sait comment je peux faire qemu exécuter un bras de programme sans avoir à émuler un ensemble de bras de noyau Linux?
test.c est
#include <stdio.h>
int main() {
printf("this had better work\n");
}
et file test
est
test: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.31, BuildID[sha1]=0xf2e49db65394b77c77ee5b65b83c0cc9220cbfc0, not stripped
Cela vient du bras de bibliothèques n'étant pas installé en tant que système de bibliothèques (même s'ils sont installés en tant que cible des bibliothèques pour le cross-compilateur). Si la distribution prend en charge, alors vous pouvez installer bras comme un multiarch cible (comme x86 et x86_64 sont pris en charge simultanément). Dans Ubuntu parler c'est quelque chose comme
apt-add-architecture arm && apt-get install libc6:arm
. Je ne sais pas la menthe. Juste compiler avec -static
si vous ne voulez pas de penser à elle.OriginalL'auteur David | 2013-04-23
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez exécuter BRAS sans Linux, alors vous avez besoin d'un compilateur différent (au moins).
arm-linux-gnueabi-gcc
est un compilateur pour Linux. Le compilateur etlibc
sont intimement liés. Vous aurez besoin d'unnewlib
compilateur avec une couche de portabilité pour qemu.le portage newlibVoir: Balau et Google newlib+qemu. Un
newlib
port est hébergé à Github et semble le même que le Balau blog.Généralement un non-Linux gcc est appelé
arm-none-eabi-gcc
. Le préfixe arm-none-eabi- est reconnu par certains scripts de configuration.github.com/dwelch67/yagbat a un qemu répertoire, je suis en train de travailler sur un autre qemu métal nu exemple repo, mais n'ont rien à publier encore.
À droite, vous pouvez le compilateur avec
-nostdlib
trop, mais alors vous avez votre propre code de la bibliothèque et de lalibgcc
choses. Par exemple, lorsque vous diviser par zéro, Linux version delibgcc
fait quelque chose de différent quenewlib
(qui la remet, je pense). Je pense que cette affiche est mieux avec un newlib gcc, mais vous avez raison, vous pourriez utiliser learm-linux-gnueabi-gcc
compilateur si vous êtes prudent. Cet itinéraire est susceptible d'obtenir beaucoup d'aléatoire de l'éditeur de liens/chargeur erreurs qui ne sont souvent pas facile à comprendre.La clé de votre réponse est "portabilité couche pour qemu" c'est une grosse affaire. Tout les vieux arm-none-eabi ne fonctionnera pas si vous faites des appels système. Mais si vous ne faites pas le système des appels d'arm-linux-gnueabi ou arm-none-eabi fonctionnera comme un compilateur, et de renforcer l'idée que vous utilisez -nostdlib, etc...si vous pouvez construire vos propres ou trouver un newlib pour la plate-forme puis certainement aller avec arm-none-eabi.
OriginalL'auteur artless noise
vous pouvez exécuter l'exemple en fournissant un chemin d'accès à l'arm-linux-gnueabi shared libs à l'aide de l'option-L.
assurez-vous également que le LD_LIBRARY_PATH n'est pas définie.
-L /usr/arm-linux-gnueabihf
pour Ubuntu 16.04 paquetgcc-arm-linux-gnueabihf
.OriginalL'auteur vivek_v
J'ai également rencontré ce problème lors de l'exécution d'un programme C avec du code assembleur. Ma solution est de construire l'exécutable avec l'option "-statique", par exemple
Puis
ne pas signaler l'erreur en disant: "vous ne trouvez pas l' /lib/ld-linux..3".
Le seul inconvénient est que le fichier exécutable pourrait être une de grande taille. Mais il est utile lorsque vous voulez juste tester votre code.
Bien sûr, vous pouvez aller avec la méthode de Balau(voir naïve bruit de la réponse). Mais si vous ne voulez pas vous sentir frustré par quelque chose comme "série UART ports" dans cette étape, qui n'est qu'à l'exécution d'un simple "test" de la fonction, rendez-vous pour un essai de mon fix.
-static
fonctionne comme un charme?OriginalL'auteur Ning
J'ai résolu le problème en copiant les bibliothèques suivantes dans /lib, mais je crois qu'il devrait être un moyen de trouver la meilleure solution plutôt que de ce méchant solution que j'ai inventé!
S'il vous plaît laissez-moi savoir si il y a d'autres solutions bien meilleures que je suis intéressé de savoir.
J'ai trouvé l'-L /usr/arm-linux-gnueabihf/ option pour qemu-arm de travail, comme suggéré ci-dessus...
il n'y a rien de mal, ici. Cette réponse rend les bibliothèques visible à qemu, de sorte que le émulé binaire lien. Il n'est pas d'amorcer un émulé système Linux. C'est encore à l'aide de syscall émulation.
c'est ce que qemu ne]. D'abord, il doit être capable de lier le BRAS binaire contre le BRAS de bibliothèques (sauf si elle est statique), puis ceux des bibliothèques de faire des appels système et qemu les pièges de ces appels système et les traduit ensuite à l'OS hôte. Il est beaucoup plus efficace que d'avoir à les émuler un ensemble de BRAS de noyau Linux. Cette solution se déplace simplement les bibliothèques à un endroit où qemu peut les trouver. Ces bibliothèques ont encore à faire des appels système pour rien d'intéressant à se produire.
Droit, mais le BRAS de syscall interface n'est pas le même que le x86. Certaines choses n'existent pas sur qui sur l'autre. qemu doit faire cette traduction, ou, dans certains cas, mettre en œuvre; ce qui peut ne pas être possible, car il a besoin d'un accès direct à Linux internes. Il semble de moins en moins buggé pour l'utilisation d'un bras, aucun compilateur. Encore une fois, cela dépend de ce que vous essayez d'atteindre. Je n'ai pas dit cela ne fonctionne pas dans tous les cas. Cependant, il a des compromis à d'autres solutions.
OriginalL'auteur Mona Jalal
Cela fonctionne pour moi.
C'est essentiellement la même chose que:
Vous pouvez l'ajouter à la ~/.bashrc fichier afin de ne pas avoir à le saisir à chaque fois que vous ouvrez le terminal.
OriginalL'auteur Mita_
Une variante, qui a travaillé pour moi, a été de passer le chargeur de la bibliothèque directement et afin de préciser l'bibliothèque de tracés à l'aide du chargeur de paramètre
--library-path
. Par exemple:Ou, de manière équivalente à l'exportation
LD_LIBRARY_PATH
au lieu d'utiliser--library-path
.OriginalL'auteur nucleon