13 int main (
int argc,
char *argv[])
15 const char *filename = argv[1];
16 int fd = open (filename, O_RDONLY);
19 unsigned long file = (
unsigned long)mmap (0, buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
20 if (file == (
unsigned long)MAP_FAILED)
24 ElfW(Ehdr) *header = (
ElfW(Ehdr) *)file;
25 ElfW(Shdr) *sh = (
ElfW(Shdr)*)(file + header->e_shoff);
26 ElfW(Sym) *symtab = 0;
27 unsigned long n_symtab = 0;
28 ElfW(Half) *versym = 0;
29 ElfW(Verdef) *verdef = 0;
32 for (i = 0; i < header->e_shnum; i++)
34 if (sh[i].sh_type == SHT_DYNSYM)
36 symtab = (
ElfW(Sym)*)(file + sh[i].sh_offset);
37 n_symtab = sh[i].sh_size / sh[i].sh_entsize;
39 else if (sh[i].sh_type == SHT_STRTAB && strtab == 0)
42 strtab = (
char*)(file+sh[i].sh_offset);
44 else if (sh[i].sh_type == SHT_GNU_versym)
46 versym = (
ElfW(Half)*)(file+sh[i].sh_offset);
48 else if (sh[i].sh_type == SHT_GNU_verdef)
50 verdef = (
ElfW(Verdef)*)(file+sh[i].sh_offset);
53 if (strtab == 0 || verdef == 0 ||
54 symtab == 0 || n_symtab == 0 || versym == 0)
58 ElfW(Verdef) *cur, *prev;
59 int local_passthru_printed = 0;
60 for (prev = 0, cur = verdef;
62 prev = cur, cur = (
ElfW(Verdef)*)(((
unsigned long)cur)+cur->vd_next))
64 assert (cur->vd_version == 1);
65 assert (cur->vd_cnt == 2 || cur->vd_cnt == 1);
66 ElfW(Verdaux) *first = (
ElfW(Verdaux)*)(((
unsigned long)cur)+cur->vd_aux);
67 if (cur->vd_flags & VER_FLG_BASE)
71 printf (
"%s {\n", strtab + first->vda_name);
72 int has_one_symbol = 0;
73 for (i = 0; i < n_symtab; i++)
75 if (symtab[i].st_name == 0 || symtab[i].st_value == 0)
79 ElfW(Half) ver = versym[i];
80 if (cur->vd_ndx == ver)
87 printf (
"\t%s;\n", strtab + symtab[i].st_name);
92 if (!local_passthru_printed)
94 local_passthru_printed = 1;
95 printf (
"local:*;\n};\n");
104 ElfW(Verdaux) *parent = (
ElfW(Verdaux)*)(((
unsigned long)first)+first->vda_next);
105 printf (
"} %s;\n", strtab + parent->vda_name);