* elf-bfd.h (struct bfd_elf_section_data <group_name>): Replace with
authorAlan Modra <amodra@gmail.com>
Fri, 7 Jun 2002 14:57:11 +0000 (14:57 +0000)
committerAlan Modra <amodra@gmail.com>
Fri, 7 Jun 2002 14:57:11 +0000 (14:57 +0000)
"group" union.
(elf_group_name): Update.
(elf_group_id): Define.
(bfd_elf_set_group_contents): Declare.
* elf.c (elf_fake_sections): Qualify use of elf_group_name.
(set_group_contents): Rename to bfd_elf_set_group_contents.  Remove
ATTRIBUTE_UNUSED from failedptrarg.  If elf_group_id is set, use
that sym for the signature.
(_bfd_elf_compute_section_file_positions): Don't call
set_group_contents for "ld -r" case.
(swap_out_syms): Use bfd_zalloc.
* elflink.h (elf_link_add_archive_symbols): Likewise.
(NAME(bfd_elf,size_dynamic_sections)): Likewise.
(elf_bfd_final_link): Call bfd_elf_set_group_contents.

bfd/ChangeLog
bfd/elf-bfd.h
bfd/elf.c
bfd/elflink.h

index e5a907461c69a3b61e0eb4832294ac048405af09..148731404f15b896754998032c8e1e9a8823f232 100644 (file)
@@ -1,3 +1,21 @@
+2002-06-07  Alan Modra  <amodra@bigpond.net.au>
+
+       * elf-bfd.h (struct bfd_elf_section_data <group_name>): Replace with
+       "group" union.
+       (elf_group_name): Update.
+       (elf_group_id): Define.
+       (bfd_elf_set_group_contents): Declare.
+       * elf.c (elf_fake_sections): Qualify use of elf_group_name.
+       (set_group_contents): Rename to bfd_elf_set_group_contents.  Remove
+       ATTRIBUTE_UNUSED from failedptrarg.  If elf_group_id is set, use
+       that sym for the signature.
+       (_bfd_elf_compute_section_file_positions): Don't call
+       set_group_contents for "ld -r" case.
+       (swap_out_syms): Use bfd_zalloc.
+       * elflink.h (elf_link_add_archive_symbols): Likewise.
+       (NAME(bfd_elf,size_dynamic_sections)): Likewise.
+       (elf_bfd_final_link): Call bfd_elf_set_group_contents.
+
 2002-06-07  Alan Modra  <amodra@bigpond.net.au>
 
        * elf64-ppc.c (ppc64_elf_relocate_section): Allow unresolved
index 238a6d63385f32b783f677125a8c57fb7f71dd49..28dbe83c6a7bf419ed91b4577e96f36800b56474 100644 (file)
@@ -916,8 +916,13 @@ struct bfd_elf_section_data
   /* Type of that information.  */
   enum elf_link_info_type sec_info_type;
 
-  /* Group name, if this section is part of a group.  */
-  const char *group_name;
+  union {
+    /* Group name, if this section is a member of a group.  */
+    const char *name;
+
+    /* Group signature sym, if this is the SHT_GROUP section.  */
+    struct symbol_cache_entry *id;
+  } group;
 
   /* A linked list of sections in the group.  Circular when used by
      the linker.  */
@@ -934,7 +939,8 @@ struct bfd_elf_section_data
 };
 
 #define elf_section_data(sec)  ((struct bfd_elf_section_data*)sec->used_by_bfd)
-#define elf_group_name(sec)    (elf_section_data(sec)->group_name)
+#define elf_group_name(sec)    (elf_section_data(sec)->group.name)
+#define elf_group_id(sec)      (elf_section_data(sec)->group.id)
 #define elf_next_in_group(sec) (elf_section_data(sec)->next_in_group)
 #define elf_linkonce_p(sec)    (elf_section_data(sec)->linkonce_p)
 
@@ -1265,6 +1271,8 @@ extern boolean _bfd_elf_merge_sections
   PARAMS ((bfd *, struct bfd_link_info *));
 extern boolean bfd_elf_discard_group
   PARAMS ((bfd *, struct sec *));
+extern void bfd_elf_set_group_contents
+  PARAMS ((bfd *, asection *, PTR));
 extern void _bfd_elf_link_just_syms
   PARAMS ((asection *, struct bfd_link_info *));
 extern boolean _bfd_elf_copy_private_symbol_data
index fd9aa4b9263655505b43980ad07d933a71d80e1b..dd1b0673e4b9427b3229f09e170873f1ff85d323 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -54,7 +54,6 @@ static const char *group_signature PARAMS ((bfd *, Elf_Internal_Shdr *));
 static boolean setup_group PARAMS ((bfd *, Elf_Internal_Shdr *, asection *));
 static void merge_sections_remove_hook PARAMS ((bfd *, asection *));
 static void elf_fake_sections PARAMS ((bfd *, asection *, PTR));
-static void set_group_contents PARAMS ((bfd *, asection *, PTR));
 static boolean assign_section_numbers PARAMS ((bfd *));
 static INLINE int sym_is_global PARAMS ((bfd *, asymbol *));
 static boolean elf_map_symbols PARAMS ((bfd *));
@@ -2358,7 +2357,7 @@ elf_fake_sections (abfd, asect, failedptrarg)
       if ((asect->flags & SEC_STRINGS) != 0)
        this_hdr->sh_flags |= SHF_STRINGS;
     }
-  if (elf_group_name (asect) != NULL)
+  if ((asect->flags & SEC_GROUP) == 0 && elf_group_name (asect) != NULL)
     this_hdr->sh_flags |= SHF_GROUP;
   if ((asect->flags & SEC_THREAD_LOCAL) != 0)
     this_hdr->sh_flags |= SHF_TLS;
@@ -2382,11 +2381,11 @@ elf_fake_sections (abfd, asect, failedptrarg)
 
 /* Fill in the contents of a SHT_GROUP section.  */
 
-static void
-set_group_contents (abfd, sec, failedptrarg)
+void
+bfd_elf_set_group_contents (abfd, sec, failedptrarg)
      bfd *abfd;
      asection *sec;
-     PTR failedptrarg ATTRIBUTE_UNUSED;
+     PTR failedptrarg;
 {
   boolean *failedptr = (boolean *) failedptrarg;
   unsigned long symindx;
@@ -2399,16 +2398,22 @@ set_group_contents (abfd, sec, failedptrarg)
       || *failedptr)
     return;
 
-  /* If called from the assembler, swap_out_syms will have set up
-     elf_section_syms;  If called for "ld -r", the symbols won't yet
-     be mapped, so emulate elf_bfd_final_link.  */
-  if (elf_section_syms (abfd) != NULL)
-    symindx = elf_section_syms (abfd)[sec->index]->udata.i;
-  else
-    symindx = elf_section_data (sec)->this_idx;
+  symindx = 0;
+  if (elf_group_id (sec) != NULL)
+    symindx = elf_group_id (sec)->udata.i;
+
+  if (symindx == 0)
+    {
+      /* If called from the assembler, swap_out_syms will have set up
+        elf_section_syms;  If called for "ld -r", use target_index.  */
+      if (elf_section_syms (abfd) != NULL)
+       symindx = elf_section_syms (abfd)[sec->index]->udata.i;
+      else
+       symindx = sec->target_index;
+    }
   elf_section_data (sec)->this_hdr.sh_info = symindx;
 
-  /* Nor will the contents be allocated for "ld -r" or objcopy.  */
+  /* The contents won't be allocated for "ld -r" or objcopy.  */
   gas = true;
   if (sec->contents == NULL)
     {
@@ -2959,9 +2964,9 @@ _bfd_elf_compute_section_file_positions (abfd, link_info)
        return false;
     }
 
-  if (link_info == NULL || link_info->relocateable)
+  if (link_info == NULL)
     {
-      bfd_map_over_sections (abfd, set_group_contents, &failed);
+      bfd_map_over_sections (abfd, bfd_elf_set_group_contents, &failed);
       if (failed)
        return false;
     }
@@ -5144,10 +5149,9 @@ swap_out_syms (abfd, sttp, relocatable_p)
   if (symtab_shndx_hdr->sh_name != 0)
     {
       amt = (bfd_size_type) (1 + symcount) * sizeof (Elf_External_Sym_Shndx);
-      outbound_shndx = bfd_alloc (abfd, amt);
+      outbound_shndx = bfd_zalloc (abfd, amt);
       if (outbound_shndx == NULL)
        return false;
-      memset (outbound_shndx, 0, (unsigned long) amt);
       symtab_shndx_hdr->contents = outbound_shndx;
       symtab_shndx_hdr->sh_type = SHT_SYMTAB_SHNDX;
       symtab_shndx_hdr->sh_size = amt;
index e80e867e590e38544ceacc7898e4ea2735402bc3..30ba4c146e821c5f410953b563d2f587114b971a 100644 (file)
@@ -313,12 +313,10 @@ elf_link_add_archive_symbols (abfd, info)
     return true;
   amt = c;
   amt *= sizeof (boolean);
-  defined = (boolean *) bfd_malloc (amt);
-  included = (boolean *) bfd_malloc (amt);
+  defined = (boolean *) bfd_zmalloc (amt);
+  included = (boolean *) bfd_zmalloc (amt);
   if (defined == (boolean *) NULL || included == (boolean *) NULL)
     goto error_return;
-  memset (defined, 0, (size_t) amt);
-  memset (included, 0, (size_t) amt);
 
   symdefs = bfd_ardata (abfd)->symdefs;
 
@@ -3665,10 +3663,9 @@ NAME(bfd_elf,size_dynamic_sections) (output_bfd, soname, rpath,
       BFD_ASSERT (s != NULL);
       hash_entry_size = elf_section_data (s)->this_hdr.sh_entsize;
       s->_raw_size = ((2 + bucketcount + dynsymcount) * hash_entry_size);
-      s->contents = (bfd_byte *) bfd_alloc (output_bfd, s->_raw_size);
+      s->contents = (bfd_byte *) bfd_zalloc (output_bfd, s->_raw_size);
       if (s->contents == NULL)
        return false;
-      memset (s->contents, 0, (size_t) s->_raw_size);
 
       bfd_put (8 * hash_entry_size, output_bfd, (bfd_vma) bucketcount,
               s->contents);
@@ -5811,6 +5808,15 @@ elf_bfd_final_link (abfd, info)
        }
     }
 
+  if (info->relocateable)
+    {
+      boolean failed = false;
+
+      bfd_map_over_sections (abfd, bfd_elf_set_group_contents, &failed);
+      if (failed)
+       goto error_return;
+    }
+
   /* If we have optimized stabs strings, output them.  */
   if (elf_hash_table (info)->stab_info != NULL)
     {