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