web-dev-qa-db-fra.com

Comment résoudre "erreur lors du chargement de bibliothèques partagées" lors de la tentative d'exécution d'un binaire arm avec qemu-arm?

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
10
David

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.

1
artless noise

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
20
vivek_v

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.

9
Ning

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.

5
Mona Jalal
$ 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.

3
Mita_

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.

0
nucleon