我正在linux kerenl中查看arch / arm / boot / compressed / head.S。
我的主板是odroid-S,当我看到我从readelf -S arch / arm / boot / compressed / vmlinux获得的符号表时,我看到了这些代码。
LC0: .word LC0 @ r1
.word __bss_start @ r2
.word _end @ r3
.word zreladdr @ r4
.word _start @ r5
.word _got_start @ r6
.word _got_end @ ip
.word user_stack+4096 @ sp `
但是他们所拥有的每个地址都没有排序。 例如,LC0值为0000013c 但__bss_start是0031a734。
有人能告诉我什么证实了这些符号的价值???
答案 0 :(得分:3)
在编译像操作系统或引导加载程序这样的软件的裸机实现时,会有一个特定于平台的linker script将指定每个部分将进入的地址。链接器脚本将根据平台的内存映射进行编写。
当操作系统加载可执行文件时,加载的操作系统将读取elf文件中的各个部分,并确保每个部分都放入进程内存映射的正确部分。然后,OS加载程序将根据需要修复任何未链接的地址。