我有一個駐留在閃存中的程序,它將從閃存運行。在程序的早期,數據段從閃存複製到RAM。我使用像鏈接腳本(簡化):LD鏈接器:目標地址對齊但不是ROM中的地址
.text :
{
*(.text)
} > FLASH
_etext = .;
PROVIDE (etext = .);
.rodata :
{
PROVIDE(__COPY_DATA_START__ = .);
*(.rodata)
} > ram AT>flash
PROVIDE (__SDATA2_START__ = .);
.sdata2 :
{
*(.sdata2)
} > ram AT>flash
PROVIDE (__sbss2_start = .);
.sbss2 : {
*(.sbss2)
. = ALIGN(4)
} > ram AT>flash
PROVIDE (__sbss2_end = .);
PROVIDE (__SBSS2_END__ = .);
.data :
{
*(.data)
*(.gnu.linkonce.d*)
CONSTRUCTORS
*(.eh_frame)
} > ram AT>flash
PROVIDE (__END_COPY__ = .);
我想要的部分要在4字節邊界上對齊(架構是PowerPC的32位)。某些數據部分包含子字詞項目。我發現ALIGN指令將RAM中的VMA地址對齊,但不對齊LMA。所以我的副本到內存例程失敗,因爲這兩個區域不對應字節對字節。
我的副本日常的樣子
r3 = address in flash of _etext
r4 = address in ram of __COPY_DATA_START__
words to copy = (__END_COPY__ - COPY_DATA_START)/4
while (words to copy)
* r4++ = *r3++
當循環到達對齊位,則目標指向一些填充字節,但源數據不那麼得到的數據把包括對齊,填充記憶太早。
我可以從地圖文件就知道了,因爲它看起來像(人爲的例子)
.rodata 0x00000000 0xb15 load address 0xfff13000
0x00000000 PROVIDE (__COPY_DATA_START__, .)
.sdata 0x00000b18 0x10 load address 0xfff13b15 <<< origin 0xb18 is aligned but load address hasn't moved on by the padding bytes
有誰知道解決這個問題?
謝謝
克里斯
這個答案是錯的。冒號後的ALIGN(x)確實_NOT_設置LMA對齊。我剛剛用binutils 2.25試過。 – Sven 2015-03-28 13:03:27