mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-09 04:21:49 +08:00
64b63c2993
__{preinit,init,fini}_array_start symbols must be word aligned in linker scripts. If the section preceding the __*_array_start symbol has an odd size, then a NULL byte will be present between the start symbol and the .*_array section itself, when the section gets automatically word-aligned. This results in a branch to an invalid address when the CRT startup code tries to run through the functions listed in the array sections. Some MSP430 linker scripts do not align the __*_array start symbols, so this added warning will catch that problem and help the user avoid the potential incorrect execution of the program. ld/ChangeLog: * emultempl/msp430.em (input_section_exists): New. (check_array_section_alignment): New. (gld${EMULATION_NAME}_finish): New. * scripttempl/elf32msp430.sc: Add ALIGN directives before the definition of __*_array_start symbols. * testsuite/ld-msp430-elf/finiarray-warn.ld: New test. * testsuite/ld-msp430-elf/finiarray-warn.r: New test. * testsuite/ld-msp430-elf/initarray-nowarn.ld: New test. * testsuite/ld-msp430-elf/initarray-warn.ld: New test. * testsuite/ld-msp430-elf/initarray-warn.r: New test. * testsuite/ld-msp430-elf/initarray.s: New test. * testsuite/ld-msp430-elf/msp430-elf.exp: Run new tests. * testsuite/ld-msp430-elf/preinitarray-warn.ld: New test. * testsuite/ld-msp430-elf/preinitarray-warn.r: New test.
47 lines
832 B
Plaintext
47 lines
832 B
Plaintext
/* Script for ld testsuite */
|
|
OUTPUT_ARCH(msp430)
|
|
ENTRY(_start)
|
|
|
|
SECTIONS
|
|
{
|
|
.text :
|
|
{
|
|
PROVIDE (_start = .);
|
|
. = ALIGN(2);
|
|
*(.text .stub .text.* .gnu.linkonce.t.* .text:*)
|
|
}
|
|
|
|
.rodata :
|
|
{
|
|
*(.rodata.* .rodata)
|
|
. = ALIGN(2);
|
|
. += 1;
|
|
PROVIDE (__preinit_array_start = .);
|
|
KEEP (*(SORT(.preinit_array.*)))
|
|
KEEP (*(.preinit_array))
|
|
PROVIDE (__preinit_array_end = .);
|
|
. = ALIGN(2);
|
|
PROVIDE (__init_array_start = .);
|
|
KEEP (*(SORT(.init_array.*)))
|
|
KEEP (*(.init_array))
|
|
PROVIDE (__init_array_end = .);
|
|
. = ALIGN(2);
|
|
PROVIDE (__fini_array_start = .);
|
|
KEEP (*(SORT(.fini_array.*)))
|
|
KEEP (*(.fini_array))
|
|
PROVIDE (__fini_array_end = .);
|
|
}
|
|
|
|
.data :
|
|
{
|
|
. = ALIGN(2);
|
|
*(.data.* .data)
|
|
}
|
|
|
|
.bss :
|
|
{
|
|
. = ALIGN(2);
|
|
*(.bss.* .bss)
|
|
}
|
|
}
|