From: Ulrich Drepper Date: Mon, 2 Feb 2009 03:06:10 +0000 (-0800) Subject: Reduce common code in objdump. X-Git-Tag: elfutils-0.140~16 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=95fa15e7b3af7321dc70dc453eb9cb0596b5a817;p=thirdparty%2Felfutils.git Reduce common code in objdump. Better error value on ebl_reloc_type_name. --- diff --git a/libebl/ChangeLog b/libebl/ChangeLog index 51b3b705e..f1ba346a7 100644 --- a/libebl/ChangeLog +++ b/libebl/ChangeLog @@ -1,3 +1,8 @@ +2009-02-01 Ulrich Drepper + + * eblreloctypename.c (ebl_reloc_type_name): Return "" + instead of "???" for invalid relocations. + 2008-08-01 Roland McGrath * eblcorenotetypename.c: Handle NT_386_IOPERM. diff --git a/libebl/eblreloctypename.c b/libebl/eblreloctypename.c index c715b064c..3f2c7d9c7 100644 --- a/libebl/eblreloctypename.c +++ b/libebl/eblreloctypename.c @@ -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 , 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 = ""; return res; } diff --git a/src/ChangeLog b/src/ChangeLog index ecc9bda76..c7ab78f40 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,9 @@ 2009-02-01 Ulrich Drepper + * 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. diff --git a/src/objdump.c b/src/objdump.c index 8419f25fd..4d8595c02 100644 --- a/src/objdump.c +++ b/src/objdump.c @@ -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 (""), - 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 (""), - 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 (""), - 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 (""), - 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 (""), - 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 (""), - 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 (""), - 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 (""), - 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); } }