我嘗試爲嵌入式(定製)基於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
當我嘗試運行嵌入式Linux此二進制,我得到
$ ./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只是與它附帶的版本鏈接,這是正確的嗎?我能做些什麼呢?
編輯:這是我使用的Makefile:
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'。但是,您需要一個* gcc *編譯器來構建使用'uClibc'。獲得* gcc *,* uClibc *(或* glibc *)工作工具鏈和朋友以及從源代碼構建Linux內核,Busybox和其他軟件包的一種(相對)簡單的方法是使用'BuildRoot'。使用良好的編譯器+ libc組合,您可以靜態鏈接您的應用程序,並獨立於目標庫。 – sawdust