5a62593642e9c2ba2ac2662869f66be24751b6c6
[centaur.git] / src / copy / section.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_copySection(Elf *eo, Elf_Scn *scn)
10 {
11   Elf_Scn *scnOut;
12   Elf_Data *data;
13   GElf_Shdr shdr, shdrOut;
14
15   scnOut = elf_newscn(eo);
16   if (!scnOut) {
17     fprintf(stderr, "elf_newscn() failed: %s\n", elf_errmsg(-1));
18     return;
19   }
20
21   if (gelf_getshdr(scn, &shdr) != &shdr) {
22     fprintf(stderr, "gelf_getshdr() failed: %s\n", elf_errmsg(-1));
23   }
24
25
26   /* Copy section header */
27   if (gelf_getshdr(scnOut, &shdrOut) != &shdrOut) {
28     fprintf(stderr, "gelf_getshdr() failed: %s\n", elf_errmsg(-1));
29   }
30
31   shdrOut.sh_name = shdr.sh_name;
32   shdrOut.sh_type = shdr.sh_type;
33   shdrOut.sh_flags = shdr.sh_flags;
34   /* sh_addr */
35   shdrOut.sh_addr = shdr.sh_addr;
36   /* sh_offset */
37   /* sh_size */
38   shdrOut.sh_link = shdr.sh_link;
39   shdrOut.sh_info = shdr.sh_info;
40   shdrOut.sh_addralign = shdr.sh_addralign;
41   //shdrOut.sh_entsize = shdr.sh_entsize;
42
43   if (!gelf_update_shdr(scnOut, &shdrOut)) {
44     fprintf(stderr, "gelf_update_shdr() failed: %s\n", elf_errmsg(-1));
45   }
46
47
48   //elf_flagshdr(scnOut, ELF_C_SET, ELF_F_DIRTY);
49   //elf_flagscn(scnOut, ELF_C_SET, ELF_F_DIRTY);
50
51
52   /* Copy each data part in source segment */
53   data = elf_rawdata(scn, NULL);
54   while (data) {
55     Elf_Data *dataOut = elf_newdata(scnOut);
56     if (!dataOut) {
57       fprintf(stderr, "elf_newdata() failed: %s\n", elf_errmsg(-1));
58     }
59
60     dataOut->d_align = data->d_align;
61     dataOut->d_buf  = data->d_buf;
62     /* dataOut->d_off  = data->d_off; */
63     dataOut->d_type = data->d_type;
64     dataOut->d_size = data->d_size;
65     dataOut->d_version = data->d_version;
66
67     //elf_flagdata(dataOut, ELF_C_SET, ELF_F_DIRTY);
68
69     data = elf_rawdata(scn, data);
70   }
71
72   // ehf_newdata() should flag the entire section dirty
73   //elf_flagshdr(scnOut, ELF_C_SET, ELF_F_DIRTY);
74   //elf_flagscn(scnOut, ELF_C_SET, ELF_F_DIRTY);
75 }