1 /* Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
2 Written by Ulrich Drepper <drepper@redhat.com>, 1998.
3
4 This program is Open Source software; you can redistribute it and/or
5 modify it under the terms of the Open Software License version 1.0 as
6 published by the Open Source Initiative.
7
8 You should have received a copy of the Open Software License along
9 with this program; if not, you may obtain a copy of the Open Software
10 License version 1.0 from http://www.opensource.org/licenses/osl.php or
11 by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
12 3001 King Ranch Road, Ukiah, CA 95482. */
13
14 #include <config.h>
15
16 #include <errno.h>
17 #include <fcntl.h>
18 #include <gelf.h>
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <string.h>
22
23 int
main(int argc,char * argv[])24 main (int argc, char *argv[])
25 {
26 Elf *elf;
27 int fd;
28 GElf_Ehdr ehdr;
29 int cnt;
30
31 fd = open (argv[1], O_RDONLY);
32 if (fd == -1)
33 {
34 printf ("cannot open \"%s\": %s\n", argv[1], strerror (errno));
35 exit (1);
36 }
37
38 elf_version (EV_CURRENT);
39
40 elf = elf_begin (fd, ELF_C_READ, NULL);
41 if (elf == NULL)
42 {
43 printf ("cannot open ELF file: %s\n", elf_errmsg (-1));
44 exit (1);
45 }
46
47 if (elf_kind (elf) != ELF_K_ELF)
48 {
49 printf ("\"%s\" is not an ELF file\n", argv[1]);
50 exit (1);
51 }
52
53 if (gelf_getehdr (elf, &ehdr) == NULL)
54 {
55 printf ("cannot get the ELF header: %s\n", elf_errmsg (-1));
56 exit (1);
57 }
58
59 printf ("idx type %*s %*s %*s %*s %*s align flags\n",
60 gelf_getclass (elf) == ELFCLASS32 ? 9 : 17, "offset",
61 gelf_getclass (elf) == ELFCLASS32 ? 10 : 18, "vaddr",
62 gelf_getclass (elf) == ELFCLASS32 ? 10 : 18, "paddr",
63 gelf_getclass (elf) == ELFCLASS32 ? 9 : 12, "filesz",
64 gelf_getclass (elf) == ELFCLASS32 ? 9 : 12, "memsz");
65
66 for (cnt = 0; cnt < ehdr.e_phnum; ++cnt)
67 {
68 static const char *typenames[] =
69 {
70 [PT_NULL] = "NULL",
71 [PT_LOAD] = "LOAD",
72 [PT_DYNAMIC] = "DYNAMIC",
73 [PT_INTERP] = "INTERP",
74 [PT_NOTE] = "NOTE",
75 [PT_SHLIB] = "SHLIB",
76 [PT_PHDR] = "PHDR"
77 };
78 GElf_Phdr mem;
79 GElf_Phdr *phdr = gelf_getphdr (elf, cnt, &mem);
80 char buf[19];
81 const char *p_type = typenames[phdr->p_type];
82
83 /* If we don't know the name of the type we use the number value. */
84 if (phdr->p_type >= PT_NUM)
85 {
86 snprintf (buf, sizeof (buf), "%x", phdr->p_type);
87 p_type = buf;
88 }
89
90 printf ("%3d %-7s %#0*llx %#0*llx %#0*llx %#0*llx %#0*llx %#6llx ",
91 cnt, p_type,
92 gelf_getclass (elf) == ELFCLASS32 ? 9 : 17,
93 (unsigned long long int) phdr->p_offset,
94 gelf_getclass (elf) == ELFCLASS32 ? 10 : 18,
95 (unsigned long long int) phdr->p_vaddr,
96 gelf_getclass (elf) == ELFCLASS32 ? 10 : 18,
97 (unsigned long long int) phdr->p_paddr,
98 gelf_getclass (elf) == ELFCLASS32 ? 9 : 12,
99 (unsigned long long int) phdr->p_filesz,
100 gelf_getclass (elf) == ELFCLASS32 ? 9 : 12,
101 (unsigned long long int) phdr->p_memsz,
102 (unsigned long long int) phdr->p_align);
103
104 putc_unlocked ((phdr->p_flags & PF_X) ? 'X' : ' ', stdout);
105 putc_unlocked ((phdr->p_flags & PF_W) ? 'W' : ' ', stdout);
106 putc_unlocked ((phdr->p_flags & PF_R) ? 'R' : ' ', stdout);
107
108 putc_unlocked ('\n', stdout);
109
110 if (phdr->p_type == PT_INTERP)
111 {
112 /* We can show the user the name of the interpreter. */
113 size_t maxsize;
114 char *filedata = elf_rawfile (elf, &maxsize);
115
116 if (filedata != NULL && phdr->p_offset < maxsize)
117 printf ("\t[Requesting program interpreter: %s]\n",
118 filedata + phdr->p_offset);
119 }
120 }
121
122 if (elf_end (elf) != 0)
123 {
124 printf ("error while freeing ELF descriptor: %s\n", elf_errmsg (-1));
125 exit (1);
126 }
127
128 return 0;
129 }
130