【ARM学习笔记一】链接器

本文详细介绍了链接器在程序编译过程中的作用,包括符号解析和重定位两个关键步骤。通过示例展示了如何将.c和汇编文件编译成.o文件,然后链接成最终的可执行文件。文中提到了三种可执行文件格式:ELF、BIN和HEX,并解释了它们的特点。同时,通过nm工具展示了如何查看.o文件中的符号标签。此外,还探讨了链接器如何处理未定义的符号和全局符号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接器的作用

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技术 - 电子工程世界-论坛

          链接脚本浅析-1119401255-ChinaUnix博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值