2005-09-28 H.J. Lu <hongjiu.lu@intel.com>

* elflink.c (elf_fixup_link_order): Report locations for mixed
	ordered and unordered input sections.
This commit is contained in:
H.J. Lu 2005-09-28 14:52:02 +00:00
parent 7c9c8381d9
commit d33cdfe369
2 changed files with 35 additions and 17 deletions

View File

@ -1,3 +1,8 @@
2005-09-28 H.J. Lu <hongjiu.lu@intel.com>
* elflink.c (elf_fixup_link_order): Report locations for mixed
ordered and unordered input sections.
2005-09-22 James E. Wilson <wilson@specifix.com>
* dwarf2.c (struct funcinfo): Delete nesting_level field.

View File

@ -7635,41 +7635,54 @@ elf_fixup_link_order (bfd *abfd, asection *o)
const struct elf_backend_data *bed = get_elf_backend_data (abfd);
int elfsec;
struct bfd_link_order **sections;
asection *s;
asection *s, *other_sec, *linkorder_sec;
bfd_vma offset;
other_sec = NULL;
linkorder_sec = NULL;
seen_other = 0;
seen_linkorder = 0;
for (p = o->map_head.link_order; p != NULL; p = p->next)
{
if (p->type == bfd_indirect_link_order
&& (bfd_get_flavour ((sub = p->u.indirect.section->owner))
== bfd_target_elf_flavour)
&& elf_elfheader (sub)->e_ident[EI_CLASS] == bed->s->elfclass)
if (p->type == bfd_indirect_link_order)
{
s = p->u.indirect.section;
elfsec = _bfd_elf_section_from_bfd_section (sub, s);
if (elfsec != -1
sub = s->owner;
if (bfd_get_flavour (sub) == bfd_target_elf_flavour
&& elf_elfheader (sub)->e_ident[EI_CLASS] == bed->s->elfclass
&& (elfsec = _bfd_elf_section_from_bfd_section (sub, s)) != -1
&& elf_elfsections (sub)[elfsec]->sh_flags & SHF_LINK_ORDER)
seen_linkorder++;
{
seen_linkorder++;
linkorder_sec = s;
}
else
seen_other++;
{
seen_other++;
other_sec = s;
}
}
else
seen_other++;
if (seen_other && seen_linkorder)
{
if (other_sec && linkorder_sec)
(*_bfd_error_handler) (_("%A has both ordered [`%A' in %B] and unordered [`%A' in %B] sections"),
o, linkorder_sec,
linkorder_sec->owner, other_sec,
other_sec->owner);
else
(*_bfd_error_handler) (_("%A has both ordered and unordered sections"),
o);
bfd_set_error (bfd_error_bad_value);
return FALSE;
}
}
if (!seen_linkorder)
return TRUE;
if (seen_other && seen_linkorder)
{
(*_bfd_error_handler) (_("%A has both ordered and unordered sections"),
o);
bfd_set_error (bfd_error_bad_value);
return FALSE;
}
sections = (struct bfd_link_order **)
xmalloc (seen_linkorder * sizeof (struct bfd_link_order *));
seen_linkorder = 0;