[FIX] real binary info
[platform/core/system/swap-manager.git] / daemon / elf.c
1 #include <sys/types.h>
2 #include <sys/stat.h>
3 #include <fcntl.h>
4 #include <unistd.h>
5 #include <elf.h>
6 #include <stdbool.h>
7 #include <errno.h>
8 #include "elf.h"
9
10 #define SIZEOF_VOID_P 4
11 #if SIZEOF_VOID_P == 8
12 typedef Elf64_Ehdr Elf_Ehdr;
13 #elif SIZEOF_VOID_P == 4
14 typedef Elf32_Ehdr Elf_Ehdr;
15 #else
16 #error "Unknown void* size"
17 #endif
18
19 static int read_elf_header(Elf_Ehdr * header, const char *filepath)
20 {
21         int fd = open(filepath, O_RDONLY);
22         if (fd < 0)
23                 return -ENOENT;
24         bool read_failed = read(fd, header, sizeof(*header)) != sizeof(*header);
25         close(fd);
26         return read_failed ? -EIO : 0;
27 }
28
29 static int elf_type(const char *filepath)
30 {
31         Elf_Ehdr header;
32         int err = read_elf_header(&header, filepath);
33         return err ? err : header.e_type;
34 }
35
36 uint32_t get_binary_type(const char *path)
37 {
38         int type = elf_type(path);
39
40         switch (type) {
41         case ET_DYN:
42                 return BINARY_TYPE_PIE;
43         case ET_EXEC:
44                 return BINARY_TYPE_NO_PIE;
45         default:
46                 return BINARY_TYPE_UNKNOWN;
47         }
48 }