summaryrefslogtreecommitdiff
path: root/src/libelfu/modelops/fromFile.c
diff options
context:
space:
mode:
authornorly <ny-git@enpas.org>2013-06-20 19:02:44 +0100
committernorly <ny-git@enpas.org>2013-06-20 22:10:25 +0100
commit70b271e345debda7437c18f86c0f715a42a8267a (patch)
tree5bb5a22f1fff16036b4ba955e86dc5cc55e35245 /src/libelfu/modelops/fromFile.c
parentb70b3ff9b1679bb1e0a215b7acd9b6d55497a46b (diff)
Clean up code using ElfuScn
Diffstat (limited to 'src/libelfu/modelops/fromFile.c')
-rw-r--r--src/libelfu/modelops/fromFile.c53
1 files changed, 15 insertions, 38 deletions
diff --git a/src/libelfu/modelops/fromFile.c b/src/libelfu/modelops/fromFile.c
index dd8b462..9c25e29 100644
--- a/src/libelfu/modelops/fromFile.c
+++ b/src/libelfu/modelops/fromFile.c
@@ -11,13 +11,13 @@ static void parseSymtab(ElfuElf *me, ElfuScn *ms, ElfuScn**origScnArr)
size_t i;
assert(ms);
- assert(ms->data.d_buf);
+ assert(ms->databuf);
assert(origScnArr);
/* Parse symbols from their elfclass-specific format */
if (me->elfclass == ELFCLASS32) {
for (i = 1; (i + 1) * sizeof(Elf32_Sym) <= ms->shdr.sh_size; i++) {
- Elf32_Sym *cursym = ((Elf32_Sym*)ms->data.d_buf) + i;
+ Elf32_Sym *cursym = ((Elf32_Sym*)ms->databuf) + i;
ElfuSym *newsym = malloc(sizeof(*sym));
assert(newsym);
@@ -29,13 +29,11 @@ static void parseSymtab(ElfuElf *me, ElfuScn *ms, ElfuScn**origScnArr)
newsym->other = cursym->st_other;
newsym->shndx = cursym->st_shndx;
-
-
CIRCLEQ_INSERT_TAIL(&ms->symtab.syms, newsym, elem);
}
} else if (me->elfclass == ELFCLASS64) {
for (i = 1; (i + 1) * sizeof(Elf64_Sym) <= ms->shdr.sh_size; i++) {
- Elf64_Sym *cursym = ((Elf64_Sym*)ms->data.d_buf) + i;
+ Elf64_Sym *cursym = ((Elf64_Sym*)ms->databuf) + i;
ElfuSym *newsym = malloc(sizeof(*sym));
assert(newsym);
@@ -47,8 +45,6 @@ static void parseSymtab(ElfuElf *me, ElfuScn *ms, ElfuScn**origScnArr)
newsym->other = cursym->st_other;
newsym->shndx = cursym->st_shndx;
-
-
CIRCLEQ_INSERT_TAIL(&ms->symtab.syms, newsym, elem);
}
} else {
@@ -77,11 +73,11 @@ static void parseReltab32(ElfuScn *ms)
size_t i;
assert(ms);
- assert(ms->data.d_buf);
+ assert(ms->databuf);
for (i = 0; (i + 1) * sizeof(Elf32_Rel) <= ms->shdr.sh_size; i++) {
- Elf32_Rel *currel = &(((Elf32_Rel*)ms->data.d_buf)[i]);
+ Elf32_Rel *currel = &(((Elf32_Rel*)ms->databuf)[i]);
ElfuRel *rel;
rel = malloc(sizeof(*rel));
@@ -103,11 +99,11 @@ static void parseRelatab64(ElfuScn *ms)
size_t i;
assert(ms);
- assert(ms->data.d_buf);
+ assert(ms->databuf);
for (i = 0; (i + 1) * sizeof(Elf64_Rela) <= ms->shdr.sh_size; i++) {
- Elf64_Rela *currel = &(((Elf64_Rela*)ms->data.d_buf)[i]);
+ Elf64_Rela *currel = &(((Elf64_Rela*)ms->databuf)[i]);
ElfuRel *rel;
rel = malloc(sizeof(*rel));
@@ -210,29 +206,20 @@ static ElfuScn* modelFromSection(Elf_Scn *scn)
assert(scn);
- ms = malloc(sizeof(ElfuScn));
+ ms = elfu_mScnAlloc();
if (!ms) {
- ELFU_WARN("modelFromSection: malloc() failed for ElfuScn.\n");
goto ERROR;
}
-
+ /* Copy SHDR */
assert(gelf_getshdr(scn, &ms->shdr) == &ms->shdr);
-
/* Copy each data part in source segment */
- ms->data.d_align = 1;
- ms->data.d_buf = NULL;
- ms->data.d_off = 0;
- ms->data.d_type = ELF_T_BYTE;
- ms->data.d_size = ms->shdr.sh_size;
- ms->data.d_version = elf_version(EV_NONE);
- if (ms->shdr.sh_type != SHT_NOBITS
- && ms->shdr.sh_size > 0) {
+ if (SCNFILESIZE(&ms->shdr) > 0) {
Elf_Data *data;
- ms->data.d_buf = malloc(ms->shdr.sh_size);
- if (!ms->data.d_buf) {
+ ms->databuf = malloc(ms->shdr.sh_size);
+ if (!ms->databuf) {
ELFU_WARN("modelFromSection: malloc() failed for data buffer (%x bytes).\n", (unsigned)ms->shdr.sh_size);
goto ERROR;
}
@@ -241,30 +228,20 @@ static ElfuScn* modelFromSection(Elf_Scn *scn)
data = elf_rawdata(scn, NULL);
assert(data);
- ms->data.d_align = data->d_align;
- ms->data.d_type = data->d_type;
- ms->data.d_version = data->d_version;
+ /* elf_rawdata() always returns ELF_T_BYTE */
+ assert(data->d_type == ELF_T_BYTE);
while (data) {
if (data->d_off + data->d_size > ms->shdr.sh_size) {
ELFU_WARN("modelFromSection: libelf delivered a bogus data blob. Skipping\n");
} else {
- memcpy((char*)ms->data.d_buf + data->d_off, data->d_buf, data->d_size);
+ memcpy((char*)ms->databuf + data->d_off, data->d_buf, data->d_size);
}
data = elf_rawdata(scn, data);
}
}
- ms->linkptr = NULL;
- ms->infoptr = NULL;
-
- ms->oldptr = NULL;
-
- CIRCLEQ_INIT(&ms->symtab.syms);
- CIRCLEQ_INIT(&ms->reltab.rels);
-
-
return ms;
ERROR: