summaryrefslogtreecommitdiff
path: root/src/model/reladd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/model/reladd.c')
-rw-r--r--src/model/reladd.c54
1 files changed, 52 insertions, 2 deletions
diff --git a/src/model/reladd.c b/src/model/reladd.c
index 2de03dc..632c7c3 100644
--- a/src/model/reladd.c
+++ b/src/model/reladd.c
@@ -6,6 +6,30 @@
#include <libelfu/libelfu.h>
+static int appendData(ElfuScn *ms, void *buf, size_t len)
+{
+ void *newbuf;
+
+ assert(ms);
+ assert(ms->shdr.sh_type != SHT_NOBITS);
+ assert(ms->data.d_buf);
+
+ newbuf = realloc(ms->data.d_buf, ms->shdr.sh_size + len);
+ if (!newbuf) {
+ ELFU_WARN("appendData: malloc() failed for newbuf.\n");
+ return 1;
+ }
+
+ ms->data.d_buf = newbuf;
+ memcpy(newbuf + ms->shdr.sh_size, buf, len);
+ ms->shdr.sh_size += len;
+ ms->data.d_size += len;
+ assert(ms->shdr.sh_size == ms->data.d_size);
+
+ return 0;
+}
+
+
static ElfuScn* insertSection(ElfuElf *me, ElfuElf *mrel, ElfuScn *oldscn)
{
ElfuScn *newscn = NULL;
@@ -54,9 +78,35 @@ static ElfuScn* insertSection(ElfuElf *me, ElfuElf *mrel, ElfuScn *oldscn)
}
}
+
/* Inject name */
- // TODO
- newscn->shdr.sh_name = 0;
+ if (me->shstrtab) {
+ char *newname;
+ size_t newnamelen;
+
+ newnamelen = strlen("reladd") + 1;
+ if (elfu_mScnName(mrel, oldscn)) {
+ newnamelen += strlen(elfu_mScnName(mrel, oldscn));
+ }
+
+ newname = malloc(newnamelen);
+ strcpy(newname, "reladd");
+ strcat(newname, elfu_mScnName(mrel, oldscn));
+
+ if (!newname) {
+ ELFU_WARN("insertSection: malloc() failed for newname. Leaving section name empty.\n");
+ newscn->shdr.sh_name = 0;
+ } else {
+ size_t offset = me->shstrtab->shdr.sh_size;
+
+ if (!appendData(me->shstrtab, newname, newnamelen)) {
+ newscn->shdr.sh_name = offset;
+ }
+
+ free(newname);
+ }
+ }
+
// TODO: Relocate