From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ian Lance Taylor To: dm@sgi.com Cc: gas2@cygnus.com Subject: Re: BFD_ASSERT failure in elf32-mips.c with possible fix Date: Fri, 09 Aug 1996 09:44:00 -0000 Message-id: <199608091644.MAA07050@sanguine.cygnus.com> References: <199608091345.GAA14227@neteng.engr.sgi.com> X-SW-Source: 1996/msg00078.html Date: Fri, 9 Aug 1996 06:45:58 -0700 From: "David S. Miller" The following c-torture case: extern int abort(); typedef int (*frob)(); frob f[] = {abort}; main() { exit(0); } Thanks for the note. I think this patch is more nearly correct, since it won't waste space on an unnecessary .rel.dyn section. I don't consider the dynamic linking code in elf32-mips.c to be particularly robust. It doesn't even pass the ld testsuite on Irix 5. Ian Index: elf32-mips.c =================================================================== RCS file: /cvs/cvsfiles/devo/bfd/elf32-mips.c,v retrieving revision 1.84 diff -u -r1.84 elf32-mips.c --- elf32-mips.c 1996/07/24 23:11:13 1.84 +++ elf32-mips.c 1996/08/09 16:42:21 @@ -5107,37 +5107,38 @@ if ((info->shared || h != NULL) && (sec->flags & SEC_ALLOC) != 0) { + if (sreloc == NULL) + { + const char *name = ".rel.dyn"; + + sreloc = bfd_get_section_by_name (dynobj, name); + if (sreloc == NULL) + { + sreloc = bfd_make_section (dynobj, name); + if (sreloc == NULL + || ! bfd_set_section_flags (dynobj, sreloc, + (SEC_ALLOC + | SEC_LOAD + | SEC_HAS_CONTENTS + | SEC_IN_MEMORY + | SEC_READONLY)) + || ! bfd_set_section_alignment (dynobj, sreloc, + 4)) + return false; + } + } if (info->shared) { /* When creating a shared object, we must copy these reloc types into the output file as R_MIPS_REL32 - relocs. We create the .rel.dyn reloc section in - dynobj and make room for this reloc. */ - if (sreloc == NULL) + relocs. We make room for this reloc in the + .rel.dyn reloc section */ + if (sreloc->_raw_size == 0) { - const char *name = ".rel.dyn"; - - sreloc = bfd_get_section_by_name (dynobj, name); - if (sreloc == NULL) - { - sreloc = bfd_make_section (dynobj, name); - if (sreloc == NULL - || ! bfd_set_section_flags (dynobj, sreloc, - (SEC_ALLOC - | SEC_LOAD - | SEC_HAS_CONTENTS - | SEC_IN_MEMORY - | SEC_READONLY)) - || ! bfd_set_section_alignment (dynobj, sreloc, - 4)) - return false; - - /* Add a null element. */ - sreloc->_raw_size += sizeof (Elf32_External_Rel); - ++sreloc->reloc_count; - } + /* Add a null element. */ + sreloc->_raw_size += sizeof (Elf32_External_Rel); + ++sreloc->reloc_count; } - sreloc->_raw_size += sizeof (Elf32_External_Rel); } else @@ -5213,6 +5214,12 @@ s = bfd_get_section_by_name (dynobj, ".rel.dyn"); BFD_ASSERT (s != NULL); + if (s->_raw_size == 0) + { + /* Make room for a null element. */ + s->_raw_size += sizeof (Elf32_External_Rel); + ++s->reloc_count; + } s->_raw_size += hmips->mips_32_relocs * sizeof (Elf32_External_Rel); } @@ -6085,7 +6092,7 @@ /* Clean up a first relocation in .rel.dyn. */ s = bfd_get_section_by_name (dynobj, ".rel.dyn"); - if (s != NULL) + if (s != NULL && s->_raw_size > 0) memset (s->contents, 0, sizeof (Elf32_External_Rel)); }