Cross-Compilation pour l'embarqué ARM-Linux basée sur le système de

J'essaie de compiler du code C pour l'embarqué (personnalisé) ARM-Linux basée sur le système. - Je configurer une machine virtuelle Ubuntu avec un cross-compilateur nommé arm-linux-gnueabi-gcc-4.4 parce qu'il semblait que j'avais besoin. Maintenant, quand je compile mon code avec cette gcc, il produit un binaire comme ceci:

$ file test1
test1: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked
(uses shared libs), for GNU/Linux 2.6.31,
BuildID[sha1]=0x51b8d560584735be87adbfb60008d33b11fe5f07, not stripped

Lorsque j'essaie d'exécuter ce fichier binaire sur le Linux embarqué, - je obtenir

$ ./test1
-sh: ./test1: not found

Autorisations sont suffisantes. Je peux seulement imaginer que quelque chose de mal avec le format binaire, donc j'ai regardé quelques binaire travail comme référence:

$ file referenceBinary
referenceBinary: ELF 32-bit LSB executable, ARM, version 1, dynamically linked
(uses shared libs), stripped

Je vois qu'il y a quelques différences, mais je n'ai pas les connaissances nécessaires pour tirer exactement ce que j'ai besoin de fixer et comment je peux résoudre ce problème. Quelqu'un peut m'expliquer quelle différence est critique?

Une autre chose que j'ai regardé sont les dépendances:

$ ldd test1
    libc.so.6 => not found (0x00000000)
    /lib/ld-linux.so.3 => /lib/ld-linux.so.3 (0x00000000)

(En fait, cela fonctionne sur le système cible, bien qu'il ne peut pas exécuter le binaire.) Le système embarqué n'a qu'un libc.so.0 disponibles. Je suppose que j'ai besoin de dire au compilateur de la version de la libc je veux le lien "contre", mais comme je le comprends, gcc juste des liens par rapport à la version il est livré avec, est-ce correct? Que puis-je faire à ce sujet?

Edit: Voici le Makefile que j'utilise:

CC=/usr/bin/arm-linux-gnueabi-gcc-4.4
STRIP=/usr/bin/arm-linux-gnueabi-strip          
CFLAGS=-I/usr/arm-linux-gnueabi/include             
LDFLAGS=-nostdlib
LDLIBS=../libc.so.0

SRCS=test1.c
OBJS=$(subst .c,.o,$(SRCS))

all: test1

test1: $(OBJS)
    $(CC) $(LDFLAGS) -o main $(OBJS) $(LDLIBS)
    $(STRIP) main

depend: .depend

.depend: $(SRCS)
    rm -f ./.depend
    $(CC) $(CFLAGS) -MM $^>>./.depend;

clean:
    rm -f $(OBJS)

include .depend
Si vous êtes serré sur la mémoire, de la plus petite uClibc peut se substituer à glibc. Cependant, vous auriez besoin d'un gcc compilateur construit à utiliser uClibc. Un (relativement) facile de se procurer un travail de la chaîne de gcc, uClibc (ou glibc) et les amis plus la construction du noyau Linux, Busybox, et d'autres paquets de la source est d'utiliser BuildRoot. Avec un bon compilateur + libc combinaison, vous pouvez lier votre application de manière statique, et être indépendant de la cible des bibliothèques.

OriginalL'auteur flyx | 2012-09-20