elfdump.c (231815) | elfdump.c (241737) |
---|---|
1/*- 2 * Copyright (c) 2003 David O'Brien. All rights reserved. 3 * Copyright (c) 2001 Jake Burkholder 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 12 unchanged lines hidden (view full) --- 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 28#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2003 David O'Brien. All rights reserved. 3 * Copyright (c) 2001 Jake Burkholder 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 12 unchanged lines hidden (view full) --- 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 28#include <sys/cdefs.h> |
29__FBSDID("$FreeBSD: head/usr.bin/elfdump/elfdump.c 231815 2012-02-16 05:16:55Z eadler $"); | 29__FBSDID("$FreeBSD: head/usr.bin/elfdump/elfdump.c 241737 2012-10-19 14:49:42Z ed $"); |
30 31#include <sys/types.h> 32#include <sys/elf32.h> 33#include <sys/elf64.h> 34#include <sys/endian.h> 35#include <sys/mman.h> 36#include <sys/stat.h> 37#include <err.h> --- 40 unchanged lines hidden (view full) --- 78 79 R_OFFSET, R_INFO, 80 81 RA_OFFSET, RA_INFO, RA_ADDEND 82}; 83 84typedef enum elf_member elf_member_t; 85 | 30 31#include <sys/types.h> 32#include <sys/elf32.h> 33#include <sys/elf64.h> 34#include <sys/endian.h> 35#include <sys/mman.h> 36#include <sys/stat.h> 37#include <err.h> --- 40 unchanged lines hidden (view full) --- 78 79 R_OFFSET, R_INFO, 80 81 RA_OFFSET, RA_INFO, RA_ADDEND 82}; 83 84typedef enum elf_member elf_member_t; 85 |
86int elf32_offsets[] = { | 86static int elf32_offsets[] = { |
87 0, 88 89 offsetof(Elf32_Dyn, d_tag), offsetof(Elf32_Dyn, d_un.d_ptr), 90 offsetof(Elf32_Dyn, d_un.d_val), 91 92 offsetof(Elf32_Ehdr, e_ident[EI_CLASS]), 93 offsetof(Elf32_Ehdr, e_ident[EI_DATA]), 94 offsetof(Elf32_Ehdr, e_ident[EI_OSABI]), --- 24 unchanged lines hidden (view full) --- 119 offsetof(Elf32_Sym, st_shndx), 120 121 offsetof(Elf32_Rel, r_offset), offsetof(Elf32_Rel, r_info), 122 123 offsetof(Elf32_Rela, r_offset), offsetof(Elf32_Rela, r_info), 124 offsetof(Elf32_Rela, r_addend) 125}; 126 | 87 0, 88 89 offsetof(Elf32_Dyn, d_tag), offsetof(Elf32_Dyn, d_un.d_ptr), 90 offsetof(Elf32_Dyn, d_un.d_val), 91 92 offsetof(Elf32_Ehdr, e_ident[EI_CLASS]), 93 offsetof(Elf32_Ehdr, e_ident[EI_DATA]), 94 offsetof(Elf32_Ehdr, e_ident[EI_OSABI]), --- 24 unchanged lines hidden (view full) --- 119 offsetof(Elf32_Sym, st_shndx), 120 121 offsetof(Elf32_Rel, r_offset), offsetof(Elf32_Rel, r_info), 122 123 offsetof(Elf32_Rela, r_offset), offsetof(Elf32_Rela, r_info), 124 offsetof(Elf32_Rela, r_addend) 125}; 126 |
127int elf64_offsets[] = { | 127static int elf64_offsets[] = { |
128 0, 129 130 offsetof(Elf64_Dyn, d_tag), offsetof(Elf64_Dyn, d_un.d_ptr), 131 offsetof(Elf64_Dyn, d_un.d_val), 132 133 offsetof(Elf32_Ehdr, e_ident[EI_CLASS]), 134 offsetof(Elf32_Ehdr, e_ident[EI_DATA]), 135 offsetof(Elf32_Ehdr, e_ident[EI_OSABI]), --- 125 unchanged lines hidden (view full) --- 261 case EM_IA_64: return "EM_IA_64"; 262 case EM_X86_64: return "EM_X86_64"; 263 } 264 snprintf(machdesc, sizeof(machdesc), 265 "(unknown machine) -- type 0x%x", mach); 266 return (machdesc); 267} 268 | 128 0, 129 130 offsetof(Elf64_Dyn, d_tag), offsetof(Elf64_Dyn, d_un.d_ptr), 131 offsetof(Elf64_Dyn, d_un.d_val), 132 133 offsetof(Elf32_Ehdr, e_ident[EI_CLASS]), 134 offsetof(Elf32_Ehdr, e_ident[EI_DATA]), 135 offsetof(Elf32_Ehdr, e_ident[EI_OSABI]), --- 125 unchanged lines hidden (view full) --- 261 case EM_IA_64: return "EM_IA_64"; 262 case EM_X86_64: return "EM_X86_64"; 263 } 264 snprintf(machdesc, sizeof(machdesc), 265 "(unknown machine) -- type 0x%x", mach); 266 return (machdesc); 267} 268 |
269const char *e_types[] = { | 269static const char *e_types[] = { |
270 "ET_NONE", "ET_REL", "ET_EXEC", "ET_DYN", "ET_CORE" 271}; 272 | 270 "ET_NONE", "ET_REL", "ET_EXEC", "ET_DYN", "ET_CORE" 271}; 272 |
273const char *ei_versions[] = { | 273static const char *ei_versions[] = { |
274 "EV_NONE", "EV_CURRENT" 275}; 276 | 274 "EV_NONE", "EV_CURRENT" 275}; 276 |
277const char *ei_classes[] = { | 277static const char *ei_classes[] = { |
278 "ELFCLASSNONE", "ELFCLASS32", "ELFCLASS64" 279}; 280 | 278 "ELFCLASSNONE", "ELFCLASS32", "ELFCLASS64" 279}; 280 |
281const char *ei_data[] = { | 281static const char *ei_data[] = { |
282 "ELFDATANONE", "ELFDATA2LSB", "ELFDATA2MSB" 283}; 284 | 282 "ELFDATANONE", "ELFDATA2LSB", "ELFDATA2MSB" 283}; 284 |
285const char *ei_abis[256] = { | 285static const char *ei_abis[256] = { |
286 "ELFOSABI_SYSV", "ELFOSABI_HPUX", "ELFOSABI_NETBSD", "ELFOSABI_LINUX", 287 "ELFOSABI_HURD", "ELFOSABI_86OPEN", "ELFOSABI_SOLARIS", "ELFOSABI_AIX", 288 "ELFOSABI_IRIX", "ELFOSABI_FREEBSD", "ELFOSABI_TRU64", 289 "ELFOSABI_MODESTO", "ELFOSABI_OPENBSD", 290 [255] = "ELFOSABI_STANDALONE" 291}; 292 | 286 "ELFOSABI_SYSV", "ELFOSABI_HPUX", "ELFOSABI_NETBSD", "ELFOSABI_LINUX", 287 "ELFOSABI_HURD", "ELFOSABI_86OPEN", "ELFOSABI_SOLARIS", "ELFOSABI_AIX", 288 "ELFOSABI_IRIX", "ELFOSABI_FREEBSD", "ELFOSABI_TRU64", 289 "ELFOSABI_MODESTO", "ELFOSABI_OPENBSD", 290 [255] = "ELFOSABI_STANDALONE" 291}; 292 |
293const char *p_types[] = { | 293static const char *p_types[] = { |
294 "PT_NULL", "PT_LOAD", "PT_DYNAMIC", "PT_INTERP", "PT_NOTE", 295 "PT_SHLIB", "PT_PHDR", "PT_TLS" 296}; 297 | 294 "PT_NULL", "PT_LOAD", "PT_DYNAMIC", "PT_INTERP", "PT_NOTE", 295 "PT_SHLIB", "PT_PHDR", "PT_TLS" 296}; 297 |
298const char *p_flags[] = { | 298static const char *p_flags[] = { |
299 "", "PF_X", "PF_W", "PF_X|PF_W", "PF_R", "PF_X|PF_R", "PF_W|PF_R", 300 "PF_X|PF_W|PF_R" 301}; 302 303/* http://www.sco.com/developers/gabi/latest/ch4.sheader.html#sh_type */ 304static const char * 305sh_types(u_int64_t sht) { 306 switch (sht) { --- 27 unchanged lines hidden (view full) --- 334 case 0x70000001: return "SHT_IA_64_UNWIND"; 335 case 0x7ffffffd: return "XXX:AUXILIARY"; 336 case 0x7fffffff: return "XXX:FILTER"; 337 /* 0x80000000 - 0xffffffff application programs */ 338 default: return "ERROR: SHT NOT DEFINED"; 339 } 340} 341 | 299 "", "PF_X", "PF_W", "PF_X|PF_W", "PF_R", "PF_X|PF_R", "PF_W|PF_R", 300 "PF_X|PF_W|PF_R" 301}; 302 303/* http://www.sco.com/developers/gabi/latest/ch4.sheader.html#sh_type */ 304static const char * 305sh_types(u_int64_t sht) { 306 switch (sht) { --- 27 unchanged lines hidden (view full) --- 334 case 0x70000001: return "SHT_IA_64_UNWIND"; 335 case 0x7ffffffd: return "XXX:AUXILIARY"; 336 case 0x7fffffff: return "XXX:FILTER"; 337 /* 0x80000000 - 0xffffffff application programs */ 338 default: return "ERROR: SHT NOT DEFINED"; 339 } 340} 341 |
342const char *sh_flags[] = { | 342static const char *sh_flags[] = { |
343 "", "SHF_WRITE", "SHF_ALLOC", "SHF_WRITE|SHF_ALLOC", "SHF_EXECINSTR", 344 "SHF_WRITE|SHF_EXECINSTR", "SHF_ALLOC|SHF_EXECINSTR", 345 "SHF_WRITE|SHF_ALLOC|SHF_EXECINSTR" 346}; 347 | 343 "", "SHF_WRITE", "SHF_ALLOC", "SHF_WRITE|SHF_ALLOC", "SHF_EXECINSTR", 344 "SHF_WRITE|SHF_EXECINSTR", "SHF_ALLOC|SHF_EXECINSTR", 345 "SHF_WRITE|SHF_ALLOC|SHF_EXECINSTR" 346}; 347 |
348const char *st_types[] = { | 348static const char *st_types[] = { |
349 "STT_NOTYPE", "STT_OBJECT", "STT_FUNC", "STT_SECTION", "STT_FILE" 350}; 351 | 349 "STT_NOTYPE", "STT_OBJECT", "STT_FUNC", "STT_SECTION", "STT_FILE" 350}; 351 |
352const char *st_bindings[] = { | 352static const char *st_bindings[] = { |
353 "STB_LOCAL", "STB_GLOBAL", "STB_WEAK" 354}; 355 | 353 "STB_LOCAL", "STB_GLOBAL", "STB_WEAK" 354}; 355 |
356char *dynstr; 357char *shstrtab; 358char *strtab; 359FILE *out; | 356static char *dynstr; 357static char *shstrtab; 358static char *strtab; 359static FILE *out; |
360 | 360 |
361u_int64_t elf_get_byte(Elf32_Ehdr *e, void *base, elf_member_t member); 362u_int64_t elf_get_quarter(Elf32_Ehdr *e, void *base, elf_member_t member); 363u_int64_t elf_get_half(Elf32_Ehdr *e, void *base, elf_member_t member); 364u_int64_t elf_get_word(Elf32_Ehdr *e, void *base, elf_member_t member); 365u_int64_t elf_get_quad(Elf32_Ehdr *e, void *base, elf_member_t member); | 361static u_int64_t elf_get_byte(Elf32_Ehdr *e, void *base, elf_member_t member); 362static u_int64_t elf_get_quarter(Elf32_Ehdr *e, void *base, 363 elf_member_t member); 364#if 0 365static u_int64_t elf_get_half(Elf32_Ehdr *e, void *base, elf_member_t member); 366#endif 367static u_int64_t elf_get_word(Elf32_Ehdr *e, void *base, elf_member_t member); 368static u_int64_t elf_get_quad(Elf32_Ehdr *e, void *base, elf_member_t member); |
366 | 369 |
367void elf_print_ehdr(Elf32_Ehdr *e); 368void elf_print_phdr(Elf32_Ehdr *e, void *p); 369void elf_print_shdr(Elf32_Ehdr *e, void *sh); 370void elf_print_symtab(Elf32_Ehdr *e, void *sh, char *str); 371void elf_print_dynamic(Elf32_Ehdr *e, void *sh); 372void elf_print_rel(Elf32_Ehdr *e, void *r); 373void elf_print_rela(Elf32_Ehdr *e, void *ra); 374void elf_print_interp(Elf32_Ehdr *e, void *p); 375void elf_print_got(Elf32_Ehdr *e, void *sh); 376void elf_print_hash(Elf32_Ehdr *e, void *sh); 377void elf_print_note(Elf32_Ehdr *e, void *sh); | 370static void elf_print_ehdr(Elf32_Ehdr *e); 371static void elf_print_phdr(Elf32_Ehdr *e, void *p); 372static void elf_print_shdr(Elf32_Ehdr *e, void *sh); 373static void elf_print_symtab(Elf32_Ehdr *e, void *sh, char *str); 374static void elf_print_dynamic(Elf32_Ehdr *e, void *sh); 375static void elf_print_rel(Elf32_Ehdr *e, void *r); 376static void elf_print_rela(Elf32_Ehdr *e, void *ra); 377static void elf_print_interp(Elf32_Ehdr *e, void *p); 378static void elf_print_got(Elf32_Ehdr *e, void *sh); 379static void elf_print_hash(Elf32_Ehdr *e, void *sh); 380static void elf_print_note(Elf32_Ehdr *e, void *sh); |
378 | 381 |
379void usage(void); | 382static void usage(void); |
380 381int 382main(int ac, char **av) 383{ 384 u_int64_t phoff; 385 u_int64_t shoff; 386 u_int64_t phentsize; 387 u_int64_t phnum; --- 158 unchanged lines hidden (view full) --- 546 case SHT_SHLIB: 547 break; 548 } 549 } 550 551 return 0; 552} 553 | 383 384int 385main(int ac, char **av) 386{ 387 u_int64_t phoff; 388 u_int64_t shoff; 389 u_int64_t phentsize; 390 u_int64_t phnum; --- 158 unchanged lines hidden (view full) --- 549 case SHT_SHLIB: 550 break; 551 } 552 } 553 554 return 0; 555} 556 |
554void | 557static void |
555elf_print_ehdr(Elf32_Ehdr *e) 556{ 557 u_int64_t class; 558 u_int64_t data; 559 u_int64_t osabi; 560 u_int64_t type; 561 u_int64_t machine; 562 u_int64_t version; --- 38 unchanged lines hidden (view full) --- 601 fprintf(out, "\te_ehsize: %jd\n", (intmax_t)ehsize); 602 fprintf(out, "\te_phentsize: %jd\n", (intmax_t)phentsize); 603 fprintf(out, "\te_phnum: %jd\n", (intmax_t)phnum); 604 fprintf(out, "\te_shentsize: %jd\n", (intmax_t)shentsize); 605 fprintf(out, "\te_shnum: %jd\n", (intmax_t)shnum); 606 fprintf(out, "\te_shstrndx: %jd\n", (intmax_t)shstrndx); 607} 608 | 558elf_print_ehdr(Elf32_Ehdr *e) 559{ 560 u_int64_t class; 561 u_int64_t data; 562 u_int64_t osabi; 563 u_int64_t type; 564 u_int64_t machine; 565 u_int64_t version; --- 38 unchanged lines hidden (view full) --- 604 fprintf(out, "\te_ehsize: %jd\n", (intmax_t)ehsize); 605 fprintf(out, "\te_phentsize: %jd\n", (intmax_t)phentsize); 606 fprintf(out, "\te_phnum: %jd\n", (intmax_t)phnum); 607 fprintf(out, "\te_shentsize: %jd\n", (intmax_t)shentsize); 608 fprintf(out, "\te_shnum: %jd\n", (intmax_t)shnum); 609 fprintf(out, "\te_shstrndx: %jd\n", (intmax_t)shstrndx); 610} 611 |
609void | 612static void |
610elf_print_phdr(Elf32_Ehdr *e, void *p) 611{ 612 u_int64_t phentsize; 613 u_int64_t phnum; 614 u_int64_t type; 615 u_int64_t offset; 616 u_int64_t vaddr; 617 u_int64_t paddr; --- 25 unchanged lines hidden (view full) --- 643 fprintf(out, "\tp_paddr: %#jx\n", (intmax_t)paddr); 644 fprintf(out, "\tp_filesz: %jd\n", (intmax_t)filesz); 645 fprintf(out, "\tp_memsz: %jd\n", (intmax_t)memsz); 646 fprintf(out, "\tp_flags: %s\n", p_flags[flags]); 647 fprintf(out, "\tp_align: %jd\n", (intmax_t)align); 648 } 649} 650 | 613elf_print_phdr(Elf32_Ehdr *e, void *p) 614{ 615 u_int64_t phentsize; 616 u_int64_t phnum; 617 u_int64_t type; 618 u_int64_t offset; 619 u_int64_t vaddr; 620 u_int64_t paddr; --- 25 unchanged lines hidden (view full) --- 646 fprintf(out, "\tp_paddr: %#jx\n", (intmax_t)paddr); 647 fprintf(out, "\tp_filesz: %jd\n", (intmax_t)filesz); 648 fprintf(out, "\tp_memsz: %jd\n", (intmax_t)memsz); 649 fprintf(out, "\tp_flags: %s\n", p_flags[flags]); 650 fprintf(out, "\tp_align: %jd\n", (intmax_t)align); 651 } 652} 653 |
651void | 654static void |
652elf_print_shdr(Elf32_Ehdr *e, void *sh) 653{ 654 u_int64_t shentsize; 655 u_int64_t shnum; 656 u_int64_t name; 657 u_int64_t type; 658 u_int64_t flags; 659 u_int64_t addr; --- 31 unchanged lines hidden (view full) --- 691 fprintf(out, "\tsh_size: %jd\n", (intmax_t)size); 692 fprintf(out, "\tsh_link: %jd\n", (intmax_t)shlink); 693 fprintf(out, "\tsh_info: %jd\n", (intmax_t)info); 694 fprintf(out, "\tsh_addralign: %jd\n", (intmax_t)addralign); 695 fprintf(out, "\tsh_entsize: %jd\n", (intmax_t)entsize); 696 } 697} 698 | 655elf_print_shdr(Elf32_Ehdr *e, void *sh) 656{ 657 u_int64_t shentsize; 658 u_int64_t shnum; 659 u_int64_t name; 660 u_int64_t type; 661 u_int64_t flags; 662 u_int64_t addr; --- 31 unchanged lines hidden (view full) --- 694 fprintf(out, "\tsh_size: %jd\n", (intmax_t)size); 695 fprintf(out, "\tsh_link: %jd\n", (intmax_t)shlink); 696 fprintf(out, "\tsh_info: %jd\n", (intmax_t)info); 697 fprintf(out, "\tsh_addralign: %jd\n", (intmax_t)addralign); 698 fprintf(out, "\tsh_entsize: %jd\n", (intmax_t)entsize); 699 } 700} 701 |
699void | 702static void |
700elf_print_symtab(Elf32_Ehdr *e, void *sh, char *str) 701{ 702 u_int64_t offset; 703 u_int64_t entsize; 704 u_int64_t size; 705 u_int64_t name; 706 u_int64_t value; 707 u_int64_t info; --- 22 unchanged lines hidden (view full) --- 730 fprintf(out, "\tst_size: %jd\n", (intmax_t)size); 731 fprintf(out, "\tst_info: %s %s\n", 732 st_types[ELF32_ST_TYPE(info)], 733 st_bindings[ELF32_ST_BIND(info)]); 734 fprintf(out, "\tst_shndx: %jd\n", (intmax_t)shndx); 735 } 736} 737 | 703elf_print_symtab(Elf32_Ehdr *e, void *sh, char *str) 704{ 705 u_int64_t offset; 706 u_int64_t entsize; 707 u_int64_t size; 708 u_int64_t name; 709 u_int64_t value; 710 u_int64_t info; --- 22 unchanged lines hidden (view full) --- 733 fprintf(out, "\tst_size: %jd\n", (intmax_t)size); 734 fprintf(out, "\tst_info: %s %s\n", 735 st_types[ELF32_ST_TYPE(info)], 736 st_bindings[ELF32_ST_BIND(info)]); 737 fprintf(out, "\tst_shndx: %jd\n", (intmax_t)shndx); 738 } 739} 740 |
738void | 741static void |
739elf_print_dynamic(Elf32_Ehdr *e, void *sh) 740{ 741 u_int64_t offset; 742 u_int64_t entsize; 743 u_int64_t size; 744 int64_t tag; 745 u_int64_t ptr; 746 u_int64_t val; --- 43 unchanged lines hidden (view full) --- 790 case DT_SYMBOLIC: 791 case DT_DEBUG: 792 case DT_TEXTREL: 793 break; 794 } 795 } 796} 797 | 742elf_print_dynamic(Elf32_Ehdr *e, void *sh) 743{ 744 u_int64_t offset; 745 u_int64_t entsize; 746 u_int64_t size; 747 int64_t tag; 748 u_int64_t ptr; 749 u_int64_t val; --- 43 unchanged lines hidden (view full) --- 793 case DT_SYMBOLIC: 794 case DT_DEBUG: 795 case DT_TEXTREL: 796 break; 797 } 798 } 799} 800 |
798void | 801static void |
799elf_print_rela(Elf32_Ehdr *e, void *sh) 800{ 801 u_int64_t offset; 802 u_int64_t entsize; 803 u_int64_t size; 804 u_int64_t name; 805 u_int64_t info; 806 int64_t addend; --- 15 unchanged lines hidden (view full) --- 822 fprintf(out, "\n"); 823 fprintf(out, "entry: %d\n", i); 824 fprintf(out, "\tr_offset: %#jx\n", offset); 825 fprintf(out, "\tr_info: %jd\n", (intmax_t)info); 826 fprintf(out, "\tr_addend: %jd\n", (intmax_t)addend); 827 } 828} 829 | 802elf_print_rela(Elf32_Ehdr *e, void *sh) 803{ 804 u_int64_t offset; 805 u_int64_t entsize; 806 u_int64_t size; 807 u_int64_t name; 808 u_int64_t info; 809 int64_t addend; --- 15 unchanged lines hidden (view full) --- 825 fprintf(out, "\n"); 826 fprintf(out, "entry: %d\n", i); 827 fprintf(out, "\tr_offset: %#jx\n", offset); 828 fprintf(out, "\tr_info: %jd\n", (intmax_t)info); 829 fprintf(out, "\tr_addend: %jd\n", (intmax_t)addend); 830 } 831} 832 |
830void | 833static void |
831elf_print_rel(Elf32_Ehdr *e, void *sh) 832{ 833 u_int64_t offset; 834 u_int64_t entsize; 835 u_int64_t size; 836 u_int64_t name; 837 u_int64_t info; 838 void *r; --- 12 unchanged lines hidden (view full) --- 851 info = elf_get_word(e, r, R_INFO); 852 fprintf(out, "\n"); 853 fprintf(out, "entry: %d\n", i); 854 fprintf(out, "\tr_offset: %#jx\n", offset); 855 fprintf(out, "\tr_info: %jd\n", (intmax_t)info); 856 } 857} 858 | 834elf_print_rel(Elf32_Ehdr *e, void *sh) 835{ 836 u_int64_t offset; 837 u_int64_t entsize; 838 u_int64_t size; 839 u_int64_t name; 840 u_int64_t info; 841 void *r; --- 12 unchanged lines hidden (view full) --- 854 info = elf_get_word(e, r, R_INFO); 855 fprintf(out, "\n"); 856 fprintf(out, "entry: %d\n", i); 857 fprintf(out, "\tr_offset: %#jx\n", offset); 858 fprintf(out, "\tr_info: %jd\n", (intmax_t)info); 859 } 860} 861 |
859void | 862static void |
860elf_print_interp(Elf32_Ehdr *e, void *p) 861{ 862 u_int64_t offset; 863 char *s; 864 865 offset = elf_get_off(e, p, P_OFFSET); 866 s = (char *)e + offset; 867 fprintf(out, "\ninterp:\n"); 868 fprintf(out, "\t%s\n", s); 869} 870 | 863elf_print_interp(Elf32_Ehdr *e, void *p) 864{ 865 u_int64_t offset; 866 char *s; 867 868 offset = elf_get_off(e, p, P_OFFSET); 869 s = (char *)e + offset; 870 fprintf(out, "\ninterp:\n"); 871 fprintf(out, "\t%s\n", s); 872} 873 |
871void | 874static void |
872elf_print_got(Elf32_Ehdr *e, void *sh) 873{ 874 u_int64_t offset; 875 u_int64_t addralign; 876 u_int64_t size; 877 u_int64_t addr; 878 void *v; 879 int i; --- 6 unchanged lines hidden (view full) --- 886 for (i = 0; (u_int64_t)i < size / addralign; i++) { 887 addr = elf_get_addr(e, (char *)v + i * addralign, 0); 888 fprintf(out, "\n"); 889 fprintf(out, "entry: %d\n", i); 890 fprintf(out, "\t%#jx\n", addr); 891 } 892} 893 | 875elf_print_got(Elf32_Ehdr *e, void *sh) 876{ 877 u_int64_t offset; 878 u_int64_t addralign; 879 u_int64_t size; 880 u_int64_t addr; 881 void *v; 882 int i; --- 6 unchanged lines hidden (view full) --- 889 for (i = 0; (u_int64_t)i < size / addralign; i++) { 890 addr = elf_get_addr(e, (char *)v + i * addralign, 0); 891 fprintf(out, "\n"); 892 fprintf(out, "entry: %d\n", i); 893 fprintf(out, "\t%#jx\n", addr); 894 } 895} 896 |
894void | 897static void |
895elf_print_hash(Elf32_Ehdr *e __unused, void *sh __unused) 896{ 897} 898 | 898elf_print_hash(Elf32_Ehdr *e __unused, void *sh __unused) 899{ 900} 901 |
899void | 902static void |
900elf_print_note(Elf32_Ehdr *e, void *sh) 901{ 902 u_int64_t offset; 903 u_int64_t size; 904 u_int64_t name; 905 u_int32_t namesz; 906 u_int32_t descsz; 907 u_int32_t desc; --- 9 unchanged lines hidden (view full) --- 917 descsz = elf_get_word(e, n, N_DESCSZ); 918 s = n + sizeof(Elf_Note); 919 desc = elf_get_word(e, n + sizeof(Elf_Note) + namesz, 0); 920 fprintf(out, "\t%s %d\n", s, desc); 921 n += sizeof(Elf_Note) + namesz + descsz; 922 } 923} 924 | 903elf_print_note(Elf32_Ehdr *e, void *sh) 904{ 905 u_int64_t offset; 906 u_int64_t size; 907 u_int64_t name; 908 u_int32_t namesz; 909 u_int32_t descsz; 910 u_int32_t desc; --- 9 unchanged lines hidden (view full) --- 920 descsz = elf_get_word(e, n, N_DESCSZ); 921 s = n + sizeof(Elf_Note); 922 desc = elf_get_word(e, n + sizeof(Elf_Note) + namesz, 0); 923 fprintf(out, "\t%s %d\n", s, desc); 924 n += sizeof(Elf_Note) + namesz + descsz; 925 } 926} 927 |
925u_int64_t | 928static u_int64_t |
926elf_get_byte(Elf32_Ehdr *e, void *base, elf_member_t member) 927{ 928 u_int64_t val; 929 930 val = 0; 931 switch (e->e_ident[EI_CLASS]) { 932 case ELFCLASS32: 933 val = ((uint8_t *)base)[elf32_offsets[member]]; 934 break; 935 case ELFCLASS64: 936 val = ((uint8_t *)base)[elf64_offsets[member]]; 937 break; 938 case ELFCLASSNONE: 939 errx(1, "invalid class"); 940 } 941 942 return val; 943} 944 | 929elf_get_byte(Elf32_Ehdr *e, void *base, elf_member_t member) 930{ 931 u_int64_t val; 932 933 val = 0; 934 switch (e->e_ident[EI_CLASS]) { 935 case ELFCLASS32: 936 val = ((uint8_t *)base)[elf32_offsets[member]]; 937 break; 938 case ELFCLASS64: 939 val = ((uint8_t *)base)[elf64_offsets[member]]; 940 break; 941 case ELFCLASSNONE: 942 errx(1, "invalid class"); 943 } 944 945 return val; 946} 947 |
945u_int64_t | 948static u_int64_t |
946elf_get_quarter(Elf32_Ehdr *e, void *base, elf_member_t member) 947{ 948 u_int64_t val; 949 950 val = 0; 951 switch (e->e_ident[EI_CLASS]) { 952 case ELFCLASS32: 953 base = (char *)base + elf32_offsets[member]; --- 23 unchanged lines hidden (view full) --- 977 break; 978 case ELFCLASSNONE: 979 errx(1, "invalid class"); 980 } 981 982 return val; 983} 984 | 949elf_get_quarter(Elf32_Ehdr *e, void *base, elf_member_t member) 950{ 951 u_int64_t val; 952 953 val = 0; 954 switch (e->e_ident[EI_CLASS]) { 955 case ELFCLASS32: 956 base = (char *)base + elf32_offsets[member]; --- 23 unchanged lines hidden (view full) --- 980 break; 981 case ELFCLASSNONE: 982 errx(1, "invalid class"); 983 } 984 985 return val; 986} 987 |
985u_int64_t | 988#if 0 989static u_int64_t |
986elf_get_half(Elf32_Ehdr *e, void *base, elf_member_t member) 987{ 988 u_int64_t val; 989 990 val = 0; 991 switch (e->e_ident[EI_CLASS]) { 992 case ELFCLASS32: 993 base = (char *)base + elf32_offsets[member]; --- 22 unchanged lines hidden (view full) --- 1016 } 1017 break; 1018 case ELFCLASSNONE: 1019 errx(1, "invalid class"); 1020 } 1021 1022 return val; 1023} | 990elf_get_half(Elf32_Ehdr *e, void *base, elf_member_t member) 991{ 992 u_int64_t val; 993 994 val = 0; 995 switch (e->e_ident[EI_CLASS]) { 996 case ELFCLASS32: 997 base = (char *)base + elf32_offsets[member]; --- 22 unchanged lines hidden (view full) --- 1020 } 1021 break; 1022 case ELFCLASSNONE: 1023 errx(1, "invalid class"); 1024 } 1025 1026 return val; 1027} |
1028#endif |
|
1024 | 1029 |
1025u_int64_t | 1030static u_int64_t |
1026elf_get_word(Elf32_Ehdr *e, void *base, elf_member_t member) 1027{ 1028 u_int64_t val; 1029 1030 val = 0; 1031 switch (e->e_ident[EI_CLASS]) { 1032 case ELFCLASS32: 1033 base = (char *)base + elf32_offsets[member]; --- 23 unchanged lines hidden (view full) --- 1057 break; 1058 case ELFCLASSNONE: 1059 errx(1, "invalid class"); 1060 } 1061 1062 return val; 1063} 1064 | 1031elf_get_word(Elf32_Ehdr *e, void *base, elf_member_t member) 1032{ 1033 u_int64_t val; 1034 1035 val = 0; 1036 switch (e->e_ident[EI_CLASS]) { 1037 case ELFCLASS32: 1038 base = (char *)base + elf32_offsets[member]; --- 23 unchanged lines hidden (view full) --- 1062 break; 1063 case ELFCLASSNONE: 1064 errx(1, "invalid class"); 1065 } 1066 1067 return val; 1068} 1069 |
1065u_int64_t | 1070static u_int64_t |
1066elf_get_quad(Elf32_Ehdr *e, void *base, elf_member_t member) 1067{ 1068 u_int64_t val; 1069 1070 val = 0; 1071 switch (e->e_ident[EI_CLASS]) { 1072 case ELFCLASS32: 1073 base = (char *)base + elf32_offsets[member]; --- 23 unchanged lines hidden (view full) --- 1097 break; 1098 case ELFCLASSNONE: 1099 errx(1, "invalid class"); 1100 } 1101 1102 return val; 1103} 1104 | 1071elf_get_quad(Elf32_Ehdr *e, void *base, elf_member_t member) 1072{ 1073 u_int64_t val; 1074 1075 val = 0; 1076 switch (e->e_ident[EI_CLASS]) { 1077 case ELFCLASS32: 1078 base = (char *)base + elf32_offsets[member]; --- 23 unchanged lines hidden (view full) --- 1102 break; 1103 case ELFCLASSNONE: 1104 errx(1, "invalid class"); 1105 } 1106 1107 return val; 1108} 1109 |
1105void | 1110static void |
1106usage(void) 1107{ 1108 fprintf(stderr, "usage: elfdump -a | -cdeGhinprs [-w file] file\n"); 1109 exit(1); 1110} | 1111usage(void) 1112{ 1113 fprintf(stderr, "usage: elfdump -a | -cdeGhinprs [-w file] file\n"); 1114 exit(1); 1115} |