From: norly Date: Mon, 11 Feb 2013 00:26:16 +0000 (+0000) Subject: Remove stupid copy X-Git-Url: https://git.enpas.org/?a=commitdiff_plain;h=89a42c8067c5f79142c2b634bcb185d917929c9c;p=centaur.git Remove stupid copy --- diff --git a/include/libelfu/copy.h b/include/libelfu/copy.h deleted file mode 100644 index 341df88..0000000 --- a/include/libelfu/copy.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef __LIBELFU_COPY_H_ -#define __LIBELFU_COPY_H_ - -#include -#include - -void elfu_copyElf(Elf *eo, Elf *ei); - -#endif diff --git a/include/libelfu/libelfu.h b/include/libelfu/libelfu.h index 7621bc4..271b0ce 100644 --- a/include/libelfu/libelfu.h +++ b/include/libelfu/libelfu.h @@ -5,7 +5,6 @@ #include #include -#include #include #include #include diff --git a/include/options.h b/include/options.h index 48f6580..c43c811 100644 --- a/include/options.h +++ b/include/options.h @@ -9,7 +9,6 @@ typedef struct { int printSegments; int printSections; int copy; - int model; } CLIOpts; diff --git a/src/copy/ehdr.c b/src/copy/ehdr.c deleted file mode 100644 index b7c6232..0000000 --- a/src/copy/ehdr.c +++ /dev/null @@ -1,52 +0,0 @@ -#include - -#include -#include - -#include - - -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)); - } -} diff --git a/src/copy/elf.c b/src/copy/elf.c deleted file mode 100644 index 445f98c..0000000 --- a/src/copy/elf.c +++ /dev/null @@ -1,30 +0,0 @@ -#include - -#include -#include - -#include - - -void elfu_copyEhdr(Elf *eo, Elf *ei); -void elfu_copySections(Elf *eo, Elf *ei); -void elfu_copySegments1(Elf *eo, Elf *ei); -void elfu_copySegments2(Elf *eo, Elf *ei); - - -void elfu_copyElf(Elf *eo, Elf *ei) -{ - elfu_copyEhdr(eo, ei); - elfu_copySections(eo, ei); - elfu_copySegments1(eo, ei); - - /* Calculate file structure so we have section offsets */ - if (elf_update(eo, ELF_C_NULL) < 0) { - fprintf(stderr, "elf_update(NULL) failed: %s\n", elf_errmsg(-1)); - } - - /* Update the segment offsets and lengths */ - elfu_copySegments2(eo, ei); - - elfu_fixupPhdrSelfRef(eo); -} diff --git a/src/copy/section.c b/src/copy/section.c deleted file mode 100644 index 6fd08e2..0000000 --- a/src/copy/section.c +++ /dev/null @@ -1,75 +0,0 @@ -#include - -#include -#include - -#include - - -void elfu_copySection(Elf *eo, Elf_Scn *scn) -{ - Elf_Scn *scnOut; - Elf_Data *data; - GElf_Shdr shdr, shdrOut; - - scnOut = elf_newscn(eo); - if (!scnOut) { - fprintf(stderr, "elf_newscn() failed: %s\n", elf_errmsg(-1)); - return; - } - - if (gelf_getshdr(scn, &shdr) != &shdr) { - fprintf(stderr, "gelf_getshdr() failed: %s\n", elf_errmsg(-1)); - } - - - /* Copy section header */ - if (gelf_getshdr(scnOut, &shdrOut) != &shdrOut) { - fprintf(stderr, "gelf_getshdr() failed: %s\n", elf_errmsg(-1)); - } - - shdrOut.sh_name = shdr.sh_name; - shdrOut.sh_type = shdr.sh_type; - shdrOut.sh_flags = shdr.sh_flags; - shdrOut.sh_addr = shdr.sh_addr; - /* sh_offset */ - /* sh_size */ - shdrOut.sh_link = shdr.sh_link; - shdrOut.sh_info = shdr.sh_info; - shdrOut.sh_addralign = shdr.sh_addralign; - shdrOut.sh_entsize = shdr.sh_entsize; - - if (!gelf_update_shdr(scnOut, &shdrOut)) { - fprintf(stderr, "gelf_update_shdr() failed: %s\n", elf_errmsg(-1)); - } - - - //elf_flagshdr(scnOut, ELF_C_SET, ELF_F_DIRTY); - //elf_flagscn(scnOut, ELF_C_SET, ELF_F_DIRTY); - - - /* Copy each data part in source segment */ - data = elf_rawdata(scn, NULL); - while (data) { - Elf_Data *dataOut = elf_newdata(scnOut); - if (!dataOut) { - fprintf(stderr, "elf_newdata() failed: %s\n", elf_errmsg(-1)); - } - - //dataOut->d_align = data->d_align; - dataOut->d_align = shdr.sh_addralign; - dataOut->d_buf = data->d_buf; - /* dataOut->d_off = data->d_off; */ - dataOut->d_type = data->d_type; - dataOut->d_size = data->d_size; - dataOut->d_version = data->d_version; - - //elf_flagdata(dataOut, ELF_C_SET, ELF_F_DIRTY); - - data = elf_rawdata(scn, data); - } - - // ehf_newdata() should flag the entire section dirty - //elf_flagshdr(scnOut, ELF_C_SET, ELF_F_DIRTY); - //elf_flagscn(scnOut, ELF_C_SET, ELF_F_DIRTY); -} diff --git a/src/copy/sections.c b/src/copy/sections.c deleted file mode 100644 index 046b590..0000000 --- a/src/copy/sections.c +++ /dev/null @@ -1,25 +0,0 @@ -#include - -#include -#include - -#include - - - -void elfu_copySection(Elf *eo, Elf_Scn *scn); - - - -void elfu_copySections(Elf *eo, Elf *ei) -{ - Elf_Scn *scn; - - scn = elf_getscn(ei, 1); - - while (scn) { - elfu_copySection(eo, scn); - - scn = elf_nextscn(ei, scn); - } -} diff --git a/src/copy/segments.c b/src/copy/segments.c deleted file mode 100644 index 0f320c1..0000000 --- a/src/copy/segments.c +++ /dev/null @@ -1,163 +0,0 @@ -#include - -#include -#include - -#include - - - -void elfu_copySegments1(Elf *eo, Elf *ei) -{ - size_t i, n; - - if (elf_getphdrnum(ei, &n)) { - fprintf(stderr, "elf_getphdrnum() failed: %s\n", elf_errmsg(-1)); - } - - if (!gelf_newphdr(eo, n)) { - fprintf(stderr, "gelf_newphdr() failed: %s\n", elf_errmsg(-1)); - } - - for (i = 0; i < n; i++) { - GElf_Phdr phdr, phdrOut; - - if (gelf_getphdr(ei, i, &phdr) != &phdr) { - fprintf(stderr, "gelf_getphdr() failed for #%d: %s\n", i, elf_errmsg(-1)); - break; - } - - if (gelf_getphdr(eo, i, &phdrOut) != &phdrOut) { - fprintf(stderr, "gelf_getphdr() failed for #%d: %s\n", i, elf_errmsg(-1)); - break; - } - - phdrOut.p_type = phdr.p_type; - /* p_offset */ - phdrOut.p_vaddr = phdr.p_vaddr; - phdrOut.p_paddr = phdr.p_paddr; - /* p_filesz */ - /* p_memsz */ - phdrOut.p_flags = phdr.p_flags; - phdrOut.p_align = phdr.p_align; - - if (!gelf_update_phdr (eo, i, &phdrOut)) { - fprintf(stderr, "gelf_update_ehdr() failed: %s\n", elf_errmsg(-1)); - } - } - - /* Tell libelf that phdrs have changed */ - elf_flagphdr(eo, ELF_C_SET, ELF_F_DIRTY); -} - - -void elfu_copySegments2(Elf *eo, Elf *ei) -{ - size_t i, n; - - if (elf_getphdrnum(ei, &n)) { - fprintf(stderr, "elf_getphdrnum() failed: %s\n", elf_errmsg(-1)); - } - - for (i = 0; i < n; i++) { - GElf_Phdr phdr, phdrOut; - - if (gelf_getphdr(ei, i, &phdr) != &phdr) { - fprintf(stderr, "gelf_getphdr() failed for #%d: %s\n", i, elf_errmsg(-1)); - break; - } - - if (gelf_getphdr(eo, i, &phdrOut) != &phdrOut) { - fprintf(stderr, "gelf_getphdr() failed for #%d: %s\n", i, elf_errmsg(-1)); - break; - } - - /* Start of segment */ - if (phdr.p_type == PT_PHDR) { - /* Skip PHDR entries and fix them up later */ - } - else if (phdr.p_offset == 0) { - /* The text segment usually loads the whole ELF header */ - phdrOut.p_offset = 0; - } else { - /* Try to guess the start of the segment */ - Elf_Scn *scn, *scnOut; - GElf_Shdr shdr, shdrOut; - - scn = elfu_firstSectionInSegment(ei, &phdr); - if (!scn) { - fprintf(stderr, "elfu_firstSectionInSegment() failed for segment #%d\n", i); - continue; - } - - if (gelf_getshdr(scn, &shdr) != &shdr) { - fprintf(stderr, "gelf_getshdr() failed: %s\n", elf_errmsg(-1)); - } - - if (phdr.p_offset < shdr.sh_offset) { - fprintf(stderr, "elfu_copySegments2: Segment #%d starts before first contained section.\n", i); - } - - scnOut = elf_getscn(eo, elf_ndxscn(scn)); - if (!scnOut) { - fprintf(stderr, "elf_getscn() failed: %s\n", elf_errmsg(-1)); - } - - if (gelf_getshdr(scnOut, &shdrOut) != &shdrOut) { - fprintf(stderr, "gelf_getshdr() failed: %s\n", elf_errmsg(-1)); - } - - phdrOut.p_offset = shdrOut.sh_offset; - } - - /* File length of segment */ - if (phdr.p_type == PT_PHDR) { - /* Skip PHDR entries and fix them up later */ - } - else if (phdr.p_memsz == 0) { - phdrOut.p_filesz = 0; - phdrOut.p_memsz = 0; - } else { - /* Try to guess the end of the segment */ - Elf_Scn *scn, *scnOut; - GElf_Shdr shdr, shdrOut; - - scn = elfu_lastSectionInSegment(ei, &phdr); - if (!scn) { - fprintf(stderr, "elfu_lastSectionInSegment() failed for segment #%d\n", i); - continue; - } - - if (gelf_getshdr(scn, &shdr) != &shdr) { - fprintf(stderr, "gelf_getshdr() failed: %s\n", elf_errmsg(-1)); - } - - if (phdr.p_offset + phdr.p_filesz > shdr.sh_offset + shdr.sh_size) { - fprintf(stderr, "elfu_copySegments2: Segment #%d ends after last contained section.\n", i); - } - - scnOut = elf_getscn(eo, elf_ndxscn(scn)); - if (!scnOut) { - fprintf(stderr, "elf_getscn() failed: %s\n", elf_errmsg(-1)); - } - - if (gelf_getshdr(scnOut, &shdrOut) != &shdrOut) { - fprintf(stderr, "gelf_getshdr() failed: %s\n", elf_errmsg(-1)); - } - - phdrOut.p_filesz = shdrOut.sh_offset - phdrOut.p_offset; - if (shdrOut.sh_type != SHT_NOBITS) { - phdrOut.p_filesz += shdrOut.sh_size; - } - - phdrOut.p_memsz = shdrOut.sh_offset - phdrOut.p_offset + shdrOut.sh_size; - } - - if (!gelf_update_phdr (eo, i, &phdrOut)) { - fprintf(stderr, "gelf_update_ehdr() failed: %s\n", elf_errmsg(-1)); - } - } - - /* Tell libelf that phdrs have changed */ - elf_flagphdr(eo, ELF_C_SET, ELF_F_DIRTY); -} diff --git a/src/main.c b/src/main.c index 4d41ee4..bf1160d 100644 --- a/src/main.c +++ b/src/main.c @@ -65,24 +65,19 @@ int main(int argc, char **argv) } } else { if (opts.copy) { - elfu_copyElf(hOut.e, hIn.e); - } - } - - /* Generate a memory model of the file */ - if (opts.model) { - ElfuElf *me; + ElfuElf *me; - me = elfu_modelFromElf(hIn.e); + me = elfu_modelFromElf(hIn.e); - if (me) { - printf("Model successfully loaded.\n"); + if (me) { + printf("Model successfully loaded.\n"); - elfu_modelToElf(me, hOut.e); + elfu_modelToElf(me, hOut.e); - printf("Model converted to ELF, ready to be written.\n"); - } else { - printf("Failed to load model.\n"); + printf("Model converted to ELF, ready to be written.\n"); + } else { + printf("Failed to load model.\n"); + } } } diff --git a/src/options.c b/src/options.c index 82b12bc..878127c 100644 --- a/src/options.c +++ b/src/options.c @@ -35,7 +35,6 @@ void parseOptions(CLIOpts *opts, int argc, char **argv) {"print-segments", 0, 0, 10002}, {"print-sections", 0, 0, 10003}, {"copy", 0, 0, 10004}, - {"model", 0, 0, 10005}, {NULL, 0, NULL, 0} }; @@ -60,9 +59,6 @@ void parseOptions(CLIOpts *opts, int argc, char **argv) case 10004: opts->copy = 1; break; - case 10005: - opts->model = 1; - break; case '?': default: goto USAGE;