Intento compilar algún código C para un sistema Linux basado en ARM (personalizado). Instalé Ubuntu VM con un compilador cruzado llamado arm-linux-gnueabi-gcc-4.4 porque parecía lo que necesitaba. Ahora cuando compilo mi código con esta gcc, se produce un binario de la siguiente manera:Compilación cruzada para un sistema Linux basado en ARM incrustado
$ 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
Cuando trato de ejecutar este binario en el Linux embebido, me sale
$ ./test1
-sh: ./test1: not found
permisos son suficientes. Sólo puedo imaginar que algo anda mal con el formato binario, así que busqué en algún binaria de trabajo como referencia:
$ file referenceBinary
referenceBinary: ELF 32-bit LSB executable, ARM, version 1, dynamically linked
(uses shared libs), stripped
veo que hay algunas diferencias, pero no tienen el conocimiento para derivar qué es exactamente lo que necesito arreglar y cómo puedo arreglar eso. ¿Alguien puede explicar qué diferencia es crítica?
Otra cosa Miré son las dependencias:
$ ldd test1
libc.so.6 => not found (0x00000000)
/lib/ld-linux.so.3 => /lib/ld-linux.so.3 (0x00000000)
(Curiosamente, esto funciona en el sistema de destino aunque no puede ejecutar el binario.) El sistema embebido sólo tiene un libc.so.0
disponible. Supongo que necesito decirle al compilador la versión de libc que quiero vincular, pero según tengo entendido, gcc solo enlaza con la versión que viene, ¿es correcto? ¿Qué puedo hacer al respecto?
Editar: Aquí está el Makefile que utilizo:
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 tiene poca memoria, el 'uClibc' mucho más pequeño puede sustituir a' glibc'. Sin embargo, necesitaría un compilador * gcc * creado para usar 'uClibc'. Un método (relativamente) fácil de obtener una cadena de herramientas de trabajo de * gcc *, * uClibc * (o * glibc *) y amigos, además de construir el kernel de Linux, Busybox y otros paquetes, todo desde el origen, es usar 'BuildRoot'. Con una buena combinación compilador + libc, puede vincular su aplicación estáticamente y ser independiente de las bibliotecas del objetivo. – sawdust