From: Christos Zoulas Date: Sat, 5 Oct 1996 18:13:09 +0000 (+0000) Subject: Initial revision X-Git-Tag: FILE3_27~74 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=608e4da973296ff476b70444d942b3cb6a872d92;p=file Initial revision --- diff --git a/src/readelf.c b/src/readelf.c new file mode 100644 index 00000000..0d85ff07 --- /dev/null +++ b/src/readelf.c @@ -0,0 +1,147 @@ + +#ifdef BUILTIN_ELF +#include +#include +#include +#include +#include + +#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