2012-09-20 18 views
7

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 
+0

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

Respuesta

4

Lo que probablemente debería hacer es instalar libc6 en el sistema embebido. Lea this thread sobre un problema similar. La solución en el puesto # 5 fue instalar:

libc6_2.3.6.ds1-13etch9_arm.deb 
linux-kernel-headers_2.6.18-7_arm.deb 
libc6-dev_2.3.6.ds1-13etch9_arm.deb 

Su otra opción es conseguir que el libc del sistema embebido en su máquina virtual y luego pasarlo a la gcc enlazador y utilice la opción -static.

Esta solución también se mencionó en el hilo anterior. Lea más acerca de la vinculación estática here.

Otras cosas para probar:

En this thread que sugieren la eliminación de la bandera -mabi=apcs-gnu de su makefile si está usando uno.

This article sugiere feedint gcc la bandera -nostdlib si está compilando desde la línea de comandos.

O podría cambiar a usar el compilador arm-none-eabi-gcc. Las referencias sobre esto se pueden encontrar here y here.

+0

No puedo instalar el software en el sistema integrado, pero al vincularlo con la libc del sistema aparece este error: 'ld: error: el objeto de origen ../libc.so.0 tiene la versión EABI 0, pero el destino principal tiene la versión 5 de EABI. Los resultados de google para este error implican que realmente necesito un gcc diferente, ¿es correcto? – flyx

+0

@flyx ¿Está utilizando un archivo make o está ejecutando gcc directamente en la línea de comandos? –

+0

@flyx Consulte la edición para ver otras cosas para probar que podrían ser útiles –

Cuestiones relacionadas