J'utilise Linux Mint 14 avec qemu, qemu-user et la chaîne d'outils gnueabi installée. J'ai compilé test.c avec arm-linux-gnueabi-gcc test.c -o test
.
Quand j'essaye de lancer qemu-arm /usr/arm-linux-gnueabi/lib/ld-linux.so.3 test
Je reçois une erreur en disant: test: error while loading shared libraries: test: cannot open shared object file: No such file or directory
. Lancer 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: -
Est-ce que quelqu'un sait comment je peux faire que qemu exécute un programme arm sans avoir à émuler un noyau Linux arm entier?
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
Si vous voulez exécuterARMsans Linux, vous avez besoin d'un compilateur différent (au moins). arm-linux-gnueabi-gcc
est un compilateur pour Linux . Le compilateur et libc
sont intimement liés. Vous aurez besoin d'un compilateur newlib
avec une couche de portabilité pour qemu.portant newlib
Voir: Balau et Google newlib + qemu . Un port newlib
est hébergé sur Github et ressemble au blog Balau.
Généralement, un gcc non-Linux s'appelle arm-none-eabi-gcc
. Le préfixe arm-none-eabi- _ est reconnu par certains scripts de configuration.
vous pouvez exécuter l'exemple en fournissant un chemin d'accès aux bibliothèques partagées arm-linux-gnueabi à l'aide de l'indicateur -L.
qemu-arm -L /usr/arm-linux-gnueabi/
assurez-vous également que LD_LIBRARY_PATH n'est pas défini.
unset LD_LIBRARY_PATH
J'ai également rencontré ce problème lors de l'exécution d'un programme C avec le code d'assemblage. Ma solution est de construire l'exécutable avec l'option "-static", par exemple
arm-linux-gnueabi-gcc -static -g main.c square.s
Ensuite
qemu-arm a.out
ne signalera pas l'erreur en disant "ne trouve pas le fichier /lib/ld-linux.so.3".
Le seul inconvénient est que l'exécutable pourrait être de grande taille. Mais c'est utile lorsque vous voulez juste tester votre code.
Bien sûr, vous pouvez utiliser la méthode de Balau (voir la réponse de Artless noise). Mais si vous ne voulez pas vous sentir frustré par quelque chose comme "Ports série UART" dans cette étape, qui consiste uniquement à exécuter une fonction "test" simple, essayez mon correctif.
J'ai résolu le problème en copiant les bibliothèques suivantes dans/lib mais je pense qu'il devrait exister une solution plus efficace que la solution que j'ai inventée!
Sudo cp /usr/arm-linux-gnueabi/lib/ld-linux.so.3 /lib
Sudo cp /usr/arm-linux-gnueabi/lib/libgcc_s.so.1 /lib
Sudo cp /usr/arm-linux-gnueabi/lib/libc.so.6 /lib
S'il vous plaît laissez-moi savoir s'il existe d'autres solutions meilleures que je suis intéressé à connaître.
$ export QEMU_LD_PREFIX=/usr/arm-linux-gnueabi
Cela fonctionne pour moi. C'est fondamentalement la même chose que:
$ qemu-arm -L /usr/arm-linux-gnueabi/
Vous pouvez l'ajouter au fichier ~/.bashrc pour ne pas avoir à le taper à chaque fois que vous ouvrez le terminal.
Une variante qui fonctionnait pour moi consistait à transmettre directement la bibliothèque du chargeur et à spécifier les chemins de bibliothèque requis à l'aide du paramètre de chargeur --library-path
. Par exemple:
$ TOOLCHAIN_ROOT=/usr/local/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/arm-linux-gnueabihf
$ qemu-arm $TOOLCHAIN_ROOT/libc/lib/ld-linux-armhf.so.3 --library-path $TOOLCHAIN_ROOT/libc/lib/arm-linux-gnueabihf:/$TOOLCHAIN_ROOT/lib ./my_executable
Ou exportez de manière équivalente LD_LIBRARY_PATH
au lieu d'utiliser --library-path
.