PR gas/7025
[deliverable/binutils-gdb.git] / binutils / readelf.c
index ea48ba1d402c60631a5b023ef7ea046b9b1a5df3..ecc54bf43de2ee03a59a519c981ea6c08626e9e0 100644 (file)
 #include <zlib.h>
 #endif
 
-/* for PATH_MAX */
+/* For PATH_MAX.  */
 #ifdef HAVE_LIMITS_H
 #include <limits.h>
 #endif
 
 #ifndef PATH_MAX
-/* for MAXPATHLEN */
+/* For MAXPATHLEN.  */
 # ifdef HAVE_SYS_PARAM_H
 #  include <sys/param.h>
 # endif
@@ -373,6 +373,7 @@ byte_put_little_endian (unsigned char *field, bfd_vma value, int size)
 }
 
 /* Print a VMA value.  */
+
 static int
 print_vma (bfd_vma vma, print_mode mode)
 {
@@ -462,7 +463,7 @@ print_symbol (int width, const char *symbol)
        {
          if (len > width)
            len = width;
-         
+
          printf (format_string, len, symbol);
 
          width -= len;
@@ -486,7 +487,7 @@ print_symbol (int width, const char *symbol)
        {
          if (width < 6)
            break;
-         
+
          printf ("<0x%.2x>", *c);
 
          width -= 6;
@@ -1272,7 +1273,7 @@ dump_relocations (FILE *file,
                               && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
                        sec_name = "ANSI_COM";
                      else if (elf_header.e_machine == EM_IA_64
-                              && (elf_header.e_ident[EI_OSABI] 
+                              && (elf_header.e_ident[EI_OSABI]
                                   == ELFOSABI_OPENVMS)
                               && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
                        sec_name = "VMS_SYMVEC";
@@ -1823,7 +1824,7 @@ get_machine_name (unsigned e_machine)
     case EM_ALTERA_NIOS2:      return "Altera Nios II";
     case EM_XC16X:             return "Infineon Technologies xc16x";
     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
-    case EM_CR16:              
+    case EM_CR16:
     case EM_CR16_OLD:          return "National Semiconductor's CR16";
     default:
       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
@@ -4279,8 +4280,8 @@ process_section_headers (FILE *file)
       else if (section->sh_type == SHT_RELA)
        CHECK_ENTSIZE (section, i, Rela);
       else if ((do_debugging || do_debug_info || do_debug_abbrevs
-               || do_debug_lines || do_debug_lines_decoded || do_debug_pubnames 
-               || do_debug_aranges || do_debug_frames || do_debug_macinfo 
+               || do_debug_lines || do_debug_lines_decoded || do_debug_pubnames
+               || do_debug_aranges || do_debug_frames || do_debug_macinfo
                || do_debug_str || do_debug_loc || do_debug_ranges)
               && (const_strneq (name, ".debug_")
                    || const_strneq (name, ".zdebug_")))
@@ -4293,7 +4294,7 @@ process_section_headers (FILE *file)
          if (do_debugging
              || (do_debug_info     && streq (name, "info"))
              || (do_debug_abbrevs  && streq (name, "abbrev"))
-             || ((do_debug_lines || do_debug_lines_decoded) 
+             || ((do_debug_lines || do_debug_lines_decoded)
                  && streq (name, "line"))
              || (do_debug_pubnames && streq (name, "pubnames"))
              || (do_debug_aranges  && streq (name, "aranges"))
@@ -4375,7 +4376,8 @@ process_section_headers (FILE *file)
                    get_section_type_name (section->sh_type));
        }
       else
-       printf ("  [%2u] %-17.17s %-15.15s ",
+       printf ((do_wide ? "  [%2u] %-17s %-15s "
+                        : "  [%2u] %-17.17s %-15.15s "),
                i,
                SECTION_NAME (section),
                get_section_type_name (section->sh_type));
@@ -8027,7 +8029,7 @@ is_32bit_abs_reloc (unsigned int reloc_type)
       return reloc_type == 1; /* R_ARC_32.  */
     case EM_ARM:
       return reloc_type == 2; /* R_ARM_ABS32 */
-    case EM_AVR_OLD: 
+    case EM_AVR_OLD:
     case EM_AVR:
       return reloc_type == 1;
     case EM_BLACKFIN:
@@ -8284,8 +8286,40 @@ is_16bit_abs_reloc (unsigned int reloc_type)
     }
 }
 
+/* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
+   relocation entries (possibly formerly used for SHT_GROUP sections).  */
+
+static bfd_boolean
+is_none_reloc (unsigned int reloc_type)
+{
+  switch (elf_header.e_machine)
+    {
+    case EM_68K:     /* R_68K_NONE.  */
+    case EM_386:     /* R_386_NONE.  */
+    case EM_SPARC32PLUS:
+    case EM_SPARCV9:
+    case EM_SPARC:   /* R_SPARC_NONE.  */
+    case EM_MIPS:    /* R_MIPS_NONE.  */
+    case EM_PARISC:  /* R_PARISC_NONE.  */
+    case EM_ALPHA:   /* R_ALPHA_NONE.  */
+    case EM_PPC:     /* R_PPC_NONE.  */
+    case EM_PPC64:   /* R_PPC64_NONE.  */
+    case EM_ARM:     /* R_ARM_NONE.  */
+    case EM_IA_64:   /* R_IA64_NONE.  */
+    case EM_SH:      /* R_SH_NONE.  */
+    case EM_S390_OLD:
+    case EM_S390:    /* R_390_NONE.  */
+    case EM_CRIS:    /* R_CRIS_NONE.  */
+    case EM_X86_64:  /* R_X86_64_NONE.  */
+    case EM_MN10300: /* R_MN10300_NONE.  */
+    case EM_M32R:    /* R_M32R_NONE.  */
+      return reloc_type == 0;
+    }
+  return FALSE;
+}
+
 /* Uncompresses a section that was compressed using zlib, in place.
* This is a copy of bfd_uncompress_section_contents, in bfd/compress.c  */
  This is a copy of bfd_uncompress_section_contents, in bfd/compress.c  */
 
 static int
 uncompress_section_contents (unsigned char **buffer, dwarf_size_type *size)
@@ -8297,9 +8331,9 @@ uncompress_section_contents (unsigned char **buffer, dwarf_size_type *size)
   return FALSE;
 #else
   dwarf_size_type compressed_size = *size;
-  unsigned char* compressed_buffer = *buffer;
+  unsigned char * compressed_buffer = *buffer;
   dwarf_size_type uncompressed_size;
-  unsigned char* uncompressed_buffer;
+  unsigned char * uncompressed_buffer;
   z_stream strm;
   int rc;
   dwarf_size_type header_size = 12;
@@ -8307,8 +8341,9 @@ uncompress_section_contents (unsigned char **buffer, dwarf_size_type *size)
   /* Read the zlib header.  In this case, it should be "ZLIB" followed
      by the uncompressed section size, 8 bytes in big-endian order.  */
   if (compressed_size < header_size
-      || ! streq ((char*) compressed_buffer, "ZLIB"))
+      || ! streq ((char *) compressed_buffer, "ZLIB"))
     return 0;
+
   uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
   uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
   uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
@@ -8324,23 +8359,23 @@ uncompress_section_contents (unsigned char **buffer, dwarf_size_type *size)
   strm.zfree = NULL;
   strm.opaque = NULL;
   strm.avail_in = compressed_size - header_size;
-  strm.next_in = (Bytef*) compressed_buffer + header_size;
+  strm.next_in = (Bytef *) compressed_buffer + header_size;
   strm.avail_out = uncompressed_size;
   uncompressed_buffer = xmalloc (uncompressed_size);
 
-  rc = inflateInit (&strm);
+  rc = inflateInit (& strm);
   while (strm.avail_in > 0)
     {
       if (rc != Z_OK)
         goto fail;
-      strm.next_out = ((Bytef*) uncompressed_buffer
+      strm.next_out = ((Bytef *) uncompressed_buffer
                        + (uncompressed_size - strm.avail_out));
       rc = inflate (&strm, Z_FINISH);
       if (rc != Z_STREAM_END)
         goto fail;
-      rc = inflateReset (&strm);
+      rc = inflateReset (& strm);
     }
-  rc = inflateEnd (&strm);
+  rc = inflateEnd (& strm);
   if (rc != Z_OK
       || strm.avail_out != 0)
     goto fail;
@@ -8419,6 +8454,9 @@ debug_apply_relocations (void *file,
 
          reloc_type = get_reloc_type (rp->r_info);
 
+         if (is_none_reloc (reloc_type))
+           continue;
+
          if (is_32bit_abs_reloc (reloc_type)
              || is_32bit_pcrel_reloc (reloc_type))
            reloc_size = 4;
@@ -8466,7 +8504,7 @@ debug_apply_relocations (void *file,
            }
 
          addend = is_rela ? rp->r_addend : byte_get (loc, reloc_size);
-         
+
          if (is_32bit_pcrel_reloc (reloc_type)
              || is_64bit_pcrel_reloc (reloc_type))
            {
@@ -8486,11 +8524,11 @@ debug_apply_relocations (void *file,
     }
 }
 
-int
-load_debug_section (enum dwarf_section_display_enum debug, void *file)
+static int
+load_specific_debug_section (enum dwarf_section_display_enum debug,
+                            Elf_Internal_Shdr *sec, void *file)
 {
   struct dwarf_section *section = &debug_displays [debug].section;
-  Elf_Internal_Shdr *sec;
   char buf [64];
   int section_is_compressed;
 
@@ -8498,18 +8536,6 @@ load_debug_section (enum dwarf_section_display_enum debug, void *file)
   if (section->start != NULL)
     return 1;
 
-  /* Locate the debug section.  */
-  sec = find_section (section->uncompressed_name);
-  if (sec != NULL)
-    section->name = section->uncompressed_name;
-  else
-    {
-      sec = find_section (section->compressed_name);
-      if (sec != NULL)
-       section->name = section->compressed_name;
-    }
-  if (sec == NULL)
-    return 0;
   section_is_compressed = section->name == section->compressed_name;
 
   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
@@ -8530,6 +8556,28 @@ load_debug_section (enum dwarf_section_display_enum debug, void *file)
   return 1;
 }
 
+int
+load_debug_section (enum dwarf_section_display_enum debug, void *file)
+{
+  struct dwarf_section *section = &debug_displays [debug].section;
+  Elf_Internal_Shdr *sec;
+
+  /* Locate the debug section.  */
+  sec = find_section (section->uncompressed_name);
+  if (sec != NULL)
+    section->name = section->uncompressed_name;
+  else
+    {
+      sec = find_section (section->compressed_name);
+      if (sec != NULL)
+       section->name = section->compressed_name;
+    }
+  if (sec == NULL)
+    return 0;
+
+  return load_specific_debug_section (debug, sec, file);
+}
+
 void
 free_debug_section (enum dwarf_section_display_enum debug)
 {
@@ -8568,12 +8616,20 @@ display_debug_section (Elf_Internal_Shdr *section, FILE *file)
         || streq (debug_displays[i].section.compressed_name, name))
       {
        struct dwarf_section *sec = &debug_displays [i].section;
+       int secondary = (section != find_section (name));
 
-       if (load_debug_section (i, file))
+       if (secondary)
+         free_debug_section (i);
+
+       if (streq (debug_displays[i].section.uncompressed_name, name))
+         sec->name = sec->uncompressed_name;
+       else
+         sec->name = sec->compressed_name;
+       if (load_specific_debug_section (i, section, file))
          {
            result &= debug_displays[i].display (sec, file);
 
-           if (i != info && i != abbrev)
+           if (secondary || (i != info && i != abbrev))
              free_debug_section (i);
          }
 
@@ -8994,6 +9050,29 @@ display_power_gnu_attribute (unsigned char *p, int tag)
       return p;
    }
 
+  if (tag == Tag_GNU_Power_ABI_Struct_Return)
+    {
+      val = read_uleb128 (p, &len);
+      p += len;
+      printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
+      switch (val)
+       {
+       case 0:
+         printf ("Any\n");
+         break;
+       case 1:
+         printf ("r3/r4\n");
+         break;
+       case 2:
+         printf ("Memory\n");
+         break;
+       default:
+         printf ("??? (%d)\n", val);
+         break;
+       }
+      return p;
+    }
+
   if (tag & 1)
     type = 1; /* String.  */
   else
@@ -10612,7 +10691,7 @@ process_archive (char *file_name, FILE *file)
          size -= index_num * SIZEOF_AR_INDEX_NUMBERS;
 
          /* Convert the index numbers into the host's numeric format.  */
-         index_array = malloc (index_num * sizeof (* index_array));      
+         index_array = malloc (index_num * sizeof (* index_array));
          if (index_array == NULL)
            {
              free (index_buffer);
@@ -10646,7 +10725,7 @@ process_archive (char *file_name, FILE *file)
              error (_("%s: failed to read archive index symbol table\n"), file_name);
              ret = 1;
              goto out;
-           }     
+           }
        }
       else
        {
@@ -10768,7 +10847,7 @@ process_archive (char *file_name, FILE *file)
                {
                  error (_("%s: end of the symbol table reached before the end of the index\n"),
                         file_name);
-                 break;                         
+                 break;
                }
              printf ("\t%s\n", sym_table + l);
              l += strlen (sym_table + l) + 1;
This page took 0.027972 seconds and 4 git commands to generate.