From b5f14a6dffb53245e454ebeb1a353a42d02dfc04 Mon Sep 17 00:00:00 2001 From: DJ Delorie Date: Thu, 14 Jan 2010 04:56:12 +0000 Subject: [PATCH] * emultempl/elf32.em (_place_orphan): If an input section doesn't match an existing output section, but an unused output section statement does match, use it. * emultempl/pe.em (_place_orphan): Likewise. * emultempl/pep.em (_place_orphan): Likewise. * ld-elf/orphan4.d: New. * ld-elf/orphan4.ld: New. * ld-elf/orphan4.s: New. --- ld/ChangeLog | 8 ++++++++ ld/emultempl/elf32.em | 14 ++++++++++++++ ld/emultempl/pe.em | 14 ++++++++++++++ ld/emultempl/pep.em | 14 ++++++++++++++ ld/testsuite/ChangeLog | 6 ++++++ ld/testsuite/ld-elf/orphan4.d | 7 +++++++ ld/testsuite/ld-elf/orphan4.ld | 13 +++++++++++++ ld/testsuite/ld-elf/orphan4.s | 4 ++++ 8 files changed, 80 insertions(+) create mode 100644 ld/testsuite/ld-elf/orphan4.d create mode 100644 ld/testsuite/ld-elf/orphan4.ld create mode 100644 ld/testsuite/ld-elf/orphan4.s diff --git a/ld/ChangeLog b/ld/ChangeLog index dcdd4af75c8..a0094809b4f 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,11 @@ +2010-01-13 DJ Delorie + + * emultempl/elf32.em (_place_orphan): If an input section doesn't + match an existing output section, but an unused output section + statement does match, use it. + * emultempl/pe.em (_place_orphan): Likewise. + * emultempl/pep.em (_place_orphan): Likewise. + 2010-01-09 Ralf Wildenhues * configure: Regenerate. diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index 7215ff07fa9..4fea6a95b91 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -1782,6 +1782,7 @@ gld${EMULATION_NAME}_place_orphan (asection *s, struct orphan_save *place; lang_output_section_statement_type *after; lang_output_section_statement_type *os; + lang_output_section_statement_type *match_by_name = NULL; int isdyn = 0; int iself = s->owner->xvec->flavour == bfd_target_elf_flavour; unsigned int sh_type = iself ? elf_section_type (s) : SHT_NULL; @@ -1837,8 +1838,21 @@ gld${EMULATION_NAME}_place_orphan (asection *s, lang_add_section (&os->children, s, os); return os; } + + /* Save unused output sections in case we can match them + against orphans later. */ + if (os->bfd_section == NULL) + match_by_name = os; } + /* If we didn't match an active output section, see if we matched an + unused one and use that. */ + if (match_by_name) + { + lang_add_section (&match_by_name->children, s, match_by_name); + return match_by_name; + } + if (!orphan_init_done) { lang_output_section_statement_type *lookup; diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em index b936199e107..79b30d32996 100644 --- a/ld/emultempl/pe.em +++ b/ld/emultempl/pe.em @@ -1816,6 +1816,7 @@ gld_${EMULATION_NAME}_place_orphan (asection *s, char *dollar = NULL; lang_output_section_statement_type *os; lang_statement_list_type add_child; + lang_output_section_statement_type *match_by_name = NULL; lang_statement_union_type **pl; /* Look through the script to see where to place this section. */ @@ -1854,8 +1855,21 @@ gld_${EMULATION_NAME}_place_orphan (asection *s, lang_add_section (&add_child, s, os); break; } + + /* Save unused output sections in case we can match them + against orphans later. */ + if (os->bfd_section == NULL) + match_by_name = os; } + /* If we didn't match an active output section, see if we matched an + unused one and use that. */ + if (os == NULL && match_by_name) + { + lang_add_section (&match_by_name->children, s, match_by_name); + return match_by_name; + } + if (os == NULL) { static struct orphan_save hold[] = diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em index 753f4252d16..bcc959e95d4 100644 --- a/ld/emultempl/pep.em +++ b/ld/emultempl/pep.em @@ -1582,6 +1582,7 @@ gld_${EMULATION_NAME}_place_orphan (asection *s, char *dollar = NULL; lang_output_section_statement_type *os; lang_statement_list_type add_child; + lang_output_section_statement_type *match_by_name = NULL; lang_statement_union_type **pl; /* Look through the script to see where to place this section. */ @@ -1620,8 +1621,21 @@ gld_${EMULATION_NAME}_place_orphan (asection *s, lang_add_section (&add_child, s, os); break; } + + /* Save unused output sections in case we can match them + against orphans later. */ + if (os->bfd_section == NULL) + match_by_name = os; } + /* If we didn't match an active output section, see if we matched an + unused one and use that. */ + if (os == NULL && match_by_name) + { + lang_add_section (&match_by_name->children, s, match_by_name); + return match_by_name; + } + if (os == NULL) { static struct orphan_save hold[] = diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 414df4e15e4..a0aa58a9bc6 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2010-01-13 DJ Delorie + + * ld-elf/orphan4.d: New. + * ld-elf/orphan4.ld: New. + * ld-elf/orphan4.s: New. + 2010-01-13 Chao-ying Fu * ld-mips-elf/jr-to-b-1.d, ld-mips-elf/jr-to-b-2.d: New tests. diff --git a/ld/testsuite/ld-elf/orphan4.d b/ld/testsuite/ld-elf/orphan4.d new file mode 100644 index 00000000000..85ebf64764c --- /dev/null +++ b/ld/testsuite/ld-elf/orphan4.d @@ -0,0 +1,7 @@ +#source: orphan4.s +#ld: -T orphan4.ld +#objdump: -h + +#... + 1 \.foo 00000001 00001000 00001000 00000080 2\*\*0 +#pass diff --git a/ld/testsuite/ld-elf/orphan4.ld b/ld/testsuite/ld-elf/orphan4.ld new file mode 100644 index 00000000000..ab9bc9c3666 --- /dev/null +++ b/ld/testsuite/ld-elf/orphan4.ld @@ -0,0 +1,13 @@ +/* The .foo section doesn't specify *any* objects, but the object + we're linking has sections named ".foo". Make sure these sections + are linked into the .foo output section anyway. The bug that was + fixed was that a new .foo output section would be created at + address 0. */ + +SECTIONS { + .foo 0x00001000 : { + } + .text 0x00002000 : { + *(.text); + } +} diff --git a/ld/testsuite/ld-elf/orphan4.s b/ld/testsuite/ld-elf/orphan4.s new file mode 100644 index 00000000000..1f07646bccd --- /dev/null +++ b/ld/testsuite/ld-elf/orphan4.s @@ -0,0 +1,4 @@ + .section ".foo", "ax" + .byte 45 + .text + .byte 15 -- 2.30.2