Initial work on copying an ELF file
[centaur.git] / src / copy / ehdr.c
1 #include <stdio.h>
2
3 #include <libelf.h>
4 #include <gelf.h>
5
6 #include <libelfu/libelfu.h>
7
8
9 void elfu_copyEhdr(Elf *eo, Elf *ei)
10 {
11   int elfclass;
12   GElf_Ehdr ehdr, ehdrOut;
13
14   elfclass = gelf_getclass(ei);
15   if (elfclass == ELFCLASSNONE) {
16     fprintf(stderr, "getclass() failed: %s\n", elf_errmsg(-1));
17   }
18
19   if (!gelf_getehdr(ei, &ehdr)) {
20     fprintf(stderr, "gelf_getehdr() failed: %s\n", elf_errmsg(-1));
21     return;
22   }
23
24   if (!gelf_newehdr(eo, elfclass)) {
25     fprintf(stderr, "gelf_newehdr() failed: %s\n", elf_errmsg(-1));
26   }
27
28   if (!gelf_getehdr(ei, &ehdrOut)) {
29     fprintf(stderr, "gelf_getehdr() failed: %s\n", elf_errmsg(-1));
30     return;
31   }
32
33   ehdrOut.e_ident[EI_DATA] = ehdr.e_ident[EI_DATA];
34   ehdrOut.e_type = ehdr.e_type;
35   ehdrOut.e_machine = ehdr.e_machine;
36   ehdrOut.e_version = ehdr.e_version;
37   ehdrOut.e_entry = ehdr.e_entry; // FIXME
38   /* e_phoff */
39   /* e_shoff */
40   ehdrOut.e_flags = ehdr.e_flags;
41   /* e_ehsize */
42   /* e_phentsize */
43   /* e_phnum */
44   /* e_shentsize */
45   /* s_shnum */
46   ehdrOut.e_shstrndx = ehdr.e_shstrndx; // FIXME
47
48
49   if (!gelf_update_ehdr(eo, &ehdrOut)) {
50     fprintf(stderr, "gelf_update_ehdr() failed: %s\n", elf_errmsg(-1));
51   }
52 }