1 #define _POSIX_C_SOURCE 200112L
15 int main(int ac, char **av) {
21 Elf64_Shdr *dynsect = 0;
22 Elf64_Shdr *strtab = 0, *dyntab = 0;
27 fprintf(stderr, "usage: soname <file>\n");
31 if (lstat(av[1], &sbuf) == -1) {
34 if (!S_ISREG(sbuf.st_mode)) {
38 elffd = open(av[1], O_RDONLY);
42 if (fstat(elffd, &sbuf) == -1) {
45 /* not a regular file? */
46 if (!S_ISREG(sbuf.st_mode)) {
49 /* not at least the size of the elf header? */
50 if ((size_t)sbuf.st_size < sizeof(Elf64_Ehdr)) {
54 elfbase = mmap(0, sbuf.st_size, PROT_READ,MAP_PRIVATE, elffd, 0);
60 if (hdr->e_ident[EI_MAG0] != ELFMAG0
61 || hdr->e_ident[EI_MAG1] != ELFMAG1
62 || hdr->e_ident[EI_MAG2] != ELFMAG2
63 || hdr->e_ident[EI_MAG3] != ELFMAG3
68 /* only dynamic files will have an soname */
69 if (hdr->e_type != ET_DYN) {
73 switch (hdr->e_ident[EI_CLASS]) {
82 /* check endian ness */
83 switch (hdr->e_ident[EI_DATA]) {
84 case ELFDATA2LSB: break;
85 case ELFDATA2MSB: break;
90 /* find the section header table */
91 for (i = 0; i < hdr->e_shnum; i++) {
92 shdr = (Elf64_Shdr *)((char *)elfbase + hdr->e_shoff + i * hdr->e_shentsize);
93 if (shdr->sh_type == SHT_DYNAMIC) {
95 } else if (shdr->sh_type == SHT_STRTAB && i == hdr->e_shstrndx) {
106 name = (char *) elfbase + strtab->sh_offset;
107 for (i = 0; i < hdr->e_shnum; i++) {
108 shdr = (Elf64_Shdr *)((char *)elfbase + hdr->e_shoff + i * hdr->e_shentsize);
109 if (shdr->sh_type == SHT_STRTAB && !strcmp(".dynstr", name+shdr->sh_name)) {
117 dynname = (char *) elfbase + dyntab->sh_offset;
118 for (dent = (Elf64_Dyn *)((char *)elfbase + dynsect->sh_offset); dent->d_tag != DT_NULL; dent++) {
119 if (dent->d_tag == DT_SONAME) {
120 printf("%s\n", dynname + dent->d_un.d_val);
121 /* TODO can there be more than one? */