summaryrefslogtreecommitdiff
path: root/src/libelfu/model/symtab.c
diff options
context:
space:
mode:
authornorly <ny-git@enpas.org>2013-06-27 03:20:54 +0100
committernorly <ny-git@enpas.org>2013-06-27 03:20:54 +0100
commit13b621d944766f19db762c0fd79e359e824a5f83 (patch)
treeb83319b362580e31c929bd6d649769421c1a6ecf /src/libelfu/model/symtab.c
parentc76af00e00b540ce7ddbc44d145bc2e70927a799 (diff)
Allocate .symtab during Reladd if none presentcleanup
Diffstat (limited to 'src/libelfu/model/symtab.c')
-rw-r--r--src/libelfu/model/symtab.c45
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;
+ }
+ }
+ }
+}