diff options
author | Alan Modra <amodra@gmail.com> | 2002-10-10 02:52:27 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2002-10-10 02:52:27 +0000 |
commit | 24cdb50ae85f833058ac693535051ac66e6f0d2f (patch) | |
tree | 401677372146bc46f76ca33d72fa93c51e451f39 /ld | |
parent | 6bfb5a1c9d64c7c7db76c1657944721a52763f3f (diff) | |
download | fsf-binutils-gdb-24cdb50ae85f833058ac693535051ac66e6f0d2f.zip fsf-binutils-gdb-24cdb50ae85f833058ac693535051ac66e6f0d2f.tar.gz fsf-binutils-gdb-24cdb50ae85f833058ac693535051ac66e6f0d2f.tar.bz2 |
* emultempl/elf32.em (output_rel_find): Prefer .rel script sections
when orphan is .rel, .rela when orphan is .rela.
(gld${EMULATION_NAME}_place_orphan): Handle combreloc .rel* case
first. Remove outsecname var.
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 7 | ||||
-rw-r--r-- | ld/emultempl/elf32.em | 52 |
2 files changed, 38 insertions, 21 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index e4ffc36..7d783ff 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2002-10-10 Alan Modra <amodra@bigpond.net.au> + + * emultempl/elf32.em (output_rel_find): Prefer .rel script sections + when orphan is .rel, .rela when orphan is .rela. + (gld${EMULATION_NAME}_place_orphan): Handle combreloc .rel* case + first. Remove outsecname var. + 2002-10-09 Richard Shann <richard.shann@superh.com> Stephen Clarke <stephen.clarke@superh.com> diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index 7f86374..62c39f4 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -75,7 +75,7 @@ static void gld${EMULATION_NAME}_before_allocation static boolean gld${EMULATION_NAME}_open_dynamic_archive PARAMS ((const char *, search_dirs_type *, lang_input_statement_type *)); static lang_output_section_statement_type *output_rel_find - PARAMS ((void)); + PARAMS ((asection *)); static asection *output_prev_sec_find PARAMS ((lang_output_section_statement_type *)); static boolean gld${EMULATION_NAME}_place_orphan @@ -996,13 +996,15 @@ cat >>e${EMULATION_NAME}.c <<EOF /* A variant of lang_output_section_find. Used by place_orphan. */ static lang_output_section_statement_type * -output_rel_find () +output_rel_find (sec) + asection *sec; { lang_statement_union_type *u; lang_output_section_statement_type *lookup; lang_output_section_statement_type *last = NULL; lang_output_section_statement_type *last_rel = NULL; lang_output_section_statement_type *last_rel_alloc = NULL; + int rela = sec->name[4] == 'a'; for (u = lang_output_section_statement.head; u; u = lookup->next) { @@ -1012,18 +1014,19 @@ output_rel_find () /* Don't place after .rel.plt as doing so results in wrong dynamic tags. Also, place allocated reloc sections before non-allocated. */ - int rela = lookup->name[4] == 'a'; + int lookrela = lookup->name[4] == 'a'; - if (strcmp (".plt", lookup->name + 4 + rela) == 0 + if (strcmp (".plt", lookup->name + 4 + lookrela) == 0 || (lookup->bfd_section != NULL && (lookup->bfd_section->flags & SEC_ALLOC) == 0)) break; - last_rel = lookup; + last = lookup; + if (rela == lookrela) + last_rel = lookup; if (lookup->bfd_section != NULL && (lookup->bfd_section->flags & SEC_ALLOC) != 0) last_rel_alloc = lookup; } - last = lookup; } if (last_rel_alloc) @@ -1088,13 +1091,23 @@ gld${EMULATION_NAME}_place_orphan (file, s) lang_statement_list_type add; etree_type *address; const char *secname; - const char *outsecname; const char *ps = NULL; lang_output_section_statement_type *os; + int isdyn = 0; secname = bfd_get_section_name (s->owner, s); + if (! link_info.relocateable + && link_info.combreloc + && strncmp (secname, ".rel", 4) == 0) + { + if (secname[4] == 'a') + secname = ".rela.dyn"; + else + secname = ".rel.dyn"; + isdyn = 1; + } - if (! config.unique_orphan_sections && ! unique_section_p (secname)) + if (isdyn || (!config.unique_orphan_sections && !unique_section_p (secname))) { /* Look through the script to see where to place this section. */ os = lang_output_section_find (secname); @@ -1159,7 +1172,7 @@ gld${EMULATION_NAME}_place_orphan (file, s) else if (strncmp (secname, ".rel", 4) == 0 && (s->flags & SEC_LOAD) != 0 && (hold_rel.os != NULL - || (hold_rel.os = output_rel_find ()) != NULL)) + || (hold_rel.os = output_rel_find (s)) != NULL)) place = &hold_rel; else if ((s->flags & (SEC_CODE | SEC_READONLY)) == SEC_READONLY && HAVE_SECTION (hold_rodata, ".rodata")) @@ -1173,13 +1186,10 @@ gld${EMULATION_NAME}_place_orphan (file, s) /* Choose a unique name for the section. This will be needed if the same section name appears in the input file with different loadable or allocatable characteristics. */ - outsecname = secname; - if (bfd_get_section_by_name (output_bfd, outsecname) != NULL) + if (bfd_get_section_by_name (output_bfd, secname) != NULL) { - outsecname = bfd_get_unique_section_name (output_bfd, - outsecname, - &count); - if (outsecname == NULL) + secname = bfd_get_unique_section_name (output_bfd, secname, &count); + if (secname == NULL) einfo ("%F%P: place_orphan failed: %E\n"); } @@ -1200,7 +1210,7 @@ gld${EMULATION_NAME}_place_orphan (file, s) { /* If the name of the section is representable in C, then create symbols to mark the start and the end of the section. */ - for (ps = outsecname; *ps != '\0'; ps++) + for (ps = secname; *ps != '\0'; ps++) if (! ISALNUM (*ps) && *ps != '_') break; if (*ps == '\0') @@ -1208,8 +1218,8 @@ gld${EMULATION_NAME}_place_orphan (file, s) char *symname; etree_type *e_align; - symname = (char *) xmalloc (ps - outsecname + sizeof "__start_"); - sprintf (symname, "__start_%s", outsecname); + symname = (char *) xmalloc (ps - secname + sizeof "__start_"); + sprintf (symname, "__start_%s", secname); e_align = exp_unop (ALIGN_K, exp_intop ((bfd_vma) 1 << s->alignment_power)); lang_add_assignment (exp_assop ('=', symname, e_align)); @@ -1221,7 +1231,7 @@ gld${EMULATION_NAME}_place_orphan (file, s) else address = NULL; - os = lang_enter_output_section_statement (outsecname, address, 0, + os = lang_enter_output_section_statement (secname, address, 0, (bfd_vma) 0, (etree_type *) NULL, (etree_type *) NULL, @@ -1242,8 +1252,8 @@ gld${EMULATION_NAME}_place_orphan (file, s) if (place != NULL) stat_ptr = &add; - symname = (char *) xmalloc (ps - outsecname + sizeof "__stop_"); - sprintf (symname, "__stop_%s", outsecname); + symname = (char *) xmalloc (ps - secname + sizeof "__stop_"); + sprintf (symname, "__stop_%s", secname); lang_add_assignment (exp_assop ('=', symname, exp_nameop (NAME, "."))); } |