2017-03-19 72 views
1

我交叉編譯的hello.c與ARM-Linux的gnueabi-GCC用arm-linux-xxx-gcc編譯的用戶程序在x86機器上運行?

>arm-linux-gnueabi-gcc -static -o hello hello.c -g 

我檢查./hello的格式,它是一個手臂的用戶程序!

>file ./hello 
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=d56f37000fa4ae28889f3c785ed55b1dd48bdda7, not stripped 

,和QEMU臂能夠運行./hello

>qemu-arm ./hello 
hello, world 

那麼,我爲什麼可以運行打招呼直接與./hello

>./hello 
hello, world 

爲什麼以及如何發生的?


2017年3月19日修訂:

我已經測試了x86_64的用戶程序不與QEMU臂可運行

> gcc -o hello_x86 hello.c 
> qemu-arm hello_x86 
hello_x86: Invalid ELF image for this architecture 

2017年3月19日修訂:

我在本文中刪除gdb部分。 gdb在這裏功能不正確。我看到的程序集不是來自這個程序。

+0

你一直在玩[binfmt_misc(https://開頭恩.wikipedia.org /維基/ Binfmt_misc)? '文件hello'仍然顯示ARM?運行'pwd',並確保你的路徑仍然在你的想法。 –

+1

直到你提到它,我對binfmt_misc一無所知。這個精靈可能同時包含x86和arm嗎? –

+0

您的系統可能已配置(可能使用[binfmt_misc](https://en.wikipedia.org/wiki/Binfmt_misc)...)在ARM的每個ELF文件上運行'qemu-arm'。 –

回答

0

事實上,我需要鏈接地址爲0x0010000的軟件才能在主機上執行guest代碼,因爲QEMU仿真器專門用於模擬Linux訪客系統;由於這個原因,它的啓動過程具體實現:-kernel選項從地址0x00010000開始在系統內存中加載一個二進制文件(通常是Linux內核)。模擬器開始地址0x00000000執行,所以我們需要把我們的二進制的正確ADRESS

我遵循這個tutorial和它的作品對我來說

相關問題