assembly - 启动 ARM 汇编 - 无法执行二进制文件

标签 assembly arm raspberry-pi

我刚刚开始学习 ARM 汇编(在 RaspberryPi 上)。

我编写了以下程序,helloworld.s:

.data
HelloWorld:
    .ascii "Hello World\n"

.text
.globl _start
_start:
    mov r7, #4 
    mov r0, #1
    ldr r1,=HelloWorld
    mov r2, #12
    svc #0

    mov r7, #1
    mov r0, #42
    svc #0

我可以组装它(我假设链接是自动的,就像 gcc 一样)。

chris@raspberrypi ~/elf $ as helloworld.s 
chris@raspberrypi ~/elf $ file a.out
a.out: ELF 32-bit LSB relocatable, ARM, version 1 (SYSV), not stripped

但是没有运行:

chris@raspberrypi ~/elf $ chmod 755 a.out 
chris@raspberrypi ~/elf $ ./a.out 
-bash: ./a.out: cannot execute binary file

我错过了什么?

a.out 不可执行(默认情况下)这一事实是否表明了某种情况?

这是可执行文件:

chris@raspberrypi ~/elf $ xxd a.out 
0000000: 7f45 4c46 0101 0100 0000 0000 0000 0000  .ELF............
0000010: 0100 2800 0100 0000 0000 0000 0000 0000  ..(.............
0000020: bc00 0000 0000 0005 3400 0000 0000 2800  ........4.....(.
0000030: 0900 0600 0470 a0e3 0100 a0e3 1010 9fe5  .....p..........
0000040: 0c20 a0e3 0000 00ef 0170 a0e3 2a00 a0e3  . .......p..*...
0000050: 0000 00ef 0000 0000 4865 6c6c 6f20 576f  ........Hello Wo
0000060: 726c 640a 4115 0000 0061 6561 6269 0001  rld.A....aeabi..
0000070: 0b00 0000 0601 0801 2c01 002e 7379 6d74  ........,...symt
0000080: 6162 002e 7374 7274 6162 002e 7368 7374  ab..strtab..shst
0000090: 7274 6162 002e 7265 6c2e 7465 7874 002e  rtab..rel.text..
00000a0: 6461 7461 002e 6273 7300 2e41 524d 2e61  data..bss..ARM.a
00000b0: 7474 7269 6275 7465 7300 0000 0000 0000  ttributes.......
00000c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000e0: 0000 0000 1f00 0000 0100 0000 0600 0000  ................
00000f0: 0000 0000 3400 0000 2400 0000 0000 0000  ....4...$.......
0000100: 0000 0000 0400 0000 0000 0000 1b00 0000  ................
0000110: 0900 0000 0000 0000 0000 0000 d002 0000  ................
0000120: 0800 0000 0700 0000 0100 0000 0400 0000  ................
0000130: 0800 0000 2500 0000 0100 0000 0300 0000  ....%...........
0000140: 0000 0000 5800 0000 0c00 0000 0000 0000  ....X...........
0000150: 0000 0000 0100 0000 0000 0000 2b00 0000  ............+...
0000160: 0800 0000 0300 0000 0000 0000 6400 0000  ............d...
0000170: 0000 0000 0000 0000 0000 0000 0100 0000  ................
0000180: 0000 0000 3000 0000 0300 0070 0000 0000  ....0......p....
0000190: 0000 0000 6400 0000 1600 0000 0000 0000  ....d...........
00001a0: 0000 0000 0100 0000 0000 0000 1100 0000  ................
00001b0: 0300 0000 0000 0000 0000 0000 7a00 0000  ............z...
00001c0: 4000 0000 0000 0000 0000 0000 0100 0000  @...............
00001d0: 0000 0000 0100 0000 0200 0000 0000 0000  ................
00001e0: 0000 0000 2402 0000 9000 0000 0800 0000  ....$...........
00001f0: 0800 0000 0400 0000 1000 0000 0900 0000  ................
0000200: 0300 0000 0000 0000 0000 0000 b402 0000  ................
0000210: 1900 0000 0000 0000 0000 0000 0100 0000  ................
0000220: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000230: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000240: 0300 0100 0000 0000 0000 0000 0000 0000  ................
0000250: 0300 0300 0000 0000 0000 0000 0000 0000  ................
0000260: 0300 0400 0100 0000 0000 0000 0000 0000  ................
0000270: 0000 0300 0c00 0000 0000 0000 0000 0000  ................
0000280: 0000 0100 0f00 0000 2000 0000 0000 0000  ........ .......
0000290: 0000 0100 0000 0000 0000 0000 0000 0000  ................
00002a0: 0300 0500 1200 0000 0000 0000 0000 0000  ................
00002b0: 1000 0100 0048 656c 6c6f 576f 726c 6400  .....HelloWorld.
00002c0: 2461 0024 6400 5f73 7461 7274 0000 0000  $a.$d._start....
00002d0: 2000 0000 0202 0000                       .......

           .......

最佳答案

正如 Paul R 指出的那样,gcc -nostartfiles helloworld.s 应该可以解决问题。

只需调用 as 即可构建一个可在其他程序中使用的目标文件(例如构建 C 代码时的 .o 文件)。

file 应该告诉您 a.out 实际上是一个可执行文件:

a.out: ELF 32-bit LSB executable, ARM, ....

如果您需要进一步的建议,我不会从头开始编写汇编程序。相反,用 C 编写样板代码并使用 GCC's inline assembly features只要您愿意,就可以随时参加集会。这样您就可以在汇编中编写整个函数,但仍然有 C 来支持您执行诸如打印结果等操作。

关于assembly - 启动 ARM 汇编 - 无法执行二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23109435/

相关文章:

assembly - 为什么 ARM 内核在使用 ELF 和二进制文件时表现不同

c - Truestudio atollic(基于 eclipse 的 IDE)创建空的二进制文件,尽管没有空的 elf 文件和大量代码

c - 硬故障处理 - Arm Cortex-M0

opencv - USB网络摄像头在带有opencv的树莓派上运行缓慢

Python 限制每秒按键输入

c - 将另一个程序集成到使用 CMake 编译的现有程序中

javascript - 有没有办法查看由任何 JavaScript jit(尤其是 V8)生成的代码的汇编代码?

assembly - 汇编程序 (fasm) - 读取字符

c++ - 无法在汇编中链接 C++ 函数

linux - tcpdump 错误消息 "That device doesn' t 支持监控模式”