【问题标题】:Running binary file with qemu使用 qemu 运行二进制文件
【发布时间】:2012-08-06 14:59:43
【问题描述】:

我正在我的一门课程中学习 arm 汇编语言。我在开始时没有什么问题。我写了一个简单的c代码:

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

然后我使用 gnu arm 通过给出命令将其转换为汇编代码:

arm-elf-gcc -S first.c

这会生成一个包含汇编代码的文件 first.s:

    .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"

然后我使用以下命令编译了汇编代码:

arm-elf-gcc -g first.s

这生成了一个.out 二进制文件。然后我尝试使用命令用 qemu 运行 a.out:

qemu-arm a.out

但这会产生输出

Segmentation fault

我找不到错误,我做错了什么?

【问题讨论】:

    标签: assembly arm qemu


    【解决方案1】:

    您正试图在用户模式下运行 qemu。你还需要链接arm对应的库。

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

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

    您需要运行 qemu -L library_PATH_ARM ./a.out

    【讨论】:

    • 我使用了命令qemu-arm -L ./gnemul/qemu-arm ./a.out 但没有帮助,它再次给出相同的Segmentation fault。我已经从 linux-user-test 文件夹中粘贴了gnemul 文件夹。
    • 试试 qemu-arm -L /usr/arm-linux-gnueabi/ ./a.out。在此之前,您需要安装 arm-linux-gnueabi-gcc。并且还使用 arm-linux-gnueabi-gcc 进行编译。这对我有用。
    猜你喜欢
    • 2018-05-17
    • 2021-02-27
    • 1970-01-01
    • 2014-12-23
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 2018-07-24
    相关资源
    最近更新 更多