2012-09-20 2 views
7

임베디드 (사용자 정의) ARM 기반 Linux 시스템 용으로 일부 C 코드를 컴파일하려고합니다. 내가 필요로하는 것처럼 보이기 때문에 arm-linux-gnueabi-gcc-4.4라는 크로스 컴파일러로 Ubuntu VM을 설정했습니다. 나는이 GCC 내 코드를 컴파일 할 때 지금,이 같은 바이너리를 생성합니다 나는 임베디드 리눅스 바이너리를 실행하려고하면임베디드 ARM 기반 Linux 시스템 용 교차 컴파일

$ 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 

, 나는

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

권한이 충분 얻을. 난 단지 뭔가 바이너리 형식과 잘못된 것을 상상할 수있는, 그래서 참고로 일부 작업 바이너리 보았다 :

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

나는 약간의 차이가 있음을 볼 수 있지만 내가 필요 정확히 도출하기 위해 지식이없는 고칠 수있는 방법과 내가 고칠 수 있습니다. 누군가가 어떤 차이가 중요하다고 설명 할 수 있습니까?

내가 쳐다 보면서 또 다른 것은

은 종속 있습니다 :

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

(는 바이너리를 실행할 수 있지만 흥미롭게도,이 대상 시스템에서 작동합니다.) 임베디드 시스템 만 사용할 수 libc.so.0 있습니다. 나는 컴파일러에게 내가 링크하고 싶은 libc 버전을 알려줄 필요가 있다고 생각하지만, 이해할 때, gcc는 그것이 제공하는 버전에 대한 링크만을 제공한다. 그것에 대해 무엇을 할 수 있습니까?

편집 :

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

메모리가 부족하다면, 훨씬 더 작은'uClibc'가'glibc'를 대체 할 수 있습니다. 그러나 'uClibc'를 사용하기 위해서는 * gcc * 컴파일러가 필요합니다. * gcc *, * uClibc * (또는 * glibc *)와 친구들의 작업 툴 체인을 얻는 것뿐만 아니라 Linux 커널, Busybox 및 기타 패키지를 소스에서 모두 빌드하는 쉬운 (상대적으로) 쉬운 방법은'BuildRoot'를 사용하는 것입니다. 좋은 컴파일러 + libc 조합을 사용하면 앱을 정적으로 링크 할 수 있으며 타겟 라이브러리와 독립적입니다. – sawdust

답변

4

당신이 할 아마해야하는 임베디드 시스템에 libc6를 설치하는 것입니다 : 여기 내가 사용하는 메이크입니다. 유사한 문제에 대해 this thread을 읽으십시오. 포스트 # 5의 솔루션을 설치했다 :

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 

귀하의 다른 옵션은 VM에 임베디드 시스템에서 libc을 얻을 후 gcc 링커에 전달하고 -static 옵션을 사용하는 것입니다.

이 해결책은 또한 위 스레드에서 언급되었습니다. 정적 연결에 대한 자세한 내용은 here을 참조하십시오.

다른 것을 시도하기 : 당신이 하나를 사용하는 경우 그들이 당신의 메이크에서 -mabi=apcs-gnu 플래그를 제거하는 것이 좋습니다 this thread에서

.

This article은 명령 줄에서 컴파일하는 경우 feedint gcc -nostdlib 플래그를 제안합니다.

또는 arm-none-eabi-gcc 컴파일러로 전환 할 수 있습니다. 이것에 참고는 herehere 찾아 낼 수있다.

+0

임베디드 시스템에 소프트웨어를 설치할 수 없지만 시스템의 libc에 연결하면이 오류가 발생합니다.'ld : error : 소스 객체 ../libc.so.0에는 EABI 버전 0이 있지만 대상 메인에는 EABI 버전 5가 있습니다 .' 이 오류에 대한 Google 검색 결과는 실제로 다른 gcc가 필요하다는 것을 의미합니다. 올바른 내용입니까? – flyx

+0

@flyx makefile을 사용하고 있습니까, 아니면 명령 행에서 gcc를 직접 실행하고 있습니까? –

+0

@flyx 도움이 될만한 시도를 편집 해보십시오 –

관련 문제