CIRCLEQ_INSERT_AFTER(&me->scnList, oldscn, newscn, elem);
}
+
+
+
+
+
+/* Insert a name into the section string table (.shstrtab) */
+Elf32_Word elfu_mInsertScnName(ElfuElf *me, char *prefix, char *name)
+{
+ void *newstrlen;
+ char *newstr;
+ void *newbuf;
+
+ assert(me);
+
+ if (!name || !me->shstrtab) {
+ return 0;
+ }
+
+ assert(shstrtab->data.d_buf);
+
+ newstrlen = strlen(name) + 1;
+ if (prefix) {
+ newstrlen += strlen(prefix);
+ }
+
+ newbuf = realloc(me->shstrtab->data.d_buf, me->shstrtab->shdr.sh_size + newstrlen);
+ if (!newbuf) {
+ ELFU_WARN("mInsertScnName: malloc failed for newbuf.\n");
+ free(newstr);
+ return 0;
+ }
+
+ me->shstrtab->data.d_buf = newbuf;
+
+ newstr = &newbuf[me->shstrtab->shdr.sh_size];
+ if (prefix) {
+ strcpy(newstr, prefix);
+ newstr += strlen(prefix);
+ }
+ strcpy(newstr, name);
+
+ me->shstrtab->shdr.sh_size += newstrlen;
+
+ /* Delete section and reinsert it at the end to allow for the larger size */
+ CIRCLEQ_REMOVE(me->scnList, me->shstrtab, elem);
+ CIRCLEQ_INSERT_TAIL(me->scnList, me->shstrtab, elem);
+
+ // TODO: Move this section to the end and move following SHDR/PHDR tables
+}
typedef enum Destsegment {
DS_UNKNOWN,
+ DS_OTHER,
DS_TEXT,
DS_DATA,
} Destsegment;
static Destsegment destsegment(ElfuScn *ms)
{
if (!(ms->shdr.sh_flags & SHF_ALLOC)) {
- return DS_UNKNOWN;
- }
-
- if (!(ms->shdr.sh_flags & SHF_WRITE)
+ return DS_OTHER;
+ } else if (!(ms->shdr.sh_flags & SHF_WRITE)
&& (ms->shdr.sh_flags & SHF_EXECINSTR)) {
return DS_TEXT;
} else if ((ms->shdr.sh_flags & SHF_WRITE)
newscn->shdr.sh_offset = injOffset;
/* Inject name */
- // TODO
- newscn->shdr.sh_name = 0;
+ newscn->shdr.sh_name = elfu_mInsertScnName(me, "RELADD", elfu_mScnName(mrel, ms));
// TODO: Relocate