1 /* Copyright (C) 2021 Free Software Foundation, Inc.
4 This file is part of GNU Binutils.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
29 #include "StringBuilder.h"
32 typedef uint32_t Elf32_Word;
33 typedef uint32_t Elf64_Word;
34 typedef uint32_t Elf32_Addr;
35 typedef uint64_t Elf64_Addr;
36 typedef uint64_t Elf64_Xword;
37 typedef int32_t Elf32_Sword;
38 typedef int64_t Elf64_Sxword;
39 typedef uint16_t Elf32_Half;
40 typedef uint16_t Elf64_Half;
45 Elf32_Word a_tag; /* how to interpret value */
53 struct S_Elf64_Ancillary
55 Elf64_Xword a_tag; /* how to interpret value */
63 /* Dynamic section entry. */
66 Elf32_Sword d_tag; /* Dynamic entry type */
70 Elf32_Word d_val; /* Integer value */
71 Elf32_Addr d_ptr; /* Address value */
77 Elf64_Sxword d_tag; /* Dynamic entry type */
81 Elf64_Xword d_val; /* Integer value */
82 Elf64_Addr d_ptr; /* Address value */
93 unsigned char st_info; /* bind, type: ELF_32_ST_... */
94 unsigned char st_other;
95 Elf32_Half st_shndx; /* SHN_... */
101 unsigned char st_info; /* bind, type: ELF_64_ST_... */
102 unsigned char st_other;
103 Elf64_Half st_shndx; /* SHN_... */
113 Elf32_Word r_info; /* sym, type: ELF32_R_... */
119 Elf32_Word r_info; /* sym, type: ELF32_R_... */
120 Elf32_Sword r_addend;
126 Elf64_Xword r_info; /* sym, type: ELF64_R_... */
132 Elf64_Xword r_info; /* sym, type: ELF64_R_... */
133 Elf64_Sxword r_addend;
136 int Elf::bfd_status = -1;
141 if (bfd_status == -1)
142 bfd_status = bfd_init ();
145 Elf::Elf (char *filename) : DbeMessages (), Data_window (filename)
149 ancillary_files = NULL;
151 gnu_debug_file = NULL;
154 if (bfd_status != BFD_INIT_MAGIC)
156 status = ELF_ERR_CANT_OPEN_FILE;
159 abfd = bfd_openr (filename, NULL);
162 status = ELF_ERR_CANT_OPEN_FILE;
165 if (!bfd_check_format (abfd, bfd_object))
169 status = ELF_ERR_CANT_OPEN_FILE;
172 ehdrp = elf_getehdr ();
177 status = ELF_ERR_BAD_ELF_FORMAT;
180 elf_class = ehdrp->e_ident[EI_CLASS];
181 elf_datatype = ehdrp->e_ident[EI_DATA];
185 status = ELF_ERR_CANT_OPEN_FILE;
188 status = ELF_ERR_NONE;
191 need_swap_endian = is_Intel ();
193 need_swap_endian = !is_Intel ();
211 for (unsigned int sec = 1; sec < elf_getehdr ()->e_shnum; sec++)
213 char *name = get_sec_name (sec);
216 if (streq (name, NTXT (".stab")))
218 else if (streq (name, NTXT (".stabstr")))
220 else if (streq (name, NTXT (".stab.index")))
222 else if (streq (name, NTXT (".stab.indexstr")))
224 else if (streq (name, NTXT (".stab.excl")))
226 else if (streq (name, NTXT (".stab.exclstr")))
228 else if (streq (name, NTXT (".gnu_debuglink")))
230 else if (streq (name, NTXT (".__analyzer_info")))
232 else if (streq (name, NTXT (".info")))
234 else if (streq (name, NTXT (".plt")))
236 else if (streq (name, NTXT (".SUNW_ldynsym")))
238 else if (streq (name, NTXT (".dynsym")))
240 else if (streq (name, NTXT (".symtab")))
242 else if (strncmp (name, NTXT (".debug"), 6) == 0)
256 for (int i = 0; i < (int) ehdrp->e_shnum; i++)
258 Elf_Data *p = data[i];
259 if (p && !mmap_on_file && (p->d_flags & SHF_SUNW_ABSENT) == 0)
267 ancillary_files->destroy ();
268 delete ancillary_files;
271 delete gnu_debug_file;
280 if (ehdrp == NULL && abfd)
281 ehdrp = elf_elfheader (abfd);
286 Elf::get_phdr (unsigned int ndx)
288 if (ehdrp == NULL || ndx >= ehdrp->e_phnum)
290 return &(elf_tdata (abfd)->phdr[ndx]);
294 Elf::get_shdr (unsigned int ndx)
296 if (ehdrp == NULL || ndx >= ehdrp->e_shnum)
298 return elf_elfsections (abfd)[ndx];
302 Elf::elf_getdyn (Elf_Internal_Phdr *phdr, unsigned int ndx, Elf64_Dyn *pdyn)
304 if (elf_getclass () == ELFCLASS32)
306 if (ndx * sizeof (Elf32_Dyn) >= phdr->p_filesz)
308 Elf32_Dyn *hdr = (Elf32_Dyn*) bind (phdr->p_offset + ndx * sizeof (Elf32_Dyn),
312 pdyn->d_tag = decode (hdr->d_tag);
313 pdyn->d_un.d_val = decode (hdr->d_un.d_val);
317 if (ndx * sizeof (Elf64_Dyn) >= phdr->p_filesz)
319 Elf64_Dyn *hdr = (Elf64_Dyn*) bind (phdr->p_offset + ndx * sizeof (Elf64_Dyn),
323 pdyn->d_tag = decode (hdr->d_tag);
324 pdyn->d_un.d_val = decode (hdr->d_un.d_val);
330 Elf::elf_version (unsigned ver)
332 // We compile locally, no need to check the version
337 Elf::elf_begin (char *fname, Elf_status *stp)
342 *stp = ELF_ERR_CANT_OPEN_FILE;
345 Elf *elf = new Elf (fname);
348 if (elf->status != ELF_ERR_NONE)
356 char *str = elf->dump ();
357 fprintf (stderr, NTXT ("%s\n\n"), str);
365 Elf::elf_get_sec_num (const char *name)
367 if (name == NULL || ehdrp == NULL)
369 for (unsigned int sec = 1; sec < ehdrp->e_shnum; sec++)
371 Elf_Internal_Shdr *shdr = get_shdr (sec);
374 char *sname = elf_strptr (ehdrp->e_shstrndx, shdr->sh_name);
375 if (sname != NULL && strcmp (name, sname) == 0)
382 Elf::get_sec_name (unsigned int sec)
384 Elf_Internal_Shdr *shdr = get_shdr (sec);
385 if (ehdrp == NULL || shdr == NULL)
387 return elf_strptr (ehdrp->e_shstrndx, shdr->sh_name);
391 Elf::elf_getdata (unsigned int sec)
395 data = (Elf_Data **) malloc (ehdrp->e_shnum * sizeof (Elf_Data *));
396 for (int i = 0; i < (int) ehdrp->e_shnum; i++)
399 Elf_Data *edta = data[sec];
402 Elf_Internal_Shdr *shdr = get_shdr (sec);
407 if ((shdr->sh_flags & SHF_SUNW_ABSENT) != 0)
409 char *sname = get_sec_name (sec);
410 for (int i = 0, sz = VecSize(ancillary_files); i < sz; i++)
412 Elf *ancElf = ancillary_files->fetch (i);
414 if (dbe_strcmp (sname, ancElf->get_sec_name (sec)) != 0)
416 append_msg (CMSG_WARN,
417 "Warning: the section #%d (%s) is mismatch in ancillary file '%s')\n",
418 sec, STR (sname), STR (ancElf->fname));
419 secNum = ancElf->elf_get_sec_num (sname);
423 Elf_Data *ed = ancElf->elf_getdata (secNum);
427 edta->d_flags |= SHF_SUNW_ABSENT;
433 edta->d_buf = get_data (shdr->sh_offset, (size_t) shdr->sh_size, NULL);
434 edta->d_flags = shdr->sh_flags;
435 edta->d_size = ((edta->d_buf == NULL) || (shdr->sh_type == SHT_NOBITS)) ? 0 : shdr->sh_size;
436 edta->d_off = shdr->sh_offset;
437 edta->d_align = shdr->sh_addralign;
448 for (unsigned int ndx = 0; ndx < ehdrp->e_phnum; ndx++)
450 Elf_Internal_Phdr *phdr = get_phdr (ndx);
453 if (phdr->p_type == PT_DYNAMIC)
456 for (unsigned int i = 0; elf_getdyn (phdr, i, &edyn) != NULL; i++)
460 if (edyn.d_tag == DT_CHECKSUM)
462 chk = edyn.d_un.d_val;
468 return normalize_checksum (chk);
475 for (unsigned int pnum = 0; pnum < elf_getehdr ()->e_phnum; pnum++)
477 Elf_Internal_Phdr *phdr = get_phdr (pnum);
478 if (phdr->p_type == PT_LOAD && phdr->p_flags == (PF_R | PF_X))
481 addr = phdr->p_vaddr;
493 Elf::elf_strptr (unsigned int sec, uint64_t off)
495 Elf_Data *edta = elf_getdata (sec);
496 if (edta && edta->d_buf && edta->d_size > off)
497 return ((char *) edta->d_buf) + off;
502 Elf::elf_getsym (Elf_Data *edta, unsigned int ndx, Elf_Internal_Sym *dst)
504 if (dst == NULL || edta == NULL)
506 if (elf_getclass () == ELFCLASS32)
508 if (edta->d_size <= ndx * sizeof (Elf32_Sym))
510 Elf32_Sym *hdr = (Elf32_Sym*) bind (edta->d_off + ndx * sizeof (Elf32_Sym), sizeof (Elf32_Sym));
513 dst->st_name = decode (hdr->st_name);
514 dst->st_value = decode (hdr->st_value);
515 dst->st_size = decode (hdr->st_size);
516 dst->st_info = ELF64_ST_INFO (ELF32_ST_BIND (decode (hdr->st_info)),
517 ELF32_ST_TYPE (decode (hdr->st_info)));
518 dst->st_other = decode (hdr->st_other);
519 dst->st_shndx = decode (hdr->st_shndx);
523 if (edta->d_size <= ndx * sizeof (Elf64_Sym))
525 Elf64_Sym *hdr = (Elf64_Sym*) bind (edta->d_off + ndx * sizeof (Elf64_Sym),
529 dst->st_name = decode (hdr->st_name);
530 dst->st_value = decode (hdr->st_value);
531 dst->st_size = decode (hdr->st_size);
532 dst->st_info = decode (hdr->st_info);
533 dst->st_other = decode (hdr->st_other);
534 dst->st_shndx = decode (hdr->st_shndx);
540 Elf::elf_getrel (Elf_Data *edta, unsigned int ndx, Elf_Internal_Rela *dst)
542 if (dst == NULL || edta == NULL || edta->d_buf == NULL)
544 if (elf_getclass () == ELFCLASS32)
546 Elf32_Rel *rel = ((Elf32_Rel *) edta->d_buf) + ndx;
547 dst->r_offset = decode (rel->r_offset);
548 dst->r_info = ELF64_R_INFO (ELF32_R_SYM (decode (rel->r_info)),
549 ELF32_R_TYPE (decode (rel->r_info)));
553 Elf64_Rel *rel = ((Elf64_Rel *) edta->d_buf) + ndx;
554 dst->r_offset = decode (rel->r_offset);
555 dst->r_info = decode (rel->r_info);
561 Elf::elf_getrela (Elf_Data *edta, unsigned int ndx, Elf_Internal_Rela *dst)
563 if (dst == NULL || edta == NULL || edta->d_buf == NULL)
565 if (elf_getclass () == ELFCLASS32)
567 Elf32_Rela *rela = ((Elf32_Rela *) edta->d_buf) + ndx;
568 dst->r_offset = decode (rela->r_offset);
569 dst->r_addend = decode (rela->r_addend);
570 dst->r_info = ELF64_R_INFO (ELF32_R_SYM (decode (rela->r_info)),
571 ELF32_R_TYPE (decode (rela->r_info)));
575 Elf64_Rela *rela = ((Elf64_Rela *) edta->d_buf) + ndx;
576 dst->r_offset = decode (rela->r_offset);
577 dst->r_addend = decode (rela->r_addend);
578 dst->r_info = decode (rela->r_info);
584 Elf::elf_getancillary (Elf_Data *edta, unsigned int ndx, Elf64_Ancillary *dst)
586 if (dst == NULL || edta == NULL || edta->d_buf == NULL)
588 if (elf_getclass () == ELFCLASS32)
590 Elf32_Ancillary *p = ((Elf32_Ancillary *) edta->d_buf) + ndx;
591 dst->a_tag = decode (p->a_tag);
592 dst->a_un.a_val = decode (p->a_un.a_val);
596 Elf64_Ancillary *p = ((Elf64_Ancillary *) edta->d_buf) + ndx;
597 dst->a_tag = decode (p->a_tag);
598 dst->a_un.a_val = decode (p->a_un.a_val);
604 Elf::get_related_file (const char *lo_name, const char *nm)
609 df = new DbeFile (nm);
610 df->filetype |= (DbeFile::F_FILE | DbeFile::F_DEBUG_FILE);
614 char *bname = get_basename (lo_name);
615 char *fnm = dbe_sprintf ("%.*s/%s", (int) (bname - lo_name), lo_name, nm);
616 df = new DbeFile (fnm);
617 df->filetype |= (DbeFile::F_FILE | DbeFile::F_DEBUG_FILE);
620 Dprintf (DEBUG_STABS, "get_related_file: %s -> '%s'\n", nm, df->get_name ());
621 Elf_status st = ELF_ERR_CANT_OPEN_FILE;
622 Elf *elf = elf_begin (df->get_location (), &st);
630 case ELF_ERR_CANT_OPEN_FILE:
631 append_msg (CMSG_ERROR, GTXT ("Cannot open file `%s'"), df->get_name ());
633 case ELF_ERR_BAD_ELF_FORMAT:
635 append_msg (CMSG_ERROR, GTXT ("Cannot read ELF header of `%s'"),
644 Elf::find_ancillary_files (char *lo_name)
646 // read the .gnu_debuglink and .SUNW_ancillary seections
648 return gnu_debug_file;
649 unsigned int sec = elf_get_sec_num (NTXT (".gnu_debuglink"));
652 Elf_Data *dp = elf_getdata (sec);
655 gnu_debug_file = get_related_file (lo_name, (char *) (dp->d_buf));
657 return gnu_debug_file;
661 sec = elf_get_sec_num (NTXT (".SUNW_ancillary"));
664 Elf_Internal_Shdr *shdr = get_shdr (sec);
665 uint64_t check_sum = 0;
666 char *ancName = NULL;
669 Elf_Data *dp = elf_getdata (sec);
670 for (int i = 0, sz = (int) (shdr->sh_size / shdr->sh_entsize);
674 if (elf_getancillary (dp, i, &anc) == NULL
675 || anc.a_tag == ANC_SUNW_NULL)
677 if (anc.a_tag == ANC_SUNW_MEMBER)
678 ancName = elf_strptr (shdr->sh_link, anc.a_un.a_ptr);
679 else if (anc.a_tag == ANC_SUNW_CHECKSUM)
683 check_sum = anc.a_un.a_val;
686 if (check_sum == anc.a_un.a_val)
690 Elf *ancElf = get_related_file (lo_name, ancName);
693 int ancSec = ancElf->elf_get_sec_num (".SUNW_ancillary");
696 Elf_Internal_Shdr *ancHdr = ancElf->get_shdr (ancSec);
699 Elf_Data *anc_dp = ancElf->elf_getdata (ancSec);
700 Elf64_Ancillary anc1;
701 if (ancElf->elf_getancillary (anc_dp, 0, &anc1)
702 && (anc1.a_tag == ANC_SUNW_CHECKSUM) &&
703 anc1.a_un.a_val == anc.a_un.a_val)
705 if (ancillary_files == NULL)
706 ancillary_files = new Vector<Elf*>(2);
707 ancillary_files->append (ancElf);
710 append_msg (CMSG_WARN, GTXT ("Load Object: '%s' (checksum Ox%lld). The .anc file '%s' has checksum Ox%llx"),
711 STR (fname), (long long) check_sum,
712 STR (ancElf->dbeFile->get_location ()),
713 (long long) anc1.a_un.a_val);
728 return dbeFile ? dbeFile->get_location () : fname;
731 #define RET_S(x) if (t == x) return (char *) #x
734 get_elf_class_name (int t)
736 RET_S (ELFCLASSNONE);
739 return NTXT ("ELFCLASS_UNKNOWN");
743 get_elf_data_name (int t)
748 return NTXT ("ELFDATA_UNKNOWN");
752 get_elf_osabi_name (int t)
754 RET_S (ELFOSABI_NONE);
755 RET_S (ELFOSABI_HPUX);
756 RET_S (ELFOSABI_NETBSD);
757 RET_S (ELFOSABI_LINUX);
758 RET_S (ELFOSABI_SOLARIS);
759 RET_S (ELFOSABI_AIX);
760 RET_S (ELFOSABI_IRIX);
761 RET_S (ELFOSABI_FREEBSD);
762 RET_S (ELFOSABI_TRU64);
763 RET_S (ELFOSABI_MODESTO);
764 RET_S (ELFOSABI_OPENBSD);
765 return NTXT ("ELFOSABI_UNKNOWN");
769 get_elf_etype_name (int t)
778 return NTXT ("ETYPE_UNKNOWN");
782 get_elf_ptype_name (int t)
793 RET_S (PT_GNU_EH_FRAME);
794 RET_S (PT_GNU_EH_FRAME);
798 return NTXT ("PTYPE_UNKNOWN");
802 get_elf_shtype_name (unsigned int t)
805 RET_S (SHT_PROGBITS);
816 RET_S (SHT_INIT_ARRAY);
817 RET_S (SHT_FINI_ARRAY);
818 RET_S (SHT_PREINIT_ARRAY);
820 RET_S (SHT_SYMTAB_SHNDX);
822 RET_S (SHT_SUNW_verdef);
823 RET_S (SHT_SUNW_verneed);
829 return NTXT ("SHTYPE_UNKNOWN");
833 get_elf_machine_name (int t)
844 RET_S (EM_MIPS_RS3_LE);
845 RET_S (EM_SPARC32PLUS);
905 return NTXT ("ELFMACHINE_UNKNOWN");
909 get_elf_version_name (int t)
913 return NTXT ("VERSION_UNKNOWN");
917 get_elf_ancillary_tag (int t)
919 RET_S (ANC_SUNW_NULL);
920 RET_S (ANC_SUNW_CHECKSUM);
921 RET_S (ANC_SUNW_MEMBER);
922 RET_S (ANC_SUNW_NUM);
923 return NTXT ("ANCILLARY_TAG_UNKNOWN");
926 #define ADD_S(x) if ((f & (x)) == (x)) { sb->append(' '); sb->append(#x); f &= ~(x); }
929 dump_sh_flags (StringBuilder *sb, long long flags)
934 sb->append (NTXT (" ["));
937 ADD_S (SHF_EXECINSTR)
940 ADD_S (SHF_INFO_LINK)
941 ADD_S (SHF_LINK_ORDER)
942 ADD_S (SHF_OS_NONCONFORMING)
945 ADD_S (SHF_SUNW_ABSENT)
947 if (f != 0 && f != flags)
948 sb->appendf (NTXT (" 0x%llx"), (long long) f);
949 sb->append (NTXT (" ]"));
951 sb->append (NTXT ("\n"));
955 dump_p_flags (StringBuilder *sb, long long flags)
960 sb->append (NTXT (" ["));
965 if (f != 0 && f != flags)
966 sb->appendf (NTXT (" 0x%llx"), (long long) f);
967 sb->append (NTXT (" ]"));
969 sb->append (NTXT ("\n"));
976 sb.sprintf (NTXT ("ELF Header: %s\n"), fname ? fname : GTXT ("(unknown)"));
979 sb.appendf (GTXT ("\n\n Cannot read Elf header\n"));
980 return sb.toString ();
982 sb.appendf (NTXT (" %-15s "), NTXT ("e_ident"));
983 for (int i = 0; i < EI_NIDENT; i++)
984 sb.appendf (NTXT ("%x"), ehdrp->e_ident[i]);
985 sb.append (NTXT ("\n"));
986 char *fmt0 = NTXT (" %-15s %10lld ( %s )\n");
987 char *fmt1 = NTXT (" %-15s 0x%08llx ( %lld )\n");
988 char *fmt2 = NTXT (" %-15s 0x%08llx");
989 sb.appendf (fmt0, NTXT ("EI_CLASS"), (long long) ehdrp->e_ident[EI_CLASS],
990 get_elf_class_name (ehdrp->e_ident[EI_CLASS]));
991 sb.appendf (fmt0, NTXT ("EI_DATA"), (long long) ehdrp->e_ident[EI_DATA],
992 get_elf_data_name (ehdrp->e_ident[EI_DATA]));
993 sb.appendf (fmt0, NTXT ("EI_OSABI"), (long long) ehdrp->e_ident[EI_OSABI],
994 get_elf_osabi_name (ehdrp->e_ident[EI_OSABI]));
995 sb.appendf (fmt0, NTXT ("e_type"), (long long) ehdrp->e_type,
996 get_elf_etype_name (ehdrp->e_type));
997 sb.appendf (fmt0, NTXT ("e_machine"), (long long) ehdrp->e_machine,
998 get_elf_machine_name (ehdrp->e_machine));
999 sb.appendf (fmt0, NTXT ("e_version"), (long long) ehdrp->e_version,
1000 get_elf_version_name (ehdrp->e_version));
1001 sb.appendf (fmt1, NTXT ("e_entry"), (long long) ehdrp->e_entry,
1002 (long long) ehdrp->e_entry);
1003 sb.appendf (fmt1, NTXT ("e_phoff"), (long long) ehdrp->e_phoff,
1004 (long long) ehdrp->e_phoff);
1005 sb.appendf (fmt1, NTXT ("e_shoff"), (long long) ehdrp->e_shoff,
1006 (long long) ehdrp->e_shoff);
1007 sb.appendf (fmt1, NTXT ("e_flags"), (long long) ehdrp->e_flags,
1008 (long long) ehdrp->e_flags);
1009 sb.appendf (fmt1, NTXT ("e_ehsize"), (long long) ehdrp->e_ehsize,
1010 (long long) ehdrp->e_ehsize);
1011 sb.appendf (fmt1, NTXT ("e_phentsize"), (long long) ehdrp->e_phentsize,
1012 (long long) ehdrp->e_phentsize);
1013 sb.appendf (fmt1, NTXT ("e_phnum"), (long long) ehdrp->e_phnum,
1014 (long long) ehdrp->e_phnum);
1015 sb.appendf (fmt1, NTXT ("e_shentsize"), (long long) ehdrp->e_shentsize,
1016 (long long) ehdrp->e_shentsize);
1017 sb.appendf (fmt1, NTXT ("e_shnum"), (long long) ehdrp->e_shnum,
1018 (long long) ehdrp->e_shnum);
1019 sb.appendf (fmt1, NTXT ("e_shstrndx"), (long long) ehdrp->e_shstrndx,
1020 (long long) ehdrp->e_shstrndx);
1022 for (unsigned int i = 0; i < ehdrp->e_phnum; i++)
1024 sb.appendf (NTXT ("\nProgram Header[%d]:\n"), i);
1025 Elf_Internal_Phdr *phdr = get_phdr (i);
1028 sb.appendf (NTXT (" ERROR: get_phdr(%d) failed\n"), i);
1031 sb.appendf (fmt0, "p_type", (long long) phdr->p_type,
1032 get_elf_ptype_name (phdr->p_type));
1033 sb.appendf (fmt2, "p_flags", (long long) phdr->p_flags);
1034 dump_p_flags (&sb, phdr->p_flags);
1035 sb.appendf (fmt1, "p_offset", (long long) phdr->p_offset,
1036 (long long) phdr->p_offset);
1037 sb.appendf (fmt1, "p_vaddr", (long long) phdr->p_vaddr,
1038 (long long) phdr->p_vaddr);
1039 sb.appendf (fmt1, "p_paddr", (long long) phdr->p_paddr,
1040 (long long) phdr->p_paddr);
1041 sb.appendf (fmt1, "p_filesz", (long long) phdr->p_filesz,
1042 (long long) phdr->p_filesz);
1043 sb.appendf (fmt1, "p_memsz", (long long) phdr->p_memsz,
1044 (long long) phdr->p_memsz);
1045 sb.appendf (fmt1, "p_align", (long long) phdr->p_align,
1046 (long long) phdr->p_align);
1049 for (unsigned int i = 1; i < ehdrp->e_shnum; i++)
1051 sb.appendf (NTXT ("\nSection Header[%d]:\n"), i);
1052 Elf_Internal_Shdr *shdr = get_shdr (i);
1055 sb.appendf (NTXT (" ERROR: get_shdr(%d) failed\n"), i);
1058 char *s = get_sec_name (i);
1059 sb.appendf (fmt0, "sh_name", (long long) shdr->sh_name,
1060 s ? s : NTXT ("NULL"));
1061 sb.appendf (fmt0, "sh_type", (long long) shdr->sh_type,
1062 get_elf_shtype_name (shdr->sh_type));
1063 sb.appendf (fmt2, "sh_flags", (long long) shdr->sh_flags);
1064 dump_sh_flags (&sb, shdr->sh_flags);
1065 sb.appendf (fmt1, "sh_addr", (long long) shdr->sh_addr,
1066 (long long) shdr->sh_addr);
1067 sb.appendf (fmt1, "sh_offset", (long long) shdr->sh_offset,
1068 (long long) shdr->sh_offset);
1069 sb.appendf (fmt1, "sh_size", (long long) shdr->sh_size,
1070 (long long) shdr->sh_size);
1071 sb.appendf (fmt1, "sh_link", (long long) shdr->sh_link,
1072 (long long) shdr->sh_link);
1073 sb.appendf (fmt1, "sh_info", (long long) shdr->sh_info,
1074 (long long) shdr->sh_info);
1075 sb.appendf (fmt1, "sh_addralign", (long long) shdr->sh_addralign,
1076 (long long) shdr->sh_addralign);
1077 sb.appendf (fmt1, "sh_entsize", (long long) shdr->sh_entsize,
1078 (long long) shdr->sh_entsize);
1081 for (unsigned int i = 1; i < ehdrp->e_shnum; i++)
1083 Elf_Internal_Shdr *shdr = get_shdr (i);
1086 char *secName = get_sec_name (i);
1087 if (secName == NULL)
1089 if (strcmp (NTXT (".SUNW_ancillary"), secName) == 0)
1091 sb.appendf (NTXT ("\nSection[%d]: %s\n"), i, secName);
1092 Elf_Data *dp = elf_getdata (i);
1093 for (int j = 0, cnt = (int) (shdr->sh_size / shdr->sh_entsize);
1096 Elf64_Ancillary anc;
1097 if (elf_getancillary (dp, j, &anc) == NULL)
1099 sb.appendf (NTXT ("%10d %-20s 0x%08llx %6lld"), j,
1100 get_elf_ancillary_tag ((int) anc.a_tag),
1101 (long long) anc.a_un.a_ptr, (long long) anc.a_un.a_ptr);
1102 if (anc.a_tag == ANC_SUNW_MEMBER)
1103 sb.appendf (NTXT (" %s\n"), STR (elf_strptr (shdr->sh_link, anc.a_un.a_ptr)));
1105 sb.append (NTXT ("\n"));
1109 return sb.toString ();
1113 Elf::dump_elf_sec ()
1119 Dprintf (DUMP_ELF_SEC, "======= DwarfLib::dump_elf_sec\n"
1120 " N |type|flags| sh_addr | sh_offset | sh_size | sh_link |"
1121 " sh_info | sh_addralign | sh_entsize | sh_name | name\n");
1122 for (unsigned int sec = 1; sec < ehdrp->e_shnum; sec++)
1124 Elf_Internal_Shdr *shdr = get_shdr (sec);
1127 char *name = elf_strptr (ehdrp->e_shstrndx, shdr->sh_name);
1128 Dprintf (DUMP_ELF_SEC, "%3d:%3d |%4d |%9lld | %9lld |%8lld |%8lld |"
1129 "%8lld |%14d |%11lld | %6lld %s\n",
1130 sec, (int) shdr->sh_type, (int) shdr->sh_flags,
1131 (long long) shdr->sh_addr, (long long) shdr->sh_offset,
1132 (long long) shdr->sh_size, (long long) shdr->sh_link,
1133 (long long) shdr->sh_info,
1134 (int) shdr->sh_addralign, (long long) shdr->sh_entsize,
1135 (long long) shdr->sh_name, name ? name : NTXT ("NULL"));
1137 Dprintf (DUMP_ELF_SEC, NTXT ("\n"));