链接器的作用
c文件和汇编文件会被编译为.o 文件,链接器把所有.o文件链接为二进制可执行文件。
有三种可执行文件:一种是.elf,一种是.bin,.hex是一种特殊的可执行文件
链接器的工作步骤:
1.符号解析(Symbol Resolution)
2.重定向(Relocating)
1.符号解析
## main.s
arr: .byte 10, 20, 25 @ Read-only array of bytes
eoa: @ Address of end of array + 1
.align
start:
ldr r0, =arr @ r0 = &arr
ldr r1, =eoa @ r1 = &eoa
bl sum @ Invoke the sum subroutine
stop: b stop
## sum-sub.s
.global sum
sum: mov r3, #0 @ r3 = 0
loop: ldrb r2, [r0], #1 @ r2 = *r0++ ; Get array element
add r3, r2, r3 @ r3 += r2 ; Calculate sum
cmp r0, r1 @ if (r0 != r1) ; Check if hit end-of-array
bne loop @ goto loop ; Loop
mov pc, lr @ pc = lr ; Return when done</font>
## 使用nm工具可以查看xxx.o文件的所有符号标签
<font size="4">$ arm-nm main.o
00000004 t arr
00000007 t eoa
00000008 t start
00000018 t stop
U sum
$ arm-nm sum-sub.o
00000004 t loop
00000000 T sum</font>
#这里 "t" 表示 这个符号是被定义的
#"U" 表示这个符号没有被定义(undefined)
#"T" 表示这个符号是全局的(.global)
2. 重定向
重定向是改变已经分配给label的地址的过程,这包含链接所有的标签引用来反映新的分配的地址
参考:ARM arm-ld链接器的作用 - ARM技术 - 电子工程世界-论坛
ARM arm-ld链接器的作用 - ARM技术 - 电子工程世界-论坛