* 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.
This commit is contained in:
parent
6bfb5a1c9d
commit
24cdb50ae8
|
@ -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>
|
||||
|
||||
|
|
|
@ -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, ".")));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue