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 }