Lines Matching defs:re

241 static void add_dumpop(struct readelf *re, size_t si, const char *sn, int op,
283 static void dump_ar(struct readelf *re, int);
284 static void dump_arm_attributes(struct readelf *re, uint8_t *p, uint8_t *pe);
285 static void dump_attributes(struct readelf *re);
287 static void dump_dwarf(struct readelf *re);
288 static void dump_dwarf_abbrev(struct readelf *re);
289 static void dump_dwarf_aranges(struct readelf *re);
290 static void dump_dwarf_block(struct readelf *re, uint8_t *b,
292 static void dump_dwarf_die(struct readelf *re, Dwarf_Die die, int level);
293 static void dump_dwarf_frame(struct readelf *re, int alt);
294 static void dump_dwarf_frame_inst(struct readelf *re, Dwarf_Cie cie,
297 static int dump_dwarf_frame_regtable(struct readelf *re, Dwarf_Fde fde,
299 static void dump_dwarf_frame_section(struct readelf *re, struct section *s,
301 static void dump_dwarf_info(struct readelf *re, Dwarf_Bool is_info);
302 static void dump_dwarf_macinfo(struct readelf *re);
303 static void dump_dwarf_line(struct readelf *re);
304 static void dump_dwarf_line_decoded(struct readelf *re);
305 static void dump_dwarf_loc(struct readelf *re, Dwarf_Loc *lr);
306 static void dump_dwarf_loclist(struct readelf *re);
307 static void dump_dwarf_pubnames(struct readelf *re);
308 static void dump_dwarf_ranges(struct readelf *re);
309 static void dump_dwarf_ranges_foreach(struct readelf *re, Dwarf_Die die,
311 static void dump_dwarf_str(struct readelf *re);
312 static void dump_eflags(struct readelf *re, uint64_t e_flags);
313 static void dump_elf(struct readelf *re);
315 static void dump_dyn_val(struct readelf *re, GElf_Dyn *dyn, uint32_t stab);
316 static void dump_dynamic(struct readelf *re);
317 static void dump_liblist(struct readelf *re);
318 static void dump_mips_abiflags(struct readelf *re, struct section *s);
319 static void dump_mips_attributes(struct readelf *re, uint8_t *p, uint8_t *pe);
320 static void dump_mips_odk_reginfo(struct readelf *re, uint8_t *p, size_t sz);
321 static void dump_mips_options(struct readelf *re, struct section *s);
324 static void dump_mips_reginfo(struct readelf *re, struct section *s);
325 static void dump_mips_specific_info(struct readelf *re);
326 static void dump_notes(struct readelf *re);
327 static void dump_notes_content(struct readelf *re, const char *buf, size_t sz,
329 static void dump_notes_data(struct readelf *re, const char *name,
332 static void dump_svr4_hash64(struct readelf *re, struct section *s);
333 static void dump_gnu_hash(struct readelf *re, struct section *s);
334 static void dump_gnu_property_type_0(struct readelf *re, const char *buf,
336 static void dump_hash(struct readelf *re);
337 static void dump_phdr(struct readelf *re);
339 static void dump_section_groups(struct readelf *re);
340 static void dump_symtab(struct readelf *re, int i);
341 static void dump_symtabs(struct readelf *re);
343 static void dump_ver(struct readelf *re);
344 static void dump_verdef(struct readelf *re, int dump);
345 static void dump_verneed(struct readelf *re, int dump);
346 static void dump_versym(struct readelf *re);
348 static const char *dwarf_regname(struct readelf *re, unsigned int num);
349 static struct dumpop *find_dumpop(struct readelf *re, size_t si,
353 static char *get_regoff_str(struct readelf *re, Dwarf_Half reg,
355 static const char *get_string(struct readelf *re, int strtab, size_t off);
356 static const char *get_symbol_name(struct readelf *re, int symtab, int i);
357 static uint64_t get_symbol_value(struct readelf *re, int symtab, int i);
358 static void load_sections(struct readelf *re);
377 static void search_loclist_at(struct readelf *re, Dwarf_Die die,
380 static void search_ver(struct readelf *re);
382 static void set_cu_context(struct readelf *re, Dwarf_Half psize,
390 static void unload_sections(struct readelf *re);
2225 dump_ehdr(struct readelf *re)
2235 printf("%.2x ", re->ehdr.e_ident[i]);
2239 printf("%-37s%s\n", " Class:", elf_class(re->ehdr.e_ident[EI_CLASS]));
2242 printf("%-37s%s\n", " Data:", elf_endian(re->ehdr.e_ident[EI_DATA]));
2245 printf("%-37s%d %s\n", " Version:", re->ehdr.e_ident[EI_VERSION],
2246 elf_ver(re->ehdr.e_ident[EI_VERSION]));
2249 printf("%-37s%s\n", " OS/ABI:", elf_osabi(re->ehdr.e_ident[EI_OSABI]));
2252 printf("%-37s%d\n", " ABI Version:", re->ehdr.e_ident[EI_ABIVERSION]);
2255 printf("%-37s%s\n", " Type:", elf_type(re->ehdr.e_type));
2258 printf("%-37s%s\n", " Machine:", elf_machine(re->ehdr.e_machine));
2261 printf("%-37s%#x\n", " Version:", re->ehdr.e_version);
2265 (uintmax_t)re->ehdr.e_entry);
2269 (uintmax_t)re->ehdr.e_phoff);
2273 (uintmax_t)re->ehdr.e_shoff);
2276 printf("%-37s%#x", " Flags:", re->ehdr.e_flags);
2277 dump_eflags(re, re->ehdr.e_flags);
2282 re->ehdr.e_ehsize);
2286 re->ehdr.e_phentsize);
2289 printf("%-37s%u", " Number of program headers:", re->ehdr.e_phnum);
2290 if (re->ehdr.e_phnum == PN_XNUM) {
2292 if (elf_getphnum(re->elf, &phnum))
2299 re->ehdr.e_shentsize);
2302 printf("%-37s%u", " Number of section headers:", re->ehdr.e_shnum);
2303 if (re->ehdr.e_shnum == SHN_UNDEF) {
2305 if (elf_getshnum(re->elf, &shnum))
2312 re->ehdr.e_shstrndx);
2313 if (re->ehdr.e_shstrndx == SHN_XINDEX) {
2315 if (elf_getshstrndx(re->elf, &shstrndx))
2322 dump_eflags(struct readelf *re, uint64_t e_flags)
2328 switch (re->ehdr.e_machine) {
2430 dump_phdr(struct readelf *re)
2439 #define PH_CT phdr_type(re->ehdr.e_machine, phdr.p_type), \
2448 if (elf_getphnum(re->elf, &phnum) == 0) {
2457 printf("\nElf file type is %s", elf_type(re->ehdr.e_type));
2458 printf("\nEntry point 0x%jx\n", (uintmax_t)re->ehdr.e_entry);
2460 (uintmax_t)phnum, (uintmax_t)re->ehdr.e_phoff);
2464 if (re->ec == ELFCLASS32)
2466 else if (re->options & RE_WW)
2472 if (gelf_getphdr(re->elf, i, &phdr) != &phdr) {
2477 if (re->ec == ELFCLASS32)
2480 else if (re->options & RE_WW)
2488 if ((rawfile = elf_rawfile(re->elf, &size)) == NULL) {
2502 if (re->shnum == 0)
2507 if (gelf_getphdr(re->elf, i, &phdr) != &phdr) {
2513 for (j = 1; (size_t)j < re->shnum; j++) {
2514 if (re->sl[j].off < phdr.p_offset)
2516 if (re->sl[j].off + re->sl[j].sz >
2518 re->sl[j].type != SHT_NOBITS)
2520 if (re->sl[j].addr < phdr.p_vaddr ||
2521 re->sl[j].addr + re->sl[j].sz >
2525 (re->sl[j].flags & SHF_TLS) == 0)
2527 printf("%s ", re->sl[j].name);
2536 section_flags(struct readelf *re, struct section *s)
2543 nb = re->ec == ELFCLASS32 ? 8 : 16;
2544 if (re->options & RE_T) {
2552 if (re->options & RE_T) {
2559 if (re->options & RE_T && p > nb + 4)
2567 dump_shdr(struct readelf *re)
2580 #define S_CT i, s->name, section_type(re->ehdr.e_machine, s->type), \
2582 (uintmax_t)s->entsize, section_flags(re, s), \
2584 #define ST_CT i, s->name, section_type(re->ehdr.e_machine, s->type), \
2587 (uintmax_t)s->align, section_flags(re, s)
2588 #define ST_CTL i, s->name, section_type(re->ehdr.e_machine, s->type), \
2591 (uintmax_t)s->align, section_flags(re, s)
2593 if (re->shnum == 0) {
2598 (uintmax_t)re->shnum, (uintmax_t)re->ehdr.e_shoff);
2600 if (re->ec == ELFCLASS32) {
2601 if (re->options & RE_T)
2607 } else if (re->options & RE_WW) {
2608 if (re->options & RE_T)
2615 if (re->options & RE_T)
2622 for (i = 0; (size_t)i < re->shnum; i++) {
2623 s = &re->sl[i];
2624 if (re->ec == ELFCLASS32) {
2625 if (re->options & RE_T)
2633 } else if (re->options & RE_WW) {
2634 if (re->options & RE_T)
2643 if (re->options & RE_T)
2653 if ((re->options & RE_T) == 0)
2688 dump_dynamic(struct readelf *re)
2697 for (i = 0; (size_t)i < re->shnum; i++) {
2698 s = &re->sl[i];
2731 if (re->ec == ELFCLASS32)
2740 if (re->ec == ELFCLASS32)
2744 printf(" %-20s", dt_type(re->ehdr.e_machine,
2747 dump_dyn_val(re, &dyn, s->link);
2770 dyn_str(struct readelf *re, uint32_t stab, uint64_t d_val)
2776 else if ((name = elf_strptr(re->elf, stab, d_val)) == NULL) {
2785 dump_arch_dyn_val(struct readelf *re, GElf_Dyn *dyn)
2787 switch (re->ehdr.e_machine) {
2910 dump_dyn_val(struct readelf *re, GElf_Dyn *dyn, uint32_t stab)
2916 dump_arch_dyn_val(re, dyn);
2925 name = dyn_str(re, stab, dyn->d_un.d_val);
2988 printf(" %s\n", dt_type(re->ehdr.e_machine, dyn->d_un.d_val));
3005 dump_rel(struct readelf *re, struct section *s, Elf_Data *d)
3014 if (s->link >= re->shnum)
3019 elftc_reloc_type_str(re->ehdr.e_machine, \
3022 elftc_reloc_type_str(re->ehdr.e_machine, type), \
3026 if (re->ec == ELFCLASS32)
3029 if (re->options & RE_WW)
3042 symname = get_symbol_name(re, s->link, GELF_R_SYM(r.r_info));
3043 symval = get_symbol_value(re, s->link, GELF_R_SYM(r.r_info));
3044 if (re->ec == ELFCLASS32) {
3050 if (re->ehdr.e_machine == EM_MIPS) {
3057 if (re->options & RE_WW)
3063 if (re->ehdr.e_machine == EM_MIPS) {
3064 if (re->options & RE_WW) {
3088 dump_rela(struct readelf *re, struct section *s, Elf_Data *d)
3097 if (s->link >= re->shnum)
3103 elftc_reloc_type_str(re->ehdr.e_machine, \
3106 elftc_reloc_type_str(re->ehdr.e_machine, type), \
3110 if (re->ec == ELFCLASS32)
3113 if (re->options & RE_WW)
3126 symname = get_symbol_name(re, s->link, GELF_R_SYM(r.r_info));
3127 symval = get_symbol_value(re, s->link, GELF_R_SYM(r.r_info));
3128 if (re->ec == ELFCLASS32) {
3135 if (re->ehdr.e_machine == EM_MIPS) {
3142 if (re->options & RE_WW)
3149 if (re->ehdr.e_machine == EM_MIPS) {
3150 if (re->options & RE_WW) {
3174 dump_reloc(struct readelf *re)
3180 for (i = 0; (size_t)i < re->shnum; i++) {
3181 s = &re->sl[i];
3192 dump_rel(re, s, d);
3194 dump_rela(re, s, d);
3200 dump_symtab(struct readelf *re, int i)
3210 s = &re->sl[i];
3211 if (s->link >= re->shnum)
3238 printf(" %-7s", st_type(re->ehdr.e_machine,
3239 re->ehdr.e_ident[EI_OSABI], GELF_ST_TYPE(sym.st_info)));
3243 if ((name = elf_strptr(re->elf, stab, sym.st_name)) != NULL)
3246 if (s->type == SHT_DYNSYM && re->ver != NULL &&
3247 re->vs != NULL && re->vs[j] > 1) {
3248 vs = re->vs[j] & VERSYM_VERSION;
3249 if (vs >= re->ver_sz || re->ver[vs].name == NULL) {
3253 if (re->vs[j] & VERSYM_HIDDEN || re->ver[vs].type == 0)
3254 printf("@%s (%d)", re->ver[vs].name, vs);
3256 printf("@@%s (%d)", re->ver[vs].name, vs);
3264 dump_symtabs(struct readelf *re)
3277 if (re->options & RE_DD) {
3279 for (i = 0; (size_t)i < re->shnum; i++)
3280 if (re->sl[i].type == SHT_DYNAMIC) {
3281 s = &re->sl[i];
3311 for (i = 0; (size_t)i < re->shnum; i++) {
3312 s = &re->sl[i];
3314 if (re->options & RE_DD) {
3316 dump_symtab(re, i);
3320 dump_symtab(re, i);
3386 dump_svr4_hash64(struct readelf *re, struct section *s)
3410 if (gelf_xlatetom(re->elf, &dst, d,
3411 re->ehdr.e_ident[EI_DATA]) != &dst) {
3458 dump_gnu_hash(struct readelf *re, struct section *s)
3485 if (s->link >= re->shnum)
3487 ds = &re->sl[s->link];
3496 (re->ec == ELFCLASS32 ? sizeof(uint32_t) : sizeof(uint64_t)) +
3501 bucket = buf + (re->ec == ELFCLASS32 ? maskwords : maskwords * 2);
3539 dump_gnu_property_type_0(struct readelf *re, const char *buf, size_t sz)
3559 if (re->ehdr.e_machine != EM_X86_64) {
3561 re->ehdr.e_machine);
3589 dump_hash(struct readelf *re)
3594 for (i = 0; (size_t) i < re->shnum; i++) {
3595 s = &re->sl[i];
3598 dump_gnu_hash(re, s);
3599 else if (re->ehdr.e_machine == EM_ALPHA &&
3601 dump_svr4_hash64(re, s);
3609 dump_notes(struct readelf *re)
3618 if (re->ehdr.e_type == ET_CORE) {
3623 if (elf_getphnum(re->elf, &phnum) == 0) {
3629 if ((rawfile = elf_rawfile(re->elf, &filesize)) == NULL) {
3634 if (gelf_getphdr(re->elf, i, &phdr) != &phdr) {
3645 dump_notes_content(re, rawfile + phdr.p_offset,
3655 for (i = 0; (size_t) i < re->shnum; i++) {
3656 s = &re->sl[i];
3666 dump_notes_content(re, d->d_buf, d->d_size,
3720 dump_notes_data(struct readelf *re, const char *name, uint32_t type,
3757 dump_gnu_property_type_0(re, buf, sz);
3784 dump_notes_content(struct readelf *re, const char *buf, size_t sz, off_t off)
3825 printf(" %s\n", note_type(name, re->ehdr.e_type,
3827 dump_notes_data(re, name, note->n_type, buf, note->n_descsz);
3843 while (x >= re->ver_sz) { \
3844 nv = realloc(re->ver, \
3845 sizeof(*re->ver) * re->ver_sz * 2); \
3848 free(re->ver); \
3851 re->ver = nv; \
3852 for (i = re->ver_sz; i < re->ver_sz * 2; i++) { \
3853 re->ver[i].name = NULL; \
3854 re->ver[i].type = 0; \
3856 re->ver_sz *= 2; \
3859 re->ver[x].name = n; \
3860 re->ver[x].type = t; \
3866 dump_verdef(struct readelf *re, int dump)
3877 if ((s = re->vd_s) == NULL)
3879 if (s->link >= re->shnum)
3882 if (re->ver == NULL) {
3883 re->ver_sz = 16;
3884 if ((re->ver = calloc(re->ver_sz, sizeof(*re->ver))) ==
3889 re->ver[0].name = "*local*";
3890 re->ver[1].name = "*global*";
3920 name = get_string(re, s->link, vda->vda_name);
3941 dump_verneed(struct readelf *re, int dump)
3952 if ((s = re->vn_s) == NULL)
3954 if (s->link >= re->shnum)
3957 if (re->ver == NULL) {
3958 re->ver_sz = 16;
3959 if ((re->ver = calloc(re->ver_sz, sizeof(*re->ver))) ==
3964 re->ver[0].name = "*local*";
3965 re->ver[1].name = "*global*";
3989 get_string(re, s->link, vn->vn_file),
3999 name = get_string(re, s->link, vna->vna_name);
4017 dump_versym(struct readelf *re)
4022 if (re->vs_s == NULL || re->ver == NULL || re->vs == NULL)
4024 printf("\nVersion symbol section (%s):\n", re->vs_s->name);
4025 for (i = 0; i < re->vs_sz; i++) {
4031 vs = re->vs[i] & VERSYM_VERSION;
4032 if (vs >= re->ver_sz || re->ver[vs].name == NULL) {
4033 warnx("invalid versym version index %u", re->vs[i]);
4036 if (re->vs[i] & VERSYM_HIDDEN)
4038 re->ver[re->vs[i] & VERSYM_VERSION].name);
4040 printf(" %3x %-12s ", vs, re->ver[re->vs[i]].name);
4046 dump_ver(struct readelf *re)
4049 if (re->vs_s && re->ver && re->vs)
4050 dump_versym(re);
4051 if (re->vd_s)
4052 dump_verdef(re, 1);
4053 if (re->vn_s)
4054 dump_verneed(re, 1);
4058 search_ver(struct readelf *re)
4064 for (i = 0; (size_t) i < re->shnum; i++) {
4065 s = &re->sl[i];
4067 re->vs_s = s;
4069 re->vn_s = s;
4071 re->vd_s = s;
4073 if (re->vd_s)
4074 dump_verdef(re, 0);
4075 if (re->vn_s)
4076 dump_verneed(re, 0);
4077 if (re->vs_s && re->ver != NULL) {
4079 if ((d = elf_getdata(re->vs_s->scn, NULL)) == NULL) {
4088 re->vs = d->d_buf;
4089 re->vs_sz = d->d_size / sizeof(Elf32_Half);
4105 dump_liblist(struct readelf *re)
4115 for (i = 0; (size_t) i < re->shnum; i++) {
4116 s = &re->sl[i];
4119 if (s->link >= re->shnum)
4141 get_string(re, s->link, lib->l_name));
4174 dump_section_groups(struct readelf *re)
4183 for (i = 0; (size_t) i < re->shnum; i++) {
4184 s = &re->sl[i];
4187 if (s->link >= re->shnum)
4212 symname = get_symbol_name(re, s->link, s->info);
4221 if (*w >= re->shnum) {
4225 printf(" [%5u] %s\n", *w, re->sl[*w].name);
4268 dump_arm_attributes(struct readelf *re, uint8_t *p, uint8_t *pe)
4274 (void) re;
4341 dump_mips_attributes(struct readelf *re, uint8_t *p, uint8_t *pe)
4345 (void) re;
4400 dump_attributes(struct readelf *re)
4409 for (i = 0; (size_t) i < re->shnum; i++) {
4410 s = &re->sl[i];
4412 (re->ehdr.e_machine != EM_ARM || s->type != SHT_LOPROC + 3))
4438 seclen = re->dw_decode(&p, 4);
4455 sublen = re->dw_decode(&p, 4);
4473 if (re->ehdr.e_machine == EM_ARM &&
4475 dump_arm_attributes(re, p, sp + sublen);
4476 else if (re->ehdr.e_machine == EM_MIPS ||
4477 re->ehdr.e_machine == EM_MIPS_RS3_LE)
4478 dump_mips_attributes(re, p,
4480 else if (re->ehdr.e_machine == EM_PPC)
4489 dump_mips_specific_info(struct readelf *re)
4495 for (i = 0; (size_t) i < re->shnum; i++) {
4496 s = &re->sl[i];
4499 dump_mips_options(re, s);
4505 dump_mips_abiflags(re, s);
4511 for (i = 0; (size_t) i < re->shnum; i++) {
4512 s = &re->sl[i];
4515 dump_mips_reginfo(re, s);
4520 dump_mips_abiflags(struct readelf *re, struct section *s)
4542 version = re->dw_decode(&p, 2);
4550 isa_level = re->dw_decode(&p, 1);
4551 isa_rev = re->dw_decode(&p, 1);
4552 gpr_size = re->dw_decode(&p, 1);
4553 cpr1_size = re->dw_decode(&p, 1);
4554 cpr2_size = re->dw_decode(&p, 1);
4555 fp_abi = re->dw_decode(&p, 1);
4556 isa_ext = re->dw_decode(&p, 4);
4557 ases = re->dw_decode(&p, 4);
4558 flags1 = re->dw_decode(&p, 4);
4559 flags2 = re->dw_decode(&p, 4);
4596 dump_mips_reginfo(struct readelf *re, struct section *s)
4615 dump_mips_odk_reginfo(re, d->d_buf, d->d_size);
4619 dump_mips_options(struct readelf *re, struct section *s)
4647 kind = re->dw_decode(&p, 1);
4648 size = re->dw_decode(&p, 1);
4649 sndx = re->dw_decode(&p, 2);
4650 info = re->dw_decode(&p, 4);
4658 dump_mips_odk_reginfo(re, p, size);
4729 dump_mips_odk_reginfo(struct readelf *re, uint8_t *p, size_t sz)
4739 ri_gprmask = re->dw_decode(&p, 4);
4741 if (re->ec == ELFCLASS64)
4742 re->dw_decode(&p, 4);
4744 ri_cprmask[i] = re->dw_decode(&p, 4);
4745 if (re->ec == ELFCLASS32)
4746 ri_gp_value = re->dw_decode(&p, 4);
4748 ri_gp_value = re->dw_decode(&p, 8);
4760 dump_arch_specific_info(struct readelf *re)
4763 dump_liblist(re);
4764 dump_attributes(re);
4766 switch (re->ehdr.e_machine) {
4769 dump_mips_specific_info(re);
4776 dwarf_regname(struct readelf *re, unsigned int num)
4781 if ((rn = dwarf_reg(re->ehdr.e_machine, num)) != NULL)
4790 dump_dwarf_line(struct readelf *re)
4809 for (i = 0; (size_t) i < re->shnum; i++) {
4810 s = &re->sl[i];
4814 if ((size_t) i >= re->shnum)
4827 while ((ret = dwarf_next_cu_header(re->dbg, NULL, NULL, NULL, NULL,
4830 while (dwarf_siblingof(re->dbg, die, &die, &de) == DW_DLV_OK) {
4848 length = re->dw_read(d, &offset, 4);
4851 length = re->dw_read(d, &offset, 8);
4862 version = re->dw_read(d, &offset, 2);
4863 hdrlen = re->dw_read(d, &offset, dwarf_size);
4864 minlen = re->dw_read(d, &offset, 1);
4865 defstmt = re->dw_read(d, &offset, 1);
4866 lbase = re->dw_read(d, &offset, 1);
4867 lrange = re->dw_read(d, &offset, 1);
4868 opbase = re->dw_read(d, &offset, 1);
4879 (void) dwarf_get_address_size(re->dbg, &pointer_size, &de);
4885 oplen = re->dw_read(d, &offset, 1);
4949 address = re->dw_decode(&p,
5016 udelta = re->dw_decode(&p, 2);
5067 dump_dwarf_line_decoded(struct readelf *re)
5080 while ((ret = dwarf_next_cu_header(re->dbg, NULL, NULL, NULL, NULL,
5082 if (dwarf_siblingof(re->dbg, NULL, &die, &de) != DW_DLV_OK)
5119 dump_dwarf_die(struct readelf *re, Dwarf_Die die, int level)
5302 dump_dwarf_block(re, v_block->bl_data, v_block->bl_len);
5318 dump_dwarf_block(re, v_expr, v_udata);
5330 v_sig = re->dw_decode(&p, 8);
5384 dump_dwarf_die(re, ret_die, level + 1);
5388 ret = dwarf_siblingof_b(re->dbg, die, &ret_die, is_info, &de);
5392 dump_dwarf_die(re, ret_die, level);
5394 dwarf_dealloc(re->dbg, die, DW_DLA_DIE);
5398 set_cu_context(struct readelf *re, Dwarf_Half psize, Dwarf_Half osize,
5402 re->cu_psize = psize;
5403 re->cu_osize = osize;
5404 re->cu_ver = ver;
5408 dump_dwarf_info(struct readelf *re, Dwarf_Bool is_info)
5426 for (i = 0; (size_t) i < re->shnum; i++) {
5427 s = &re->sl[i];
5431 if ((size_t) i >= re->shnum)
5437 while ((ret = dwarf_next_cu_header_c(re->dbg, is_info, NULL,
5440 set_cu_context(re, pointer_size, off_size, version);
5442 while (dwarf_siblingof_b(re->dbg, die, &die, is_info,
5475 sig = re->dw_decode(&p, 8);
5493 dump_dwarf_die(re, die, 0);
5499 } while (dwarf_next_types_section(re->dbg, &de) == DW_DLV_OK);
5503 dump_dwarf_abbrev(struct readelf *re)
5517 while ((ret = dwarf_next_cu_header(re->dbg, NULL, NULL, &aboff,
5521 while ((ret = dwarf_get_abbrev(re->dbg, aboff, &ab, &length,
5524 dwarf_dealloc(re->dbg, ab, DW_DLA_ABBREV);
5570 dwarf_dealloc(re->dbg, ab, DW_DLA_ABBREV);
5580 dump_dwarf_pubnames(struct readelf *re)
5596 for (i = 0; (size_t) i < re->shnum; i++) {
5597 s = &re->sl[i];
5601 if ((size_t) i >= re->shnum)
5616 length = re->dw_read(d, &offset, 4);
5619 length = re->dw_read(d, &offset, 8);
5628 nt_version = re->dw_read(d, &offset, 2);
5629 nt_cu_offset = re->dw_read(d, &offset, dwarf_size);
5630 nt_cu_length = re->dw_read(d, &offset, dwarf_size);
5638 if (dwarf_get_globals(re->dbg, &globs, &cnt, &de) != DW_DLV_OK) {
5660 dump_dwarf_aranges(struct readelf *re)
5676 for (i = 0; (size_t) i < re->shnum; i++) {
5677 s = &re->sl[i];
5681 if ((size_t) i >= re->shnum)
5696 length = re->dw_read(d, &offset, 4);
5699 length = re->dw_read(d, &offset, 8);
5708 as_version = re->dw_read(d, &offset, 2);
5709 as_cu_offset = re->dw_read(d, &offset, dwarf_size);
5710 as_addrsz = re->dw_read(d, &offset, 1);
5711 as_segsz = re->dw_read(d, &offset, 1);
5719 if (dwarf_get_aranges(re->dbg, &aranges, &cnt, &de) != DW_DLV_OK) {
5738 dump_dwarf_ranges_foreach(struct readelf *re, Dwarf_Die die, Dwarf_Addr base)
5768 if (dwarf_get_ranges(re->dbg, (Dwarf_Off) off, &ranges, &cnt,
5782 if (re->ec == ELFCLASS32)
5799 dump_dwarf_ranges_foreach(re, ret_die, base);
5802 ret = dwarf_siblingof(re->dbg, die, &ret_die, &de);
5806 dump_dwarf_ranges_foreach(re, ret_die, base);
5810 dump_dwarf_ranges(struct readelf *re)
5821 if (dwarf_get_ranges(re->dbg, 0, &ranges, &cnt, &bytecnt, &de) !=
5826 if (re->ec == ELFCLASS32)
5831 while ((ret = dwarf_next_cu_header(re->dbg, NULL, NULL, NULL, NULL,
5834 if (dwarf_siblingof(re->dbg, die, &die, &de) != DW_DLV_OK)
5848 dump_dwarf_ranges_foreach(re, die, (Dwarf_Addr) lowpc);
5854 dump_dwarf_macinfo(struct readelf *re)
5869 while (dwarf_get_macro_details(re->dbg, offset, _MAX_MACINFO_ENTRY,
5905 dump_dwarf_frame_inst(struct readelf *re, Dwarf_Cie cie, uint8_t *insts,
5947 dwarf_regname(re, oplist[i].fp_register),
5952 dwarf_regname(re, oplist[i].fp_register));
5967 dwarf_regname(re, oplist[i].fp_register),
5972 dwarf_regname(re, oplist[i].fp_register),
5977 dwarf_regname(re, oplist[i].fp_register));
5995 get_regoff_str(struct readelf *re, Dwarf_Half reg, Dwarf_Addr off)
6004 snprintf(rs, sizeof(rs), "%s%+jd", dwarf_regname(re, reg),
6011 dump_dwarf_frame_regtable(struct readelf *re, Dwarf_Fde fde, Dwarf_Addr pc,
6056 dwarf_regname(re, (unsigned int) i));
6076 printf("%-8s ", get_regoff_str(re, RT(0).dw_regnum,
6080 printf("%-5s", get_regoff_str(re,
6098 dump_dwarf_frame_section(struct readelf *re, struct section *s, int alt)
6118 if (dwarf_get_fde_list(re->dbg, &cie_list, &cie_count,
6126 if (dwarf_get_fde_list_eh(re->dbg, &cie_list, &cie_count,
6185 dump_dwarf_frame_inst(re, cie, cie_inst,
6187 re->dbg);
6198 dump_dwarf_frame_regtable(re, fde, low_pc, 1,
6210 dump_dwarf_frame_inst(re, cie, fde_inst, fde_instlen,
6211 cie_caf, cie_daf, low_pc, re->dbg);
6213 dump_dwarf_frame_regtable(re, fde, low_pc, func_len,
6220 dump_dwarf_frame(struct readelf *re, int alt)
6225 (void) dwarf_set_frame_cfa_value(re->dbg, DW_FRAME_CFA_COL);
6227 for (i = 0; (size_t) i < re->shnum; i++) {
6228 s = &re->sl[i];
6231 dump_dwarf_frame_section(re, s, alt);
6236 dump_dwarf_str(struct readelf *re)
6246 for (i = 0; (size_t) i < re->shnum; i++) {
6247 s = &re->sl[i];
6251 if ((size_t) i >= re->shnum)
6309 search_loclist_at(struct readelf *re, Dwarf_Die die, Dwarf_Unsigned lowpc,
6379 la->la_cu_psize = re->cu_psize;
6380 la->la_cu_osize = re->cu_osize;
6381 la->la_cu_ver = re->cu_ver;
6391 search_loclist_at(re, ret_die, lowpc, la_list,
6395 ret = dwarf_siblingof_b(re->dbg, die, &ret_die, is_info, &de);
6399 search_loclist_at(re, ret_die, lowpc, la_list,
6404 dump_dwarf_loc(struct readelf *re, Dwarf_Loc *lr)
6453 printf(" (%s)", dwarf_regname(re, lr->lr_atom - DW_OP_reg0));
6583 dwarf_regname(re, lr->lr_atom - DW_OP_breg0),
6595 dwarf_regname(re, (unsigned int) lr->lr_number),
6619 dump_dwarf_block(re, (uint8_t *)(uintptr_t) lr->lr_number2,
6634 dwarf_regname(re, (unsigned int) lr->lr_number),
6651 dump_dwarf_block(struct readelf *re, uint8_t *b, Dwarf_Unsigned len)
6658 if (dwarf_loclist_from_expr_b(re->dbg, b, len, re->cu_psize,
6659 re->cu_osize, re->cu_ver, &llbuf, &lcnt, &de) != DW_DLV_OK) {
6665 dump_dwarf_loc(re, &llbuf->ld_s[i]);
6670 dwarf_dealloc(re->dbg, llbuf->ld_s, DW_DLA_LOC_BLOCK);
6671 dwarf_dealloc(re->dbg, llbuf, DW_DLA_LOCDESC);
6675 dump_dwarf_loclist(struct readelf *re)
6693 while ((ret = dwarf_next_cu_header_b(re->dbg, NULL, &version, NULL,
6695 set_cu_context(re, pointer_size, off_size, version);
6697 if (dwarf_siblingof(re->dbg, die, &die, &de) != DW_DLV_OK)
6712 search_loclist_at(re, die, lowpc, &la_list,
6720 while ((ret = dwarf_next_cu_header_c(re->dbg, 0, NULL,
6723 set_cu_context(re, pointer_size, off_size, version);
6725 if (dwarf_siblingof(re->dbg, die, &die, &de) !=
6745 search_loclist_at(re, die, lowpc, &la_list,
6750 } while (dwarf_next_types_section(re->dbg, &de) == DW_DLV_OK);
6788 set_cu_context(re, la->la_cu_psize, la->la_cu_osize,
6805 dump_dwarf_loc(re, &llbuf[i]->ld_s[j]);
6816 dwarf_dealloc(re->dbg, llbuf[i]->ld_s,
6818 dwarf_dealloc(re->dbg, llbuf[i], DW_DLA_LOCDESC);
6820 dwarf_dealloc(re->dbg, llbuf, DW_DLA_LIST);
6833 get_string(struct readelf *re, int strtab, size_t off)
6837 if ((name = elf_strptr(re->elf, strtab, off)) == NULL)
6848 get_symbol_name(struct readelf *re, int symtab, int i)
6856 s = &re->sl[symtab];
6870 if (sym.st_shndx < re->shnum &&
6871 re->sl[sym.st_shndx].name != NULL)
6872 return (re->sl[sym.st_shndx].name);
6875 if (s->link >= re->shnum ||
6876 (name = elf_strptr(re->elf, s->link, sym.st_name)) == NULL)
6883 get_symbol_value(struct readelf *re, int symtab, int i)
6890 s = &re->sl[symtab];
6985 hex_dump(struct readelf *re)
6994 for (i = 1; (size_t) i < re->shnum; i++) {
6996 s = &re->sl[i];
6997 if (find_dumpop(re, (size_t) i, s->name, HEX_DUMP, -1) == NULL)
7017 if (re->options & RE_Z) {
7050 str_dump(struct readelf *re)
7059 for (i = 1; (size_t) i < re->shnum; i++) {
7061 s = &re->sl[i];
7062 if (find_dumpop(re, (size_t) i, s->name, STR_DUMP, -1) == NULL)
7082 if (re->options & RE_Z) {
7116 load_sections(struct readelf *re)
7126 if (!elf_getshnum(re->elf, &re->shnum)) {
7130 if (re->sl != NULL)
7131 free(re->sl);
7132 if ((re->sl = calloc(re->shnum, sizeof(*re->sl))) == NULL)
7136 if (!elf_getshstrndx(re->elf, &shstrndx)) {
7141 if ((scn = elf_getscn(re->elf, 0)) == NULL)
7151 if ((name = elf_strptr(re->elf, shstrndx, sh.sh_name)) == NULL) {
7162 if (ndx >= re->shnum) {
7166 if (sh.sh_link >= re->shnum)
7169 s = &re->sl[ndx];
7181 } while ((scn = elf_nextscn(re->elf, scn)) != NULL);
7188 unload_sections(struct readelf *re)
7191 if (re->sl != NULL) {
7192 free(re->sl);
7193 re->sl = NULL;
7195 re->shnum = 0;
7196 re->vd_s = NULL;
7197 re->vn_s = NULL;
7198 re->vs_s = NULL;
7199 re->vs = NULL;
7200 re->vs_sz = 0;
7201 if (re->ver != NULL) {
7202 free(re->ver);
7203 re->ver = NULL;
7204 re->ver_sz = 0;
7209 dump_elf(struct readelf *re)
7213 if (gelf_getehdr(re->elf, &re->ehdr) == NULL) {
7217 if ((re->ec = gelf_getclass(re->elf)) == ELFCLASSNONE) {
7221 if (re->ehdr.e_ident[EI_DATA] == ELFDATA2MSB) {
7222 re->dw_read = _read_msb;
7223 re->dw_decode = _decode_msb;
7225 re->dw_read = _read_lsb;
7226 re->dw_decode = _decode_lsb;
7229 if (re->options & ~RE_H)
7230 load_sections(re);
7231 if ((re->options & RE_VV) || (re->options & RE_S))
7232 search_ver(re);
7233 if (re->options & RE_H)
7234 dump_ehdr(re);
7235 if (re->options & RE_L)
7236 dump_phdr(re);
7237 if (re->options & RE_SS)
7238 dump_shdr(re);
7239 if (re->options & RE_G)
7240 dump_section_groups(re);
7241 if (re->options & RE_D)
7242 dump_dynamic(re);
7243 if (re->options & RE_R)
7244 dump_reloc(re);
7245 if (re->options & RE_S)
7246 dump_symtabs(re);
7247 if (re->options & RE_N)
7248 dump_notes(re);
7249 if (re->options & RE_II)
7250 dump_hash(re);
7251 if (re->options & RE_X)
7252 hex_dump(re);
7253 if (re->options & RE_P)
7254 str_dump(re);
7255 if (re->options & RE_VV)
7256 dump_ver(re);
7257 if (re->options & RE_AA)
7258 dump_arch_specific_info(re);
7259 if (re->options & RE_W)
7260 dump_dwarf(re);
7261 if (re->options & ~RE_H)
7262 unload_sections(re);
7266 dump_dwarf(struct readelf *re)
7271 if (dwarf_elf_init(re->elf, DW_DLC_READ, NULL, NULL, &re->dbg, &de)) {
7278 if (re->dop & DW_A)
7279 dump_dwarf_abbrev(re);
7280 if (re->dop & DW_L)
7281 dump_dwarf_line(re);
7282 if (re->dop & DW_LL)
7283 dump_dwarf_line_decoded(re);
7284 if (re->dop & DW_I) {
7285 dump_dwarf_info(re, 0);
7286 dump_dwarf_info(re, 1);
7288 if (re->dop & DW_P)
7289 dump_dwarf_pubnames(re);
7290 if (re->dop & DW_R)
7291 dump_dwarf_aranges(re);
7292 if (re->dop & DW_RR)
7293 dump_dwarf_ranges(re);
7294 if (re->dop & DW_M)
7295 dump_dwarf_macinfo(re);
7296 if (re->dop & DW_F)
7297 dump_dwarf_frame(re, 0);
7298 else if (re->dop & DW_FF)
7299 dump_dwarf_frame(re, 1);
7300 if (re->dop & DW_S)
7301 dump_dwarf_str(re);
7302 if (re->dop & DW_O)
7303 dump_dwarf_loclist(re);
7305 dwarf_finish(re->dbg, &de);
7309 dump_ar(struct readelf *re, int fd)
7319 re->ar = re->elf;
7321 if (re->options & RE_C) {
7322 if ((arsym = elf_getarsym(re->ar, &sz)) == NULL) {
7326 printf("Index of archive %s: (%ju entries)\n", re->filename,
7334 if (elf_rand(re->ar, off) != off) {
7339 if ((e = elf_begin(fd, ELF_C_READ, re->ar)) ==
7352 re->filename, arhdr->ar_name);
7357 if (elf_rand(re->ar, SARMAG) != SARMAG) {
7365 if ((re->options & ~RE_C) == 0)
7369 while ((re->elf = elf_begin(fd, cmd, re->ar)) != NULL) {
7370 if ((arhdr = elf_getarhdr(re->elf)) == NULL) {
7378 printf("\nFile: %s(%s)\n", re->filename, arhdr->ar_name);
7379 dump_elf(re);
7382 cmd = elf_next(re->elf);
7383 elf_end(re->elf);
7385 re->elf = re->ar;
7389 dump_object(struct readelf *re, int fd)
7391 if ((re->flags & DISPLAY_FILENAME) != 0)
7392 printf("\nFile: %s\n", re->filename);
7394 if ((re->elf = elf_begin(fd, ELF_C_READ, NULL)) == NULL) {
7399 switch (elf_kind(re->elf)) {
7404 dump_elf(re);
7407 dump_ar(re, fd);
7414 elf_end(re->elf);
7418 add_dumpop(struct readelf *re, size_t si, const char *sn, int op, int t)
7422 if ((d = find_dumpop(re, si, sn, -1, t)) == NULL) {
7431 STAILQ_INSERT_TAIL(&re->v_dumpop, d, dumpop_list);
7437 find_dumpop(struct readelf *re, size_t si, const char *sn, int op, int t)
7441 STAILQ_FOREACH(d, &re->v_dumpop, dumpop_list) {
7475 parse_dwarf_op_short(struct readelf *re, const char *op)
7480 re->dop |= DW_DEFAULT_OPTIONS;
7487 re->dop |= dwarf_op[i].value;
7495 parse_dwarf_op_long(struct readelf *re, const char *op)
7501 re->dop |= DW_DEFAULT_OPTIONS;
7512 re->dop |= dwarf_op[i].value;
7758 struct readelf *re, re_storage;
7763 re = &re_storage;
7764 memset(re, 0, sizeof(*re));
7765 STAILQ_INIT(&re->v_dumpop);
7774 re->options |= RE_AA;
7777 re->options |= RE_AA | RE_D | RE_G | RE_H | RE_II |
7781 re->options |= RE_C;
7784 re->options |= RE_DD;
7787 re->options |= RE_D;
7790 re->options |= RE_H | RE_L | RE_SS;
7793 re->options |= RE_G;
7799 re->options |= RE_H;
7802 re->options |= RE_II;
7808 re->options |= RE_L;
7811 re->options |= RE_NN;
7814 re->options |= RE_N;
7817 re->options |= RE_P;
7820 add_dumpop(re, (size_t) si, NULL, STR_DUMP,
7823 add_dumpop(re, 0, optarg, STR_DUMP,
7827 re->options |= RE_R;
7830 re->options |= RE_SS;
7833 re->options |= RE_S;
7836 re->options |= RE_SS | RE_T;
7839 re->options |= RE_U;
7842 re->options |= RE_VV;
7848 re->options |= RE_WW;
7851 re->options |= RE_W;
7852 parse_dwarf_op_short(re, optarg);
7855 re->options |= RE_X;
7858 add_dumpop(re, (size_t) si, NULL, HEX_DUMP,
7861 add_dumpop(re, 0, optarg, HEX_DUMP,
7865 re->options |= RE_Z;
7868 re->options |= RE_W;
7869 parse_dwarf_op_long(re, optarg);
7876 if (argc == 0 || re->options == 0)
7880 re->flags |= DISPLAY_FILENAME;
7887 re->filename = argv[i];
7888 fd = open(re->filename, O_RDONLY);
7890 warn("open %s failed", re->filename);
7892 dump_object(re, fd);