diff options
author | Ulrich Drepper <drepper@redhat.com> | 2009-02-01 19:06:10 -0800 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2009-02-01 19:06:10 -0800 |
commit | 95fa15e7b3af7321dc70dc453eb9cb0596b5a817 (patch) | |
tree | 495c21798e2a32b7951291716f8b14b63fa7ee3d /src/objdump.c | |
parent | cbb422eb102660d97209ec632e3b6572f0b0c7a6 (diff) | |
download | elfutils-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.c | 183 |
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); } } |