diff options
author | norly <ny-git@enpas.org> | 2013-06-27 03:20:54 +0100 |
---|---|---|
committer | norly <ny-git@enpas.org> | 2013-06-27 03:20:54 +0100 |
commit | 13b621d944766f19db762c0fd79e359e824a5f83 (patch) | |
tree | b83319b362580e31c929bd6d649769421c1a6ecf /src/libelfu/model/symtab.c | |
parent | c76af00e00b540ce7ddbc44d145bc2e70927a799 (diff) |
Allocate .symtab during Reladd if none presentcleanup
Diffstat (limited to 'src/libelfu/model/symtab.c')
-rw-r--r-- | src/libelfu/model/symtab.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/libelfu/model/symtab.c b/src/libelfu/model/symtab.c index 0cf107b..439c4d3 100644 --- a/src/libelfu/model/symtab.c +++ b/src/libelfu/model/symtab.c @@ -198,3 +198,48 @@ void elfu_mSymtabFlatten(ElfuElf *me) elfu_mLayoutAuto(me); } + + + +void elfu_mSymtabAddGlobalDymtabIfNotPresent(ElfuElf *me) +{ + assert(me); + + if (!me->symtab) { + ElfuScn *symtab; + ElfuScn *strtab; + + symtab = elfu_mScnAlloc(); + assert(symtab); + strtab = elfu_mScnAlloc(); + assert(strtab); + + symtab->linkptr = strtab; + symtab->shdr.sh_entsize = me->elfclass == ELFCLASS32 ? sizeof(Elf32_Sym) : sizeof(Elf64_Sym); + symtab->shdr.sh_addralign = 4; + strtab->shdr.sh_addralign = 1; + symtab->shdr.sh_type = SHT_SYMTAB; + strtab->shdr.sh_type = SHT_STRTAB; + + strtab->databuf = malloc(1); + assert(strtab->databuf); + strtab->databuf[0] = 0; + + CIRCLEQ_INSERT_TAIL(&me->orphanScnList, symtab, elemChildScn); + CIRCLEQ_INSERT_TAIL(&me->orphanScnList, strtab, elemChildScn); + + me->symtab = symtab; + + if (me->shstrtab) { + symtab->shdr.sh_name = me->shstrtab->shdr.sh_size; + if (elfu_mScnAppendData(me->shstrtab, ".symtab", 8)) { + symtab->shdr.sh_name = 0; + } + + strtab->shdr.sh_name = me->shstrtab->shdr.sh_size; + if (elfu_mScnAppendData(me->shstrtab, ".strtab", 8)) { + strtab->shdr.sh_name = 0; + } + } + } +} |