* elf.c (prep_headers): Get the machine code from the elf
[deliverable/binutils-gdb.git] / bfd / elf.c
index b06417c5e1dfe46733c800644b1bb5e2923ee20d..2fb73c5adeaa76f9ba81f8326648e52e5bf7cbae 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -571,6 +571,8 @@ _bfd_elf_merge_sections (abfd, info)
      bfd *abfd;
      struct bfd_link_info *info;
 {
+  if (!is_elf_hash_table (info))
+    return false;
   if (elf_hash_table (info)->merge_info)
     _bfd_merge_sections (abfd, elf_hash_table (info)->merge_info);
   return true;
@@ -612,16 +614,16 @@ _bfd_elf_print_private_bfd_data (abfd, farg)
            default: sprintf (buf, "0x%lx", p->p_type); s = buf; break;
            }
          fprintf (f, "%8s off    0x", s);
-         fprintf_vma (f, p->p_offset);
+         bfd_fprintf_vma (abfd, f, p->p_offset);
          fprintf (f, " vaddr 0x");
-         fprintf_vma (f, p->p_vaddr);
+         bfd_fprintf_vma (abfd, f, p->p_vaddr);
          fprintf (f, " paddr 0x");
-         fprintf_vma (f, p->p_paddr);
+         bfd_fprintf_vma (abfd, f, p->p_paddr);
          fprintf (f, " align 2**%u\n", bfd_log2 (p->p_align));
          fprintf (f, "         filesz 0x");
-         fprintf_vma (f, p->p_filesz);
+         bfd_fprintf_vma (abfd, f, p->p_filesz);
          fprintf (f, " memsz 0x");
-         fprintf_vma (f, p->p_memsz);
+         bfd_fprintf_vma (abfd, f, p->p_memsz);
          fprintf (f, " flags %c%c%c",
                   (p->p_flags & PF_R) != 0 ? 'r' : '-',
                   (p->p_flags & PF_W) != 0 ? 'w' : '-',
@@ -830,7 +832,7 @@ bfd_elf_print_symbol (abfd, filep, symbol, how)
       break;
     case bfd_print_symbol_more:
       fprintf (file, "elf ");
-      fprintf_vma (file, symbol->value);
+      bfd_fprintf_vma (abfd, file, symbol->value);
       fprintf (file, " %lx", (long) symbol->flags);
       break;
     case bfd_print_symbol_all:
@@ -849,7 +851,7 @@ bfd_elf_print_symbol (abfd, filep, symbol, how)
        if (name == NULL)
          {
            name = symbol->name;
-           bfd_print_symbol_vandf ((PTR) file, symbol);
+           bfd_print_symbol_vandf (abfd, (PTR) file, symbol);
          }
 
        fprintf (file, " %s\t", section_name);
@@ -857,10 +859,10 @@ bfd_elf_print_symbol (abfd, filep, symbol, how)
           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));
+       bfd_fprintf_vma (abfd, 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));
 
        /* If we have version information, print it.  */
        if (elf_tdata (abfd)->dynversym_section != 0
@@ -1047,6 +1049,8 @@ _bfd_elf_link_hash_table_init (table, abfd, newfunc)
                                                struct bfd_hash_table *,
                                                const char *));
 {
+  boolean ret;
+
   table->dynamic_sections_created = false;
   table->dynobj = NULL;
   /* The first dynamic symbol is a dummy.  */
@@ -1059,7 +1063,10 @@ _bfd_elf_link_hash_table_init (table, abfd, newfunc)
   table->stab_info = NULL;
   table->merge_info = NULL;
   table->dynlocal = NULL;
-  return _bfd_link_hash_table_init (&table->root, abfd, newfunc);
+  ret = _bfd_link_hash_table_init (& table->root, abfd, newfunc);
+  table->root.type = bfd_link_elf_hash_table;
+
+  return ret;
 }
 
 /* Create an ELF linker hash table.  */
@@ -2091,6 +2098,7 @@ elf_map_symbols (abfd)
   if (sect_syms == NULL)
     return false;
   elf_section_syms (abfd) = sect_syms;
