]> granicus.if.org Git - file/commitdiff
Initial revision
authorChristos Zoulas <christos@zoulas.com>
Sat, 5 Oct 1996 18:13:09 +0000 (18:13 +0000)
committerChristos Zoulas <christos@zoulas.com>
Sat, 5 Oct 1996 18:13:09 +0000 (18:13 +0000)
src/readelf.c [new file with mode: 0644]

diff --git a/src/readelf.c b/src/readelf.c
new file mode 100644 (file)
index 0000000..0d85ff0
--- /dev/null
@@ -0,0 +1,147 @@
+
+#ifdef BUILTIN_ELF
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "readelf.h"
+#include "file.h"
+
+static void
+doshn(fd, off, num, size, buf)
+       int fd;
+       off_t off;
+       int num;
+       size_t size;
+       char *buf;
+{
+       /* This works for both 32 and 64 bit elf formats */
+       Elf32_Shdr *sh = (Elf32_Shdr *) buf;
+
+       if (lseek(fd, off, SEEK_SET) == -1)
+               error("lseek failed (%s).\n", strerror(errno));
+
+       for ( ; num; num--) {
+               if (read(fd, buf, size) == -1)
+                       error("read failed (%s).\n", strerror(errno));
+               if (sh->sh_type == SHT_SYMTAB)
+                       return;
+       }
+       (void) printf (", stripped");
+}
+
+#ifdef notyet
+static void
+dophn(fd, off, num, size, buf)
+       int fd;
+       off_t off;
+       int num;
+       size_t size;
+       char *buf;
+{
+       Elf32_Phdr *ph = (Elf32_Phdr *) buf;
+
+       if (lseek(fd, off, SEEK_SET) == -1)
+               error("lseek failed (%s).\n", strerror(errno));
+
+       for ( ; num; num--) {
+               if (read(fd, buf, size) == -1)
+                       error("read failed (%s).\n", strerror(errno));
+               printf("type:%d\n", ph->p_type);
+               if (ph->p_type != PT_NOTE)
+                       continue;
+               if (lseek(fd, ph->p_offset, SEEK_SET) == -1)
+                       error("lseek failed (%s).\n", strerror(errno));
+               if (size > BUFSIZ)
+                       size = BUFSIZ;
+               if (read(fd, buf, size) == -1)
+                       error("read failed (%s).\n", strerror(errno));
+               for (size = 0; size < BUFSIZ; size++)
+                       if (isalnum(buf[size]))
+                               printf("%d %c\n", size, buf[size]);
+               return;
+       }
+}
+#endif
+
+void
+tryelf(fd, buf, nbytes)
+       int fd;
+       char *buf;
+       int nbytes;
+{
+       union {
+               long l;
+               char c[sizeof (long)];
+       } u;
+
+       /*
+        * ELF executables have multiple section headers in arbitrary
+        * file locations and thus file(1) cannot determine it from easily.
+        * Instead we traverse thru all section headers until a symbol table
+        * one is found or else the binary is stripped.
+        */
+       if (buf[EI_MAG0] != ELFMAG0 || buf[EI_MAG1] != ELFMAG1
+           && buf[EI_MAG2] != ELFMAG2 || buf[EI_MAG3] != ELFMAG3)
+           return;
+
+
+       if (buf[4] == ELFCLASS32) {
+               Elf32_Ehdr elfhdr;
+               if (nbytes <= sizeof (Elf32_Ehdr))
+                       return;
+
+
+               u.l = 1;
+               (void) memcpy(&elfhdr, buf, sizeof elfhdr);
+
+#ifdef notyet
+               if (elfhdr.e_type == ET_CORE) 
+                       dophn(fd, elfhdr.e_phoff, elfhdr.e_phnum, 
+                             elfhdr.e_phentsize, buf);
+               else 
+#endif
+               {
+                       /*
+                        * If the system byteorder does not equal the
+                        * object byteorder then don't test.
+                        */
+                       if ((u.c[sizeof(long) - 1] + 1) == elfhdr.e_ident[5])
+                               doshn(fd, elfhdr.e_shoff, elfhdr.e_shnum,
+                                     elfhdr.e_shentsize, buf);
+               }
+
+               return;
+       }
+
+        if (buf[4] == ELFCLASS64) {
+               Elf64_Ehdr elfhdr;
+               if (nbytes <= sizeof (Elf64_Ehdr))
+                       return;
+
+
+               u.l = 1;
+               (void) memcpy(&elfhdr, buf, sizeof elfhdr);
+
+#ifdef notyet
+               if (elfhdr.e_type == ET_CORE) 
+                       dophn(fd, elfhdr.e_phoff, elfhdr.e_phnum, 
+                             elfhdr.e_phentsize, buf);
+               else
+#endif
+               {
+                       /*
+                        * If the system byteorder does not equal the
+                        * object byteorder then don't test.
+                        */
+                       if ((u.c[sizeof(long) - 1] + 1) == elfhdr.e_ident[5])
+                               doshn(fd, elfhdr.e_shoff, elfhdr.e_shnum,
+                                     elfhdr.e_shentsize, buf);
+               }
+
+               return;
+       }
+}
+#endif