6 #include <libelfu/libelfu.h>
9 void elfu_copySection(Elf *eo, Elf_Scn *scn)
13 GElf_Shdr shdr, shdrOut;
15 scnOut = elf_newscn(eo);
17 fprintf(stderr, "elf_newscn() failed: %s\n", elf_errmsg(-1));
21 if (gelf_getshdr(scn, &shdr) != &shdr) {
22 fprintf(stderr, "gelf_getshdr() failed: %s\n", elf_errmsg(-1));
26 /* Copy section header */
27 if (gelf_getshdr(scnOut, &shdrOut) != &shdrOut) {
28 fprintf(stderr, "gelf_getshdr() failed: %s\n", elf_errmsg(-1));
31 shdrOut.sh_name = shdr.sh_name;
32 shdrOut.sh_type = shdr.sh_type;
33 shdrOut.sh_flags = shdr.sh_flags;
35 shdrOut.sh_addr = shdr.sh_addr;
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;
43 if (!gelf_update_shdr(scnOut, &shdrOut)) {
44 fprintf(stderr, "gelf_update_shdr() failed: %s\n", elf_errmsg(-1));
48 //elf_flagshdr(scnOut, ELF_C_SET, ELF_F_DIRTY);
49 //elf_flagscn(scnOut, ELF_C_SET, ELF_F_DIRTY);
52 /* Copy each data part in source segment */
53 data = elf_rawdata(scn, NULL);
55 Elf_Data *dataOut = elf_newdata(scnOut);
57 fprintf(stderr, "elf_newdata() failed: %s\n", elf_errmsg(-1));
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;
67 //elf_flagdata(dataOut, ELF_C_SET, ELF_F_DIRTY);
69 data = elf_rawdata(scn, data);
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);