arm-none-eabi-ld -Ttext=0x20 -o add.elf add.o 有什么用

What is the use of arm-none-eabi-ld -Ttext=0x20 -o add.elf add.o

我正在练习汇编编程,我的疑问是 arm-none-eabi-ld -Ttext=0x20 -o add.elf.the 标签获取从 0x20 到 0x2C 的地址,因为有 4 条指令和每条指令是 4 bytes.The 程序计数器包含要获取的指令的地址,这里的 R15 是它包含值 0x0C 的 PC。它如何保存 0x0C,它应该有地址 0x2C。那arm-none-eabi-ld -Ttext=0x20 -o add.elf有什么用,把text段放在0x20。我是菜鸟,所以如果能用简单的术语和逐步的方式解释会很有帮助。

  1. arm-none-eabi-as add.s -o add.o
start:   
  mov r0, #5
  mov r1, #2
  add r2, r1, r0
stop:
   b stop

arm-none-eabi-ld -Ttext=0x20 -o add.elf.

user@stretch:~/Desktop/Gnu_Toolchain/Adding_Two_Numbers$ arm-none-eabi-nm -n add.elf
         U _start
**00000020** t start
0000002c t stop

qemu-system-arm -M connex -pflash flash.bin -nographic -serial /dev/null

info registers
R00=00000005 R01=0000000c R02=00000011 R03=00000000
R04=00000000 R05=00000000 R06=00000000 R07=00000000
R08=00000000 R09=00000000 R10=00000000 R11=00000000
R12=00000000 R13=00000000 R14=00000000 **R15=0000000c**
start:
  mov r0, #5
  mov r1, #2
  add r2, r1, r0
stop:
   b stop


arm-none-eabi-as so.s -o so.o
arm-none-eabi-ld -Ttext=0x20 -o add.elf
arm-none-eabi-ld: no input files
arm-none-eabi-ld -Ttext=0x20 so.o -o add.elf
arm-none-eabi-ld: warning: cannot find entry symbol _start; defaulting to 0000000000000020
arm-none-eabi-objdump -d add.elf

add.elf:     file format elf32-littlearm


Disassembly of section .text:

00000020 <start>:
  20:   e3a00005    mov r0, #5
  24:   e3a01002    mov r1, #2
  28:   e0812000    add r2, r1, r0

0000002c <stop>:
  2c:   eafffffe    b   2c <stop>

所以你在问题中遗漏了一些东西,你没有显示 _start 的定义,你的命令行不完整等等。

我看不出 nm 的转储寄存器有什么关系,也看不出为什么 nm 会输出这些内容。 -Ttext=0x20 的意思是你告诉 linker 该代码将被放置在处理器内存 space 的地址 0x20 中,因此它需要 link 该地址的代码.该分支是相对于 pc 的,因此它与位置无关,因此对于此示例,您最终会得到相同的机器代码,而与此代码所在的地址无关。

当您执行此代码时(nm 不执行代码)并且如果此代码在您指定的内存中,那么分支将开始执行,PC 设置为 0x2C+8 = 0x34 并且在执行分支 0x2C。了解程序计数器是一个伪寄存器,实际上有多个程序计数器,一个用于在执行期间进行数学计算,一个用于获取,一个用于可能的分支目的地,还有一个在调试器中转储寄存器时看到。

但要查看其中任何内容,您需要实际 运行 它并使用停止执行和检查寄存器的工具。为了正确地做到这一点,你需要将它的内存放在 linked 地址和 运行 那里。您无法从二进制文件中静态看到任何内容。