1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /* Copyright (c) 1988 AT&T */
22 /* All Rights Reserved */
23
24
25 /*
26 * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
27 */
28
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <unistd.h>
32 #include <string.h>
33 #include <_libelf.h>
34 #include <limits.h>
35 #include "conv.h"
36 #include "dump.h"
37
38 extern int p_flag;
39 extern char *prog_name;
40
41
42 /*
43 * Print the symbols in the archive symbol table.
44 */
45 void
ar_sym_read(Elf * elf,char * filename)46 ar_sym_read(Elf *elf, char *filename)
47 {
48 Elf_Arsym * arsym;
49 size_t cnt, ptr, is64;
50 const char *fmt;
51
52 if ((arsym = elf_getarsym(elf, &ptr)) == NULL) {
53 (void) fprintf(stderr, "%s: %s: no archive symbol table\n",
54 prog_name, filename);
55 return;
56 }
57
58 is64 = (_elf_getarsymwordsize(elf) == 8);
59 (void) printf("%s:\n", filename);
60
61 if (!p_flag) {
62 (void) printf(" **** ARCHIVE SYMBOL TABLE ****\n");
63 if (is64)
64 (void) printf("%-8s %s\n\n", "Offset", "Name");
65 else
66 (void) printf("%-8s %s\n\n", "Offset", "Name");
67 }
68
69 if (is64)
70 fmt = "%-16.16llx %s\n";
71 else
72 fmt = "%-8.8llx %s\n";
73
74 for (cnt = 0; cnt < ptr; cnt++, arsym++) {
75 if (arsym->as_off)
76 (void) printf(fmt, EC_XWORD(arsym->as_off),
77 (arsym->as_name ? arsym->as_name : ""));
78 }
79 }
80
81 /*
82 * Print the program execution header. Input is an opened ELF object file, the
83 * number of structure instances in the header as recorded in the ELF header,
84 * and the filename.
85 */
86 void
dump_exec_header(Elf * elf_file,unsigned nseg,char * filename)87 dump_exec_header(Elf *elf_file, unsigned nseg, char *filename)
88 {
89 GElf_Ehdr ehdr;
90 GElf_Phdr p_phdr;
91 int counter;
92 int field;
93 extern int v_flag, p_flag;
94 extern char *prog_name;
95
96 if (gelf_getclass(elf_file) == ELFCLASS64)
97 field = 16;
98 else
99 field = 12;
100
101 if (!p_flag) {
102 (void) printf(" ***** PROGRAM EXECUTION HEADER *****\n");
103 (void) printf("%-*s%-*s%-*s%s\n",
104 field, "Type", field, "Offset",
105 field, "Vaddr", "Paddr");
106 (void) printf("%-*s%-*s%-*s%s\n\n",
107 field, "Filesz", field, "Memsz",
108 field, "Flags", "Align");
109 }
110
111 if ((gelf_getehdr(elf_file, &ehdr) == 0) || (ehdr.e_phnum == 0)) {
112 return;
113 }
114
115 for (counter = 0; counter < nseg; counter++) {
116
117 if (gelf_getphdr(elf_file, counter, &p_phdr) == 0) {
118 (void) fprintf(stderr,
119 "%s: %s: premature EOF on program exec header\n",
120 prog_name, filename);
121 return;
122 }
123
124 if (!v_flag) {
125 (void) printf(
126 "%-*d%-#*llx%-#*llx%-#*llx\n%-#*llx%-#*llx%-*u%-#*llx\n\n",
127 field, EC_WORD(p_phdr.p_type),
128 field, EC_OFF(p_phdr.p_offset),
129 field, EC_ADDR(p_phdr.p_vaddr),
130 field, EC_ADDR(p_phdr.p_paddr),
131 field, EC_XWORD(p_phdr.p_filesz),
132 field, EC_XWORD(p_phdr.p_memsz),
133 field, EC_WORD(p_phdr.p_flags),
134 field, EC_XWORD(p_phdr.p_align));
135 } else {
136 Conv_inv_buf_t inv_buf;
137
138 (void) printf("%-*s", field,
139 conv_phdr_type(ehdr.e_ident[EI_OSABI],
140 ehdr.e_machine, p_phdr.p_type, DUMP_CONVFMT,
141 &inv_buf));
142 (void) printf(
143 "%-#*llx%-#*llx%-#*llx\n%-#*llx%-#*llx",
144 field, EC_OFF(p_phdr.p_offset),
145 field, EC_ADDR(p_phdr.p_vaddr),
146 field, EC_ADDR(p_phdr.p_paddr),
147 field, EC_XWORD(p_phdr.p_filesz),
148 field, EC_XWORD(p_phdr.p_memsz));
149
150 switch (p_phdr.p_flags) {
151 case 0: (void) printf("%-*s", field, "---"); break;
152 case PF_X:
153 (void) printf("%-*s", field, "--x");
154 break;
155 case PF_W:
156 (void) printf("%-*s", field, "-w-");
157 break;
158 case PF_W+PF_X:
159 (void) printf("%-*s", field, "-wx");
160 break;
161 case PF_R:
162 (void) printf("%-*s", field, "r--");
163 break;
164 case PF_R+PF_X:
165 (void) printf("%-*s", field, "r-x");
166 break;
167 case PF_R+PF_W:
168 (void) printf("%-*s", field, "rw-");
169 break;
170 case PF_R+PF_W+PF_X:
171 (void) printf("%-*s", field, "rwx");
172 break;
173 default:
174 (void) printf("%-*d", field, p_phdr.p_flags);
175 break;
176 }
177 (void) printf(
178 "%-#*llx\n\n", field, EC_XWORD(p_phdr.p_align));
179 }
180 }
181 }
182