From 2a36a1175e1fec4bd57a97bc5de0bea89b397b10 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 4 Aug 2003 04:01:39 +0000 Subject: * emultempl/elf32.em (output_rel_find): Add "isdyn" param. Put .rel.dyn before other reloc sections. Don't stop looking for reloc sections on finding one that isn't allocated. Match .rel even when placing .rela and vice versa, when setting last_rel and last_rel_alloc for the first time. If no reloc sections in script, prefer allocated section over non-alloc. (gld${EMULATION_NAME}_place_orphan): Handle orphan .rel.dyn. --- ld/ChangeLog | 10 ++++++++++ ld/emultempl/elf32.em | 34 +++++++++++++++++++++++----------- 2 files changed, 33 insertions(+), 11 deletions(-) (limited to 'ld') diff --git a/ld/ChangeLog b/ld/ChangeLog index 3423494..326d3b0 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,13 @@ +2003-08-04 Alan Modra + + * emultempl/elf32.em (output_rel_find): Add "isdyn" param. Put + .rel.dyn before other reloc sections. Don't stop looking for reloc + sections on finding one that isn't allocated. Match .rel even when + placing .rela and vice versa, when setting last_rel and + last_rel_alloc for the first time. If no reloc sections in script, + prefer allocated section over non-alloc. + (gld${EMULATION_NAME}_place_orphan): Handle orphan .rel.dyn. + 2003-07-29 Kaz Kojima * emulparams/shelf.sh (OTHER_SECTIONS): Don't include .stack diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index dd9c15b..e5fefa9 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -998,11 +998,12 @@ cat >>e${EMULATION_NAME}.c <name[4] == 'a'; @@ -1012,22 +1013,30 @@ output_rel_find (asection *sec) lookup = &u->output_section_statement; if (strncmp (".rel", lookup->name, 4) == 0) { - /* Don't place after .rel.plt as doing so results in wrong - dynamic tags. Also, place allocated reloc sections before - non-allocated. */ int lookrela = lookup->name[4] == 'a'; - if (strcmp (".plt", lookup->name + 4 + lookrela) == 0 - || (lookup->bfd_section != NULL - && (lookup->bfd_section->flags & SEC_ALLOC) == 0)) + /* .rel.dyn must come before all other reloc sections, to suit + GNU ld.so. */ + if (isdyn) + break; + + /* Don't place after .rel.plt as doing so results in wrong + dynamic tags. */ + if (strcmp (".plt", lookup->name + 4 + lookrela) == 0) break; - last = lookup; - if (rela == lookrela) + + if (rela == lookrela || last_rel == NULL) last_rel = lookup; - if (lookup->bfd_section != NULL + if ((rela == lookrela || last_rel_alloc == NULL) + && lookup->bfd_section != NULL && (lookup->bfd_section->flags & SEC_ALLOC) != 0) last_rel_alloc = lookup; } + + last = lookup; + if (lookup->bfd_section != NULL + && (lookup->bfd_section->flags & SEC_ALLOC) != 0) + last_alloc = lookup; } if (last_rel_alloc) @@ -1036,6 +1045,9 @@ output_rel_find (asection *sec) if (last_rel) return last_rel; + if (last_alloc) + return last_alloc; + return last; } @@ -1174,7 +1186,7 @@ gld${EMULATION_NAME}_place_orphan (lang_input_statement_type *file, asection *s) else if (strncmp (secname, ".rel", 4) == 0 && (s->flags & SEC_LOAD) != 0 && (hold_rel.os != NULL - || (hold_rel.os = output_rel_find (s)) != NULL)) + || (hold_rel.os = output_rel_find (s, isdyn)) != NULL)) place = &hold_rel; else if ((s->flags & (SEC_CODE | SEC_READONLY)) == SEC_READONLY && HAVE_SECTION (hold_rodata, ".rodata")) -- cgit v1.1