diff --git a/software/bios/linker.ld b/software/bios/linker.ld index 74e83e3a6..13b4bcaec 100644 --- a/software/bios/linker.ld +++ b/software/bios/linker.ld @@ -18,18 +18,12 @@ SECTIONS _frodata = .; *(.rodata .rodata.* .gnu.linkonce.r.*) *(.rodata1) - _erodata = .; - } > rom - /* We shouldn't have a .data section, but the GNU crapchain whines if we don't */ - .data : - { + /* Make sure the file is aligned on disk as well + as in memory; CRC calculation requires that. */ + FILL(0); . = ALIGN(4); - _fdata = .; - *(.data .data.* .gnu.linkonce.d.*) - *(.data1) - *(.sdata .sdata.* .gnu.linkonce.s.*) - _edata = .; + _erodata = .; } > rom .bss : @@ -51,6 +45,9 @@ SECTIONS { *(.eh_frame) *(.comment) + *(.data .data.* .gnu.linkonce.d.*) + *(.data1) + *(.sdata .sdata.* .gnu.linkonce.s.*) } } diff --git a/software/bios/main.c b/software/bios/main.c index 2a9aaa986..389314144 100644 --- a/software/bios/main.c +++ b/software/bios/main.c @@ -409,7 +409,7 @@ static void do_command(char *c) printf("Command not found\n"); } -extern unsigned int _ftext, _edata; +extern unsigned int _ftext, _erodata; static void crcbios(void) { @@ -419,14 +419,14 @@ static void crcbios(void) unsigned int actual_crc; /* - * _edata is located right after the end of the flat + * _erodata is located right after the end of the flat * binary image. The CRC tool writes the 32-bit CRC here. - * We also use the address of _edata to know the length + * We also use the address of _erodata to know the length * of our code. */ offset_bios = (unsigned int)&_ftext; - expected_crc = _edata; - length = (unsigned int)&_edata - offset_bios; + expected_crc = _erodata; + length = (unsigned int)&_erodata - offset_bios; actual_crc = crc32((unsigned char *)offset_bios, length); if(expected_crc == actual_crc) printf("BIOS CRC passed (%08x)\n", actual_crc);