今天學習的過程中又遇到了“位置無關碼”這個概念,竟然一時間想不起來什麼意思了,所以證明之前並沒有完全搞懂啊!!!再次百度了一下別人的文章,總算又加深了一遍印象。
這篇文章講的通俗易懂,可以借鑑一下:代碼重定位和位置無關碼。其中講到位置無關碼的含義就是,在我們寫的裸板程序時,鏈接地址的起始地址是從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就不相等了,所以運行的代碼必須是位置無關的才行,比如不能有全局變量等。