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