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