* 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.
This commit is contained in:
Alan Modra 2003-08-04 04:01:39 +00:00
parent afaa9ce34d
commit 2a36a1175e
2 changed files with 33 additions and 11 deletions

View File

@ -1,3 +1,13 @@
2003-08-04 Alan Modra <amodra@bigpond.net.au>
* 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 <kkojima@rr.iij4u.or.jp> 2003-07-29 Kaz Kojima <kkojima@rr.iij4u.or.jp>
* emulparams/shelf.sh (OTHER_SECTIONS): Don't include .stack * emulparams/shelf.sh (OTHER_SECTIONS): Don't include .stack

View File

@ -998,11 +998,12 @@ cat >>e${EMULATION_NAME}.c <<EOF
/* A variant of lang_output_section_find. Used by place_orphan. */ /* A variant of lang_output_section_find. Used by place_orphan. */
static lang_output_section_statement_type * static lang_output_section_statement_type *
output_rel_find (asection *sec) output_rel_find (asection *sec, int isdyn)
{ {
lang_statement_union_type *u; lang_statement_union_type *u;
lang_output_section_statement_type *lookup; lang_output_section_statement_type *lookup;
lang_output_section_statement_type *last = NULL; lang_output_section_statement_type *last = NULL;
lang_output_section_statement_type *last_alloc = NULL;
lang_output_section_statement_type *last_rel = NULL; lang_output_section_statement_type *last_rel = NULL;
lang_output_section_statement_type *last_rel_alloc = NULL; lang_output_section_statement_type *last_rel_alloc = NULL;
int rela = sec->name[4] == 'a'; int rela = sec->name[4] == 'a';
@ -1012,22 +1013,30 @@ output_rel_find (asection *sec)
lookup = &u->output_section_statement; lookup = &u->output_section_statement;
if (strncmp (".rel", lookup->name, 4) == 0) 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'; int lookrela = lookup->name[4] == 'a';
if (strcmp (".plt", lookup->name + 4 + lookrela) == 0 /* .rel.dyn must come before all other reloc sections, to suit
|| (lookup->bfd_section != NULL GNU ld.so. */
&& (lookup->bfd_section->flags & SEC_ALLOC) == 0)) if (isdyn)
break; break;
last = lookup;
if (rela == lookrela) /* Don't place after .rel.plt as doing so results in wrong
dynamic tags. */
if (strcmp (".plt", lookup->name + 4 + lookrela) == 0)
break;
if (rela == lookrela || last_rel == NULL)
last_rel = lookup; 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) && (lookup->bfd_section->flags & SEC_ALLOC) != 0)
last_rel_alloc = lookup; 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) if (last_rel_alloc)
@ -1036,6 +1045,9 @@ output_rel_find (asection *sec)
if (last_rel) if (last_rel)
return last_rel; return last_rel;
if (last_alloc)
return last_alloc;
return last; 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 else if (strncmp (secname, ".rel", 4) == 0
&& (s->flags & SEC_LOAD) != 0 && (s->flags & SEC_LOAD) != 0
&& (hold_rel.os != NULL && (hold_rel.os != NULL
|| (hold_rel.os = output_rel_find (s)) != NULL)) || (hold_rel.os = output_rel_find (s, isdyn)) != NULL))
place = &hold_rel; place = &hold_rel;
else if ((s->flags & (SEC_CODE | SEC_READONLY)) == SEC_READONLY else if ((s->flags & (SEC_CODE | SEC_READONLY)) == SEC_READONLY
&& HAVE_SECTION (hold_rodata, ".rodata")) && HAVE_SECTION (hold_rodata, ".rodata"))