2012-09-20 60 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 

當我嘗試運行嵌入式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 
+0

如果你對內存緊張,小得多的'uClibc'可以代替'glibc'。但是,您需要一個* gcc *編譯器來構建使用'uClibc'。獲得* 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 

你的另一個選擇是讓從嵌入式系統libc到你的虛擬機,然後將它傳遞給gcc連接器,並使用-static選項。

此解決方案也在上述線程中提到。詳細瞭解靜態鏈接here

其他的事情嘗試:

this thread他們建議從你的makefile,如果你使用一個卸下-mabi=apcs-gnu標誌。

This article建議feedint gcc -nostdlib標誌如果您從命令行編譯。

或者你可以切換到使用arm-none-eabi-gcc編譯器。可以參考herehere

+0

我無法在嵌入式系統上安裝軟件,但鏈接到系統的libc時出現此錯誤:'ld:error:源對象../libc.so.0具有EABI版本0,但目標主包含EABI版本5'。這個錯誤的谷歌結果意味着我實際上需要一個不同的gcc,這是正確的嗎? – flyx

+0

@flyx您是使用makefile還是直接在命令行上運行gcc? –

+0

@flyx請參閱編輯其他的東西嘗試可能有幫助 –