+  elf_num_section_syms (abfd) = max_index;
 
   for (idx = 0; idx < symcount; idx++)
     {
@@ -3339,110 +3347,22 @@ prep_headers (abfd)
     case bfd_arch_unknown:
       i_ehdrp->e_machine = EM_NONE;
       break;
-    case bfd_arch_sparc:
-      if (bfd_get_arch_size (abfd) == 64)
-       i_ehdrp->e_machine = EM_SPARCV9;
-      else
-       i_ehdrp->e_machine = EM_SPARC;
-      break;
-    case bfd_arch_i370:
-      i_ehdrp->e_machine = EM_S370;
-      break;
-    case bfd_arch_i386:
-      if (bfd_get_arch_size (abfd) == 64)
-       i_ehdrp->e_machine = EM_X86_64;
-      else
-       i_ehdrp->e_machine = EM_386;
-      break;
-    case bfd_arch_ia64:
-      i_ehdrp->e_machine = EM_IA_64;
-      break;
-    case bfd_arch_m68hc11:
-      i_ehdrp->e_machine = EM_68HC11;
-      break;
-    case bfd_arch_m68hc12:
-      i_ehdrp->e_machine = EM_68HC12;
-      break;
-    case bfd_arch_s390:
-      i_ehdrp->e_machine = EM_S390;
-      break;
-    case bfd_arch_m68k:
-      i_ehdrp->e_machine = EM_68K;
-      break;
-    case bfd_arch_m88k:
-      i_ehdrp->e_machine = EM_88K;
-      break;
-    case bfd_arch_i860:
-      i_ehdrp->e_machine = EM_860;
-      break;
-    case bfd_arch_i960:
-      i_ehdrp->e_machine = EM_960;
-      break;
-    case bfd_arch_mips:        /* MIPS Rxxxx */
-      i_ehdrp->e_machine = EM_MIPS;    /* only MIPS R3000 */
-      break;
-    case bfd_arch_hppa:
-      i_ehdrp->e_machine = EM_PARISC;
-      break;
-    case bfd_arch_powerpc:
-      i_ehdrp->e_machine = EM_PPC;
-      break;
-    case bfd_arch_alpha:
-      i_ehdrp->e_machine = EM_ALPHA;
-      break;
-    case bfd_arch_sh:
-      i_ehdrp->e_machine = EM_SH;
-      break;
-    case bfd_arch_d10v:
-      i_ehdrp->e_machine = EM_CYGNUS_D10V;
-      break;
-    case bfd_arch_d30v:
-      i_ehdrp->e_machine = EM_CYGNUS_D30V;
-      break;
-    case bfd_arch_fr30:
-      i_ehdrp->e_machine = EM_CYGNUS_FR30;
-      break;
-    case bfd_arch_mcore:
-      i_ehdrp->e_machine = EM_MCORE;
-      break;
-    case bfd_arch_avr:
-      i_ehdrp->e_machine = EM_AVR;
-      break;
-    case bfd_arch_v850:
-      switch (bfd_get_mach (abfd))
-       {
-       default:
-       case 0:               i_ehdrp->e_machine = EM_CYGNUS_V850; break;
-       }
-      break;
-    case bfd_arch_arc:
-      i_ehdrp->e_machine = EM_CYGNUS_ARC;
-      break;
-    case bfd_arch_arm:
-      i_ehdrp->e_machine = EM_ARM;
-      break;
-    case bfd_arch_m32r:
-      i_ehdrp->e_machine = EM_CYGNUS_M32R;
-      break;
-    case bfd_arch_mn10200:
-      i_ehdrp->e_machine = EM_CYGNUS_MN10200;
-      break;
-    case bfd_arch_mn10300:
-      i_ehdrp->e_machine = EM_CYGNUS_MN10300;
-      break;
-    case bfd_arch_pj:
-      i_ehdrp->e_machine = EM_PJ;
-      break;
-    case bfd_arch_cris:
-      i_ehdrp->e_machine = EM_CRIS;
-      break;
-    case bfd_arch_openrisc:
-      i_ehdrp->e_machine = EM_OPENRISC;
-      break;
-      /* Also note that EM_M32, AT&T WE32100 is unknown to bfd.  */
+
+      /* There used to be a long list of cases here, each one setting
+        e_machine to the same EM_* macro #defined as ELF_MACHINE_CODE
+        in the corresponding bfd definition.  To avoid duplication,
+        the switch was removed.  Machines that need special handling
+        can generally do it in elf_backend_final_write_processing(),
+        unless they need the information earlier than the final write.
+        Such need can generally be supplied by replacing the tests for
+        e_machine with the conditions used to determine it.  */
     default:
-      i_ehdrp->e_machine = EM_NONE;
-    }
+      if (get_elf_backend_data (abfd) != NULL)
+       i_ehdrp->e_machine = get_elf_backend_data (abfd)->elf_machine_code;
+      else
+       i_ehdrp->e_machine = EM_NONE;
+      }
+
   i_ehdrp->e_version = bed->s->ev_current;
   i_ehdrp->e_ehsize = bed->s->sizeof_ehdr;
 
