summaryrefslogtreecommitdiff
path: root/src/copy/ehdr.c
blob: b7c6232962299da6c900eaddb0cd08781d126653 (plain)
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));
  }
}