summaryrefslogtreecommitdiff
path: root/src/objdump.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2009-02-01 19:06:10 -0800
committerUlrich Drepper <drepper@redhat.com>2009-02-01 19:06:10 -0800
commit95fa15e7b3af7321dc70dc453eb9cb0596b5a817 (patch)
tree495c21798e2a32b7951291716f8b14b63fa7ee3d /src/objdump.c
parentcbb422eb102660d97209ec632e3b6572f0b0c7a6 (diff)
downloadelfutils-95fa15e7b3af7321dc70dc453eb9cb0596b5a817.tar.gz
Reduce common code in objdump.
Better error value on ebl_reloc_type_name.
Diffstat (limited to 'src/objdump.c')
-rw-r--r--src/objdump.c183
1 files changed, 61 insertions, 122 deletions
diff --git a/src/objdump.c b/src/objdump.c
index 8419f25f..4d8595c0 100644
--- a/src/objdump.c
+++ b/src/objdump.c
@@ -358,11 +358,67 @@ 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);
}
}