elf64probe.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
       ---
       elf64probe.c (857B)
       ---
            1 #include <stdio.h>
            2 
            3 #include <scc/mach.h>
            4 #include <scc/elf64.h>
            5 
            6 #include "../libmach.h"
            7 #include "fun.h"
            8 
            9 int
           10 elf64probe(unsigned char *buf, char **name)
           11 {
           12         int endian;
           13         Elf_Ehdr hdr;
           14         struct arch *ap;
           15 
           16         unpack(buf[EI_DATA] == ELFDATA2LSB ? LITTLE_ENDIAN : BIG_ENDIAN,
           17                buf,
           18                "'16sss",
           19                hdr.e_ident,
           20                &hdr.e_type,
           21                &hdr.e_machine,
           22                &hdr.e_version);
           23 
           24         if (!IS_ELF(hdr)
           25         ||  buf[EI_CLASS] != ELFCLASS64
           26         ||  buf[EI_DATA] == ELFDATANONE
           27         ||  buf[EI_VERSION] != EV_CURRENT
           28         ||  (buf[EI_DATA] != ELFDATA2LSB && buf[EI_DATA] != ELFDATA2MSB)) {
           29                 return -1;
           30         }
           31 
           32         if (hdr.e_version != EV_CURRENT)
           33                 return -1;
           34 
           35         endian = hdr.e_ident[EI_DATA];
           36         for (ap = elf64archs; ap->name; ap++) {
           37                 if (ap->mach == hdr.e_machine &&  ap->endian == endian) {
           38                         if (name)
           39                                 *name = ap->name;
           40                         return ap->type;
           41                 }
           42         }
           43 
           44         return -1;
           45 }