elfprobe.c - scc - simple c99 compiler
 (HTM) git clone git://git.simple-cc.org/scc
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
       elfprobe.c (1017B)
       ---
            1 #include <stdio.h>
            2 
            3 #include <scc/mach.h>
            4 #include <scc/elf/elftypes.h>
            5 #include <scc/elf/elfhdr.h>
            6 #include <scc/elf.h>
            7 
            8 #include "../libmach.h"
            9 #include "fun.h"
           10 
           11 int
           12 elfprobe(unsigned char *buf, char **name)
           13 {
           14         int arch, data, endian;
           15         struct elfhdr32 hdr;
           16         struct arch *ap;
           17 
           18         data = buf[EI_DATA];
           19         endian = (data == ELFDATA2LSB) ? LITTLE_ENDIAN : BIG_ENDIAN;
           20         arch = (buf[EI_CLASS] == ELFCLASS32) ? ARCHUNK32 : ARCHUNK64;
           21 
           22         unpack(endian,
           23                buf,
           24                "'16sss",
           25                hdr.e_ident,
           26                &hdr.e_type,
           27                &hdr.e_machine,
           28                &hdr.e_version);
           29 
           30         if (!IS_ELF(hdr)
           31         ||  buf[EI_VERSION] != EV_CURRENT
           32         ||  hdr.e_version != EV_CURRENT
           33         ||  buf[EI_CLASS] != ELFCLASS32 && buf[EI_CLASS] != ELFCLASS64
           34         ||  (data != ELFDATA2LSB && data != ELFDATA2MSB)) {
           35                 return -1;
           36         }
           37 
           38         for (ap = elfarchs; ap->name; ap++) {
           39                 if (ap->mach == hdr.e_machine &&  ap->endian == data) {
           40                         if (name)
           41                                 *name = ap->name;
           42                         return ap->type;
           43                 }
           44         }
           45 
           46         if  (name)
           47                 *name = "elf-unknown";
           48 
           49         return OBJ(ELF, arch, endian);
           50 }