diff --git a/bfd/ChangeLog b/bfd/ChangeLog index dcf9aeba6d..cc79ca5221 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2004-10-11 Alan Modra + + PR 437 + * elflink.c (elf_link_sort_relocs): Don't bomb on unusual sections. + (_bfd_elf_link_omit_section_dynsym): Formatting. + 2004-10-10 Alan Modra * libbfd-in.h (BFD_ASSERT, BFD_FAIL): Wrap macro body in do while. diff --git a/bfd/elflink.c b/bfd/elflink.c index 69fdcc044b..08c0aee6f1 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -629,8 +629,7 @@ _bfd_elf_link_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED, bfd *dynobj = elf_hash_table (info)->dynobj; if (dynobj != NULL - && (ip = bfd_get_section_by_name (dynobj, p->name)) - != NULL + && (ip = bfd_get_section_by_name (dynobj, p->name)) != NULL && (ip->flags & SEC_LINKER_CREATED) && ip->output_section == p) return TRUE; @@ -5712,6 +5711,14 @@ elf_link_sort_relocs (bfd *abfd, struct bfd_link_info *info, asection **psec) bfd_byte *erel, *erelend; asection *o = lo->u.indirect.section; + if (o->contents == NULL && o->size != 0) + { + /* This is a reloc section that is being handled as a normal + section. See bfd_section_from_shdr. We can't combine + relocs in this case. */ + free (sort); + return 0; + } erel = o->contents; erelend = o->contents + o->size; p = sort + o->output_offset / ext_size * sort_elt;