]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
Reduce common code in objdump.
authorUlrich Drepper <drepper@redhat.com>
Mon, 2 Feb 2009 03:06:10 +0000 (19:06 -0800)
committerUlrich Drepper <drepper@redhat.com>
Mon, 2 Feb 2009 03:06:10 +0000 (19:06 -0800)
Better error value on ebl_reloc_type_name.

libebl/ChangeLog
libebl/eblreloctypename.c
src/ChangeLog
src/objdump.c

index 51b3b705ed866c48c0cbdb767258f513dec3f40d..f1ba346a7402ce9b5ca2c14c94abda610ba654e6 100644 (file)
@@ -1,3 +1,8 @@
+2009-02-01  Ulrich Drepper  <drepper@redhat.com>
+
+       * eblreloctypename.c (ebl_reloc_type_name): Return "<INVALID RELOC>"
+       instead of "???" for invalid relocations.
+
 2008-08-01  Roland McGrath  <roland@redhat.com>
 
        * eblcorenotetypename.c: Handle NT_386_IOPERM.
index c715b064c598a761774de4e7f15fb9ba537e0461..3f2c7d9c778ec45b73904cc40804a5e29a5a158c 100644 (file)
@@ -1,5 +1,5 @@
 /* Return relocation type name.
-   Copyright (C) 2001, 2002 Red Hat, Inc.
+   Copyright (C) 2001, 2002, 2009 Red Hat, Inc.
    This file is part of Red Hat elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2001.
 
@@ -68,7 +68,7 @@ ebl_reloc_type_name (ebl, reloc, buf, len)
   res = ebl != NULL ? ebl->reloc_type_name (reloc, buf, len) : NULL;
   if (res == NULL)
     /* There are no generic relocation type names.  */
-    res = "???";
+    res = "<INVALID RELOC>";
 
   return res;
 }
index ecc9bda765a39791f1c7dc4411462c8a4bc91162..c7ab78f406ff5654a59ef6e1995a9665c349159d 100644 (file)
@@ -1,5 +1,9 @@
 2009-02-01  Ulrich Drepper  <drepper@redhat.com>
 
+       * objdump.c (show_relocs_rel, show_relocs_rela): Split common parts
+       into ...
+       (show_relocs_x): ...here.  New function.
+
        * objdump.c (show_relocs_rela): Show offsets as signed values.
 
        * ar.c (main): Fix recognition of invalid modes for a, b, i modifiers.
index 8419f25fd6f61870aab3299d553c983361d14a00..4d8595c027ba12f72c8f42cfcdce580a2b1a2d81 100644 (file)
@@ -357,12 +357,68 @@ handle_ar (int fd, Elf *elf, const char *prefix, const char *fname,
 }
 
 
