在S3C24X0(ARM920T)的U-boot中,我们使用以下说明跳转到C部分:
ldr pc, _start_armboot
_start_armboot: .word start_armboot
但我怎么知道start_armboot的值呢?我找不到我们定义start_armboot的地址值的时间和地点。它也不存在于.lds文件中。或者因为
_start_armboot: .word start_armboot
我们将start_armboot直接放在当前位置后的内存中?那么我们怎么能把这个指令/地址与“void start_armboot(void)”的C函数联系起来呢?
答案 0 :(得分:2)
_start_armboot: .word start_armboot
只是意味着将符号start_armboot
的地址放在该位置。
链接器负责在链接时使用正确的地址填充它。
在内部,start_armboot
只是在编译成目标文件时填充了一些虚拟值(通常为零)的存根。之后,当所有目标文件聚集在一起时,链接器开始将各个部分放在一起。一旦布置了所有部分,它将返回目标文件并填充存根,因为链接器现在已知符号位置。