用arm-linux-xxx-gcc编译的用户程序在x86机器上运行?

时间:2017-03-19 06:52:11

标签: linux gcc cross-compiling

我用arm-linux-gnueabi-gcc

交叉编译了hello.c
>arm-linux-gnueabi-gcc -static -o hello hello.c -g

我已经检查了./hello的格式,它是一个arm用户程序!

>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-arm能够运行./hello

>qemu-arm ./hello
hello, world

然后,为什么我可以直接用./hello

运行你好
>./hello
hello, world

为什么以及如何发生这种情况?

2017/3/19编辑:

我已经测试过用qemu-arm

无法运行x86_64用户程序
> gcc -o hello_x86 hello.c
> qemu-arm hello_x86
hello_x86: Invalid ELF image for this architecture

2017/3/19编辑:

我删除了本文中的gdb部分。这里gdb功能不正常。我看到的装配不是来自这个程序。

1 个答案:

答案 0 :(得分:0)

实际上我需要链接地址0x0010000的软件才能在主机上执行访客代码,因为QEMU仿真器专门用于模拟Linux客户系统;因此,它的启动过程是专门实现的:-kernel选项在系统内存中加载一个二进制文件(通常是一个Linux内核),从地址0x00010000开始。模拟器在地址0x00000000处开始执行,因此我们需要将二进制文件放在正确的地址

我遵循此tutorial,它适用于我