+static void
+show_relocs_x (Ebl *ebl, GElf_Shdr *shdr, Elf_Data *symdata,
+              Elf_Data *xndxdata, size_t symstrndx, size_t shstrndx,
+              GElf_Addr r_offset, GElf_Xword r_info, GElf_Sxword r_addend)
+{
+  int elfclass = gelf_getclass (ebl->elf);
+  char buf[128];
+  GElf_Sym symmem;
+  GElf_Sym *sym;
+  Elf32_Word xndx;
+
+  printf ("%0*" PRIx64 " %-20s ",
+         elfclass == ELFCLASS32 ? 8 : 16, r_offset,
+         ebl_reloc_type_name (ebl, GELF_R_TYPE (r_info), buf, sizeof (buf)));
+
+  sym = gelf_getsymshndx (symdata, xndxdata, GELF_R_SYM (r_info),
+                         &symmem, &xndx);
+
+  if (sym == NULL)
+    printf ("<%s %ld>",
+           gettext ("INVALID SYMBOL"), (long int) GELF_R_SYM (r_info));
+  else if (GELF_ST_TYPE (sym->st_info) != STT_SECTION)
+    printf ("%s",
+           elf_strptr (ebl->elf, symstrndx, sym->st_name));
+  else
+    {
+      GElf_Shdr destshdr_mem;
+      GElf_Shdr *destshdr;
+      destshdr = gelf_getshdr (elf_getscn (ebl->elf,
+                                          sym->st_shndx == SHN_XINDEX
+                                          ? xndx : sym->st_shndx),
+                              &destshdr_mem);
+
+      if (shdr == NULL)
+       printf ("<%s %ld>",
+               gettext ("INVALID SECTION"),
+               (long int) (sym->st_shndx == SHN_XINDEX
+                           ? xndx : sym->st_shndx));
+      else
+       printf ("%s",
+               elf_strptr (ebl->elf, shstrndx, destshdr->sh_name));
+    }
+
+  if (r_addend != 0)
+    {
+      char sign = '+';
+      if (r_addend < 0)
+       {
+         sign = '-';
+         r_addend = -r_addend;
+       }
+      printf ("%c%#" PRIx64, sign, r_addend);
+    }
+  putchar ('\n');
+}
+
+
 static void
 show_relocs_rel (Ebl *ebl, GElf_Shdr *shdr, Elf_Data *data,
                 Elf_Data *symdata, Elf_Data *xndxdata, size_t symstrndx,
                 size_t shstrndx)
 {
-  int elfclass = gelf_getclass (ebl->elf);
   int nentries = shdr->sh_size / shdr->sh_entsize;
 
   for (int cnt = 0; cnt < nentries; ++cnt)
@@ -372,60 +428,8 @@ show_relocs_rel (Ebl *ebl, GElf_Shdr *shdr, Elf_Data *data,
 
       rel = gelf_getrel (data, cnt, &relmem);
       if (rel != NULL)
-       {
-         char buf[128];
-         GElf_Sym symmem;
-         GElf_Sym *sym;
-         Elf32_Word xndx;
-
-         sym = gelf_getsymshndx (symdata, xndxdata, GELF_R_SYM (rel->r_info),
-                                 &symmem, &xndx);
-         if (sym == NULL)
-           printf ("%0*" PRIx64 " %-20s <%s %ld>\n",
-                   elfclass == ELFCLASS32 ? 8 : 16, rel->r_offset,
-                   ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
-                   ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
-                                          buf, sizeof (buf))
-                   : gettext ("<INVALID RELOC>"),
-                   gettext ("INVALID SYMBOL"),
-                   (long int) GELF_R_SYM (rel->r_info));
-         else if (GELF_ST_TYPE (sym->st_info) != STT_SECTION)
-           printf ("%0*" PRIx64 " %-20s %s\n",
-                   elfclass == ELFCLASS32 ? 8 : 16, rel->r_offset,
-                   ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
-                   ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
-                                          buf, sizeof (buf))
-                   : gettext ("<INVALID RELOC>"),
-                   elf_strptr (ebl->elf, symstrndx, sym->st_name));
-         else
-           {
-             GElf_Shdr destshdr_mem;
-             GElf_Shdr *destshdr;
-             destshdr = gelf_getshdr (elf_getscn (ebl->elf,
-                                                  sym->st_shndx == SHN_XINDEX
-                                                  ? xndx : sym->st_shndx),
-                                      &destshdr_mem);
-
-             if (shdr == NULL)
-               printf ("%0*" PRIx64 " %-20s <%s %ld>\n",
-                       elfclass == ELFCLASS32 ? 8 : 16, rel->r_offset,
-                       ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
-                       ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
-                                              buf, sizeof (buf))
-                       : gettext ("<INVALID RELOC>"),
-                       gettext ("INVALID SECTION"),
-                       (long int) (sym->st_shndx == SHN_XINDEX
-                                   ? xndx : sym->st_shndx));
-             else
-               printf ("%0*" PRIx64 " %-20s %s\n",
-                       elfclass == ELFCLASS32 ? 8 : 16, rel->r_offset,
-                       ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
-                       ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
-                                              buf, sizeof (buf))
-                       : gettext ("<INVALID RELOC>"),
-                       elf_strptr (ebl->elf, shstrndx, destshdr->sh_name));
-           }
-       }
+       show_relocs_x (ebl, shdr, symdata, xndxdata, symstrndx, shstrndx,
+                      rel->r_offset, rel->r_info, 0);
     }
 }
 
@@ -435,7 +439,6 @@ show_relocs_rela (Ebl *ebl, GElf_Shdr *shdr, Elf_Data *data,
                  Elf_Data *symdata, Elf_Data *xndxdata, size_t symstrndx,
                  size_t shstrndx)
 {
-  int elfclass = gelf_getclass (ebl->elf);
   int nentries = shdr->sh_size / shdr->sh_entsize;
 
   for (int cnt = 0; cnt < nentries; ++cnt)
@@ -445,72 +448,8 @@ show_relocs_rela (Ebl *ebl, GElf_Shdr *shdr, Elf_Data *data,
 
       rel = gelf_getrela (data, cnt, &relmem);
       if (rel != NULL)
-       {
-         char buf[128];
-         GElf_Sym symmem;
-         GElf_Sym *sym;
-         Elf32_Word xndx;
-
-         sym = gelf_getsymshndx (symdata, xndxdata, GELF_R_SYM (rel->r_info),
-                                 &symmem, &xndx);
-         if (sym == NULL)
-           printf ("%0*" PRIx64 " %-20s <%s %ld>",
-                   elfclass == ELFCLASS32 ? 8 : 16, rel->r_offset,
-                   ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
-                   ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
-                                          buf, sizeof (buf))
-                   : gettext ("<INVALID RELOC>"),
-                   gettext ("INVALID SYMBOL"),
-                   (long int) GELF_R_SYM (rel->r_info));
-         else if (GELF_ST_TYPE (sym->st_info) != STT_SECTION)
-           printf ("%0*" PRIx64 " %-20s %s",
-                   elfclass == ELFCLASS32 ? 8 : 16, rel->r_offset,
-                   ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
-                   ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
-                                          buf, sizeof (buf))
-                   : gettext ("<INVALID RELOC>"),
-                   elf_strptr (ebl->elf, symstrndx, sym->st_name));
-         else
-           {
-             GElf_Shdr destshdr_mem;
-             GElf_Shdr *destshdr;
-             destshdr = gelf_getshdr (elf_getscn (ebl->elf,
-                                                  sym->st_shndx == SHN_XINDEX
-                                                  ? xndx : sym->st_shndx),
-                                      &destshdr_mem);
-
-             if (shdr == NULL)
-               printf ("%0*" PRIx64 " %-20s <%s %ld>",
-                       elfclass == ELFCLASS32 ? 8 : 16, rel->r_offset,
-                       ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
-                       ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
-                                              buf, sizeof (buf))
-                       : gettext ("<INVALID RELOC>"),
-                       gettext ("INVALID SECTION"),
-                       (long int) (sym->st_shndx == SHN_XINDEX
-                                   ? xndx : sym->st_shndx));
-             else
-               printf ("%0*" PRIx64 " %-20s %s",
-                       elfclass == ELFCLASS32 ? 8 : 16, rel->r_offset,
-                       ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
-                       ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
-                                              buf, sizeof (buf))
-                       : gettext ("<INVALID RELOC>"),
-                       elf_strptr (ebl->elf, shstrndx, destshdr->sh_name));
-           }
-
-         if (rel->r_addend != 0)
-           {
-             char sign = '+';
-             if (rel->r_addend < 0)
-               {
-                 sign = '-';
-                 rel->r_addend = -rel->r_addend;
-               }
-             printf ("%c%#" PRIx64, sign, rel->r_addend);
-           }
-         putchar ('\n');
-       }
+       show_relocs_x (ebl, shdr, symdata, xndxdata, symstrndx, shstrndx,
+                      rel->r_offset, rel->r_info, rel->r_addend);
     }
 }