@@ -3651,7 +3571,8 @@ _bfd_elf_symbol_from_bfd_symbol (abfd, asym_ptr_ptr)
        indx = asym_ptr->section->output_section->index;
       else
        indx = asym_ptr->section->index;
-      if (elf_section_syms (abfd)[indx])
+      if (indx < elf_num_section_syms (abfd)
+         && elf_section_syms (abfd)[indx] != NULL)
        asym_ptr->udata.i = elf_section_syms (abfd)[indx]->udata.i;
     }
 
@@ -5343,12 +5264,6 @@ _bfd_elf_rel_vtable_reloc_fn (abfd, re, symbol, data, is, obfd, errmsg)
 # include <sys/procfs.h>
 #endif
 
-/* Define offsetof for those systems which lack it.  */
-
-#ifndef offsetof
-# define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER)
-#endif
-
 /* FIXME: this is kinda wrong, but it's what gdb wants.  */
 
 static int
@@ -5996,8 +5911,8 @@ bfd_get_elf_phdrs (abfd, phdrs)
 }
 
 void
-bfd_elf_sprintf_vma (abfd, buf, value)
-     bfd *abfd;
+_bfd_elf_sprintf_vma (abfd, buf, value)
+     bfd *abfd ATTRIBUTE_UNUSED;
      char *buf;
      bfd_vma value;
 {
@@ -6010,12 +5925,14 @@ bfd_elf_sprintf_vma (abfd, buf, value)
   else
     {
       if (i_ehdrp->e_ident[EI_CLASS] == ELFCLASS64)
+       {
 #if BFD_HOST_64BIT_LONG
-       sprintf (buf, "%016lx", value);
+         sprintf (buf, "%016lx", value);
 #else
-       sprintf (buf, "%08lx%08lx", _bfd_int64_high (value),
-                _bfd_int64_low (value));
+         sprintf (buf, "%08lx%08lx", _bfd_int64_high (value),
+                  _bfd_int64_low (value));
 #endif
+       }
       else
        sprintf (buf, "%08lx", (unsigned long) (value & 0xffffffff));
     }
@@ -6025,8 +5942,8 @@ bfd_elf_sprintf_vma (abfd, buf, value)
 }
 
 void
-bfd_elf_fprintf_vma (abfd, stream, value)
-     bfd *abfd;
+_bfd_elf_fprintf_vma (abfd, stream, value)
+     bfd *abfd ATTRIBUTE_UNUSED;
      PTR stream;
      bfd_vma value;
 {
@@ -6039,12 +5956,14 @@ bfd_elf_fprintf_vma (abfd, stream, value)
   else
     {
       if (i_ehdrp->e_ident[EI_CLASS] == ELFCLASS64)
+       {
 #if BFD_HOST_64BIT_LONG
-       fprintf ((FILE *) stream, "%016lx", value);
+         fprintf ((FILE *) stream, "%016lx", value);
 #else
-       fprintf ((FILE *) stream, "%08lx%08lx",
-                _bfd_int64_high (value), _bfd_int64_low (value));
+         fprintf ((FILE *) stream, "%08lx%08lx",
+                  _bfd_int64_high (value), _bfd_int64_low (value));
 #endif
+       }
       else
        fprintf ((FILE *) stream, "%08lx",
                 (unsigned long) (value & 0xffffffff));
@@ -6053,3 +5972,10 @@ bfd_elf_fprintf_vma (abfd, stream, value)
   fprintf_vma ((FILE *) stream, value);
 #endif
 }
+
+enum elf_reloc_type_class
+_bfd_elf_reloc_type_class (type)
+     int type ATTRIBUTE_UNUSED;
+{
+  return reloc_class_normal;
+}
This page took 0.028673 seconds and 4 git commands to generate.