2013-04-23 80 views
10

我使用qemu,qemu-user和安裝的gnueabi工具鏈運行Linux Mint 14。我用arm-linux-gnueabi-gcc test.c -o test編譯了test.c。qemu-arm無法運行arm編譯的二進制文件

當我嘗試運行qemu-arm /usr/arm-linux-gnueabi/lib/ld-linux.so.3 test

我得到一個錯誤說:test: error while loading shared libraries: test: cannot open shared object file: No such file or directory。運行qemu-arm test,正如我以前的嘗試,給出/lib/ld-linux.so.3: No such file or directory

但是,該文件確實存在,並且可以訪問。

$ stat /usr/arm-linux-gnueabi/lib/ld-linux.so.3 
    File: `/usr/arm-linux-gnueabi/lib/ld-linux.so.3' -> `ld-2.15.so' 
    Size: 10   Blocks: 0   IO Block: 4096 symbolic link 
Device: 801h/2049d Inode: 4083308  Links: 1 
Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root) 
Access: 2013-04-22 16:19:48.090613901 -0700 
Modify: 2012-09-21 08:31:29.000000000 -0700 
Change: 2013-04-22 15:58:41.042542851 -0700 
Birth: - 

有誰知道我怎樣才能使QEMU運行的ARM程序,而不必效仿的整個手臂的Linux內核?

test.c的是

#include <stdio.h> 
int main() { 
    printf("this had better work\n"); 
} 

file test

test: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.31, BuildID[sha1]=0xf2e49db65394b77c77ee5b65b83c0cc9220cbfc0, not stripped 
+4

如果在沒有OS的情況下運行,printf是你想要做的最後一件事,當然不是你想爲該系統編寫的第一個程序。打開一個在qemu上沒有意義的led,但是將一個字符從串行端口/ uart干擾到串行終端通常是不重要的。你也想從一個彙編程序開始,而不是C,因爲你必須確保你瞭解內存映射,程序加載的地方等等,引導代碼也不是微不足道的。 – 2013-04-23 17:01:52

+0

這來自未安裝arm庫作爲系統庫(即使它們被安裝爲交叉編譯器的目標庫)。如果發行版支持它,那麼可以將arm安裝爲多目標目標(如同時支持x86和x86_64)。在Ubuntu中,這就像'apt-add-architecture arm && apt-get install libc6:arm'。我不知道薄荷。如果你不想去考慮它,只需用'-static'編譯。 – sh1 2017-09-15 21:00:08

回答

1

如果你想運行ARM沒有Linux的,那麼你需要一個不同的編譯器(至少)。 arm-linux-gnueabi-gcc是一個編譯器,用於Linux。編譯器和libc密切相關。你將需要一個newlib編譯器和一個可移植層qemu

參見:BalauGoogle newlib+qemu。 A newlib端口託管在Github,似乎與Balau博客相同。

通常,非Linux gcc被稱爲arm-none-eabi-gcc。前綴arm-none-eabi-被某些配置腳本識別。

+2

如果你想讓系統調用很重要,對於不需要系統調用的裸機工作,你大部分可以使用工具鏈的arm-linux-gnueabi或arm-none-eabi風格。 – 2013-04-23 14:35:35

+1

http://github.com/dwelch67/yagbat有一個qemu目錄,我正在做一個單獨的qemu裸機示例回購,但沒有任何發佈。 – 2013-04-23 14:36:57

+0

@dwelch對,你也可以用'-nostdlib'進行編譯,但是你必須編寫你自己的庫和'libgcc'的東西。例如,當*除以零時*,Linux *版本的'libgcc'與'newlib'(我認爲重置)有所不同。我認爲這個海報最好用* newlib * gcc,但如果你小心的話,你可以使用'arm-linux-gnueabi-gcc'編譯器。這條路線很可能會遇到很多隨機的鏈接器/加載器錯誤,這些錯誤往往不容易理解。 – 2013-04-23 14:57:29

4

我通過將以下庫複製到/ lib來解決問題,但我相信應該有一種更好的解決方案,而不是我發明的這個討厭的解決方案!

sudo cp /usr/arm-linux-gnueabi/lib/ld-linux.so.3 /lib 
sudo cp /usr/arm-linux-gnueabi/lib/libgcc_s.so.1 /lib 
sudo cp /usr/arm-linux-gnueabi/lib/libc.so.6 /lib 

請讓我知道是否有其他更好的解決方案,因爲我有興趣知道。

+3

當然這是可行的,但在這種情況下你需要運行Linux。原來的問題是想避免** Linux。您沒有複製這些庫並運行沒有Linux內核的* qemu *虛擬機?這似乎不可能。 – 2013-05-25 14:37:38

+0

我發現-L/usr/arm-linux-gnueabihf /選項可以使qemu-arm工作,如上所述...... – muman 2015-09-25 05:24:55

+0

@artlessnoise,這裏沒什麼錯。這個答案使得庫對於qemu可見,所以模擬的二進制將鏈接。它不是啓動一個模擬的Linux系統。它仍在使用系統調用模擬。 – sh1 2017-09-15 20:37:15

18

您可以通過使用-L標誌提供一個路徑到arm-linux-gnueabi共享庫來運行該示例。

qemu-arm -L /usr/arm-linux-gnueabi/ 

也確保沒有設置LD_LIBRARY_PATH。

unset LD_LIBRARY_PATH 
+0

Ubuntu-16.04軟件包'gcc-arm-linux-gnueabihf'的'-L/usr/arm-linux-gnueabihf'。 – 2016-06-23 18:31:46

9

我在運行帶有彙編代碼的C程序時也遇到了這個問題。我的解決辦法是建立一個能與選項「-static」的可執行文件,例如

arm-linux-gnueabi-gcc -static -g main.c square.s 

然後

qemu-arm a.out 

不會報告錯誤說「找不到/ lib目錄/ LD-Linux操作系統。 so.3" 。

唯一的缺點是可執行文件可能具有較大的大小。但是當你只是想測試你的代碼時它很有用。

當然,你可以使用巴勞的方法(請參閱artless noise的回答)。但是如果你不想在這個步驟中感受到像「UART串行端口」那樣的沮喪,那只是運行一個簡單的「測試」功能,請嘗試一下我的修復。

3
$ export QEMU_LD_PREFIX=/usr/arm-linux-gnueabi 

這適用於我。 它基本上是同樣的事情:

$ qemu-arm -L /usr/arm-linux-gnueabi/ 

你可以把它添加到〜/ .bashrc文件,這樣你就不必每次你打開終端輸入。

0

一個適用於我的變體是直接傳遞加載器庫並使用加載器參數--library-path指定所需的庫路徑。例如:

$ TOOLCHAIN_ROOT=/usr/local/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/arm-linux-gnueabihf 
$ qemu-arm $TOOLCHAIN_ROOT/libc/lib/ld-linux-armhf.so.3 --library-path $TOOLCHAIN_ROOT/libc/lib/arm-linux-gnueabihf:/$TOOLCHAIN_ROOT/lib ./my_executable 

或等價出口LD_LIBRARY_PATH,而不是使用--library-path

相關問題