* elf32-mips.c (mips_elf_object_p): Unconditionally set
[deliverable/binutils-gdb.git] / bfd / elf.c
index a3ec15148fe8bcc4452c643050cd311c2cc925e3..2ff754361adb18bdf55cc0ab4f73eda4a19f763d 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -122,14 +122,14 @@ elf_get_str_section (abfd, shindex)
   if (i_shdrp == 0 || i_shdrp[shindex] == 0)
     return 0;
 
-  shstrtab = i_shdrp[shindex]->rawdata;
+  shstrtab = (char *) i_shdrp[shindex]->contents;
   if (shstrtab == NULL)
     {
       /* No cached one, attempt to read, and cache what we read. */
       offset = i_shdrp[shindex]->sh_offset;
       shstrtabsize = i_shdrp[shindex]->sh_size;
       shstrtab = elf_read (abfd, offset, shstrtabsize);
-      i_shdrp[shindex]->rawdata = (void *) shstrtab;
+      i_shdrp[shindex]->contents = (PTR) shstrtab;
     }
   return shstrtab;
 }
@@ -147,11 +147,74 @@ elf_string_from_elf_section (abfd, shindex, strindex)
 
   hdr = elf_elfsections (abfd)[shindex];
 
-  if (!hdr->rawdata
+  if (hdr->contents == NULL
       && elf_get_str_section (abfd, shindex) == NULL)
     return NULL;
 
-  return ((char *) hdr->rawdata) + strindex;
+  return ((char *) hdr->contents) + strindex;
+}
+
+/* Make a BFD section from an ELF section.  We store a pointer to the
+   BFD section in the bfd_section field of the header.  */
+
+boolean
+_bfd_elf_make_section_from_shdr (abfd, hdr, name)
+     bfd *abfd;
+     Elf_Internal_Shdr *hdr;
+     const char *name;
+{
+  asection *newsect;
+  flagword flags;
+
+  if (hdr->bfd_section != NULL)
+    {
+      BFD_ASSERT (strcmp (name,
+                         bfd_get_section_name (abfd, hdr->bfd_section)) == 0);
+      return true;
+    }
+
+  newsect = bfd_make_section_anyway (abfd, name);
+  if (newsect == NULL)
+    return false;
+
+  newsect->filepos = hdr->sh_offset;
+
+  if (! bfd_set_section_vma (abfd, newsect, hdr->sh_addr)
+      || ! bfd_set_section_size (abfd, newsect, hdr->sh_size)
+      || ! bfd_set_section_alignment (abfd, newsect,
+                                     bfd_log2 (hdr->sh_addralign)))
+    return false;
+
+  flags = SEC_NO_FLAGS;
+  if (hdr->sh_type != SHT_NOBITS)
+    flags |= SEC_HAS_CONTENTS;
+  if ((hdr->sh_flags & SHF_ALLOC) != 0)
+    {
+      flags |= SEC_ALLOC;
+      if (hdr->sh_type != SHT_NOBITS)
+       flags |= SEC_LOAD;
+    }
+  if ((hdr->sh_flags & SHF_WRITE) == 0)
+    flags |= SEC_READONLY;
+  if ((hdr->sh_flags & SHF_EXECINSTR) != 0)
+    flags |= SEC_CODE;
+  else if ((flags & SEC_LOAD) != 0)
+    flags |= SEC_DATA;
+
+  /* The debugging sections appear to be recognized only by name, not
+     any sort of flag.  */
+  if (strncmp (name, ".debug", sizeof ".debug" - 1) == 0
+      || strncmp (name, ".line", sizeof ".line" - 1) == 0
+      || strncmp (name, ".stab", sizeof ".stab" - 1) == 0)
+    flags |= SEC_DEBUGGING;
+
+  if (! bfd_set_section_flags (abfd, newsect, flags))
+    return false;
+
+  hdr->bfd_section = newsect;
+  elf_section_data (newsect)->this_hdr = *hdr;
+
+  return true;
 }
 
 /*
@@ -239,15 +302,49 @@ bfd_elf_generic_reloc (abfd,
   return bfd_reloc_continue;
 }
 \f
-/* Generic ELF link code.  */
-
-static struct bfd_hash_entry *elf_link_hash_newfunc
-  PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
-
+/* Display ELF-specific fields of a symbol.  */
+void
+bfd_elf_print_symbol (ignore_abfd, filep, symbol, how)
+     bfd *ignore_abfd;
+     PTR filep;
+     asymbol *symbol;
+     bfd_print_symbol_type how;
+{
+  FILE *file = (FILE *) filep;
+  switch (how)
+    {
+    case bfd_print_symbol_name:
+      fprintf (file, "%s", symbol->name);
+      break;
+    case bfd_print_symbol_more:
+      fprintf (file, "elf ");
+      fprintf_vma (file, symbol->value);
+      fprintf (file, " %lx", (long) symbol->flags);
+      break;
+    case bfd_print_symbol_all:
+      {
+       CONST char *section_name;
+       section_name = symbol->section ? symbol->section->name : "(*none*)";
+       bfd_print_symbol_vandf ((PTR) file, symbol);
+       fprintf (file, " %s\t", section_name);
+       /* Print the "other" value for a symbol.  For common symbols,
+          we've already printed the size; now print the alignment.
+          For other symbols, we have no specified alignment, and
+          we've printed the address; now print the size.  */
+       fprintf_vma (file,
+                    (bfd_is_com_section (symbol->section)
+                     ? ((elf_symbol_type *) symbol)->internal_elf_sym.st_value
+                     : ((elf_symbol_type *) symbol)->internal_elf_sym.st_size));
+       fprintf (file, " %s", symbol->name);
+      }
+      break;
+    }
+}
+\f
 /* Create an entry in an ELF linker hash table.  */
 
-static struct bfd_hash_entry *
-elf_link_hash_newfunc (entry, table, string)
+struct bfd_hash_entry *
+_bfd_elf_link_hash_newfunc (entry, table, string)
      struct bfd_hash_entry *entry;
      struct bfd_hash_table *table;
      const char *string;
@@ -274,10 +371,11 @@ elf_link_hash_newfunc (entry, table, string)
       /* Set local fields.  */
       ret->indx = -1;
       ret->size = 0;
-      ret->align = 0;
       ret->dynindx = -1;
       ret->dynstr_index = 0;
       ret->weakdef = NULL;
+      ret->got_offset = (bfd_vma) -1;
+      ret->plt_offset = (bfd_vma) -1;
       ret->type = STT_NOTYPE;
       ret->elf_link_hash_flags = 0;
     }
@@ -285,6 +383,26 @@ elf_link_hash_newfunc (entry, table, string)
   return (struct bfd_hash_entry *) ret;
 }
 
+/* Initialize an ELF linker hash table.  */
+
+boolean
+_bfd_elf_link_hash_table_init (table, abfd, newfunc)
+     struct elf_link_hash_table *table;
+     bfd *abfd;
+     struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *,
+                                               struct bfd_hash_table *,
+                                               const char *));
+{
+  table->dynamic_sections_created = false;
+  table->dynobj = NULL;
+  /* The first dynamic symbol is a dummy.  */
+  table->dynsymcount = 1;
+  table->dynstr = NULL;
+  table->bucketcount = 0;
+  table->needed = NULL;
+  return _bfd_link_hash_table_init (&table->root, abfd, newfunc);
+}
+
 /* Create an ELF linker hash table.  */
 
 struct bfd_link_hash_table *
@@ -300,17 +418,35 @@ _bfd_elf_link_hash_table_create (abfd)
       bfd_set_error (bfd_error_no_memory);
       return NULL;
     }
-  if (! _bfd_link_hash_table_init (&ret->root, abfd,
-                                  elf_link_hash_newfunc))
+
+  if (! _bfd_elf_link_hash_table_init (ret, abfd, _bfd_elf_link_hash_newfunc))
     {
       bfd_release (abfd, ret);
       return NULL;
     }
 
-  ret->dynobj = NULL;
-  ret->dynsymcount = 0;
-  ret->dynstr = NULL;
-  ret->bucketcount = 0;
-
   return &ret->root;
 }
+
+/* This is a hook for the ELF emulation code in the generic linker to
+   tell the backend linker what file name to use for the DT_NEEDED
+   entry for a dynamic object.  The generic linker passes name as an
+   empty string to indicate that no DT_NEEDED entry should be made.  */
+
+void
+bfd_elf_set_dt_needed_name (abfd, name)
+     bfd *abfd;
+     const char *name;
+{
+  elf_dt_needed_name (abfd) = name;
+}
+
+/* Get the list of DT_NEEDED entries for a link.  */
+
+struct bfd_elf_link_needed_list *
+bfd_elf_get_needed_list (abfd, info)
+     bfd *abfd;
+     struct bfd_link_info *info;
+{
+  return elf_hash_table (info)->needed;
+}
This page took 0.025231 seconds and 4 git commands to generate.