2012-08-09 37 views
4

我在學習一門課程中學習arm彙編語言。我在入門時遇到小問題。我已經寫了一個簡單的C代碼:與qemu一起運行二進制文件

int main() 
{ 
    int a = 10; 
    int b = 20; 
    int c = a+b; 
} 

然後,我通過給予命令使用GNU臂它轉換成彙編代碼:

arm-elf-gcc -S first.c 

這個生成包含彙編代碼的文件first.s:

arm-elf-gcc -g first.s 
012:
.file "first.c" 
    .text 
    .align 2 
    .global main 
    .type main, %function 
main: 
    @ args = 0, pretend = 0, frame = 12 
    @ frame_needed = 1, uses_anonymous_args = 0 
    mov ip, sp 
    stmfd sp!, {fp, ip, lr, pc} 
    sub fp, ip, #4 
    sub sp, sp, #12 
    mov r3, #10 
    str r3, [fp, #-16] 
    mov r3, #20 
    str r3, [fp, #-20] 
    ldr r2, [fp, #-16] 
    ldr r3, [fp, #-20] 
    add r3, r2, r3 
    str r3, [fp, #-24] 
    mov r0, r3 
    sub sp, fp, #12 
    ldmfd sp, {fp, sp, pc} 
    .size main, .-main 
    .ident "GCC: (GNU) 3.4.3" 

然後我使用下面的命令編譯彙編代碼

這生成了a.out二進制文件。然後我試圖用QEMU使用命令運行的a.out:

qemu-arm a.out 

但這產生輸出

Segmentation fault 

我找不到錯誤,我究竟做錯了什麼?

回答

4

您試圖在用戶模式下運行qemu。您還需要鏈接與arm對應的庫。

看看下面的pkg中的腳本文件。

http://wiki.qemu.org/download/linux-user-test-0.3.tar.gz

您將需要運行的qemu -L library_PATH_ARM ./a.out

+0

我用命令'QEMU臂-L ./gnemul/qemu-arm。/ a.out'但沒有幫助,它再次給出相同的'Segmentation fault'。我已經從linux-user-test文件夾粘貼了'gnemul'文件夾。 – UNK 2012-08-10 10:33:57

+1

試用** qemu-arm -L/usr/arm-linux-gnueabi/./a.out**。在此之前,您需要安裝arm-linux-gnueabi-gcc。並使用arm-linux-gnueabi-gcc進行編譯。這對我有用。 – 2012-08-12 14:01:26

相關問題