#include <libelfu/libelfu.h>
-static void modelToPhdrs(ElfuElf *me, Elf *e)
+static void* modelToPhdr(ElfuElf *me, ElfuPhdr *mp, void *aux1, void *aux2)
{
- ElfuPhdr *mp;
- size_t i;
+ size_t *i = (size_t*)aux1;
+ Elf *e = (Elf*)aux2;
- /* Count PHDRs */
- i = 0;
- CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
- i++;
+ if (!gelf_update_phdr (e, *i, &mp->phdr)) {
+ ELFU_WARNELF("gelf_update_phdr");
}
- if (!gelf_newphdr(e, i)) {
- ELFU_WARNELF("gelf_newphdr");
- }
-
- /* Copy PHDRs */
- i = 0;
- CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
- if (!gelf_update_phdr (e, i, &mp->phdr)) {
- ELFU_WARNELF("gelf_update_phdr");
- }
+ *i += 1;
- i++;
- }
+ /* Continue */
+ return NULL;
}
-
static void* modelToSection(ElfuElf *me, ElfuScn *ms, void *aux1, void *aux2)
{
Elf_Scn *scnOut;
/* Data */
- if (ms->data.d_buf) {
+ if (ms->databuf) {
Elf_Data *dataOut = elf_newdata(scnOut);
if (!dataOut) {
ELFU_WARNELF("elf_newdata");
}
- dataOut->d_align = ms->data.d_align;
- dataOut->d_buf = ms->data.d_buf;
- dataOut->d_off = ms->data.d_off;
- dataOut->d_type = ms->data.d_type;
- dataOut->d_size = ms->data.d_size;
- dataOut->d_version = ms->data.d_version;
+ dataOut->d_align = 1;
+ dataOut->d_buf = ms->databuf;
+ dataOut->d_off = 0;
+ dataOut->d_type = ELF_T_BYTE;
+ dataOut->d_size = ms->shdr.sh_size;
+ dataOut->d_version = elf_version(EV_NONE);
}
return NULL;
void elfu_mToElf(ElfuElf *me, Elf *e)
{
+ size_t i = 0;
+
if (me->symtab) {
elfu_mSymtabFlatten(me);
}
/* PHDRs */
- modelToPhdrs(me, e);
+ if (!gelf_newphdr(e, elfu_mPhdrCount(me))) {
+ ELFU_WARNELF("gelf_newphdr");
+ }
+
+ elfu_mPhdrForall(me, modelToPhdr, &i, e);
+ /* Done */
elf_flagelf(e, ELF_C_SET, ELF_F_DIRTY);
}