今天学习的过程中又遇到了“位置无关码”这个概念,竟然一时间想不起来什么意思了,所以证明之前并没有完全搞懂啊!!!再次百度了一下别人的文章,总算又加深了一遍印象。
这篇文章讲的通俗易懂,可以借鉴一下:代码重定位和位置无关码。其中讲到位置无关码的含义就是,在我们写的裸板程序时,链接地址的起始地址是从0x30000000,比如下面所示:
SECTIONS
{
. = 0x30000000;
. = ALIGN(4);
.text :
{
*(.text)
}
. = ALIGN(4);
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) *(.COMMON) }
_end = .;
}
但是假如我们的代码在重定位之前, 会被板子拷贝到片内内存的0地址开始运行,这时候链接地址0x30000000和运行地址0就不相等了,所以运行的代码必须是位置无关的才行,比如不能有全局变量等。