summaryrefslogtreecommitdiffhomepage
path: root/src/object/mdso_objgen_symentry.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/object/mdso_objgen_symentry.c')
-rw-r--r--src/object/mdso_objgen_symentry.c87
1 files changed, 76 insertions, 11 deletions
diff --git a/src/object/mdso_objgen_symentry.c b/src/object/mdso_objgen_symentry.c
index 159f924..674272b 100644
--- a/src/object/mdso_objgen_symentry.c
+++ b/src/object/mdso_objgen_symentry.c
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
@@ -31,6 +31,65 @@ struct mdso_symentry_object {
struct pe_raw_coff_strtbl cst;
};
+static void mdso_obj_write_secoff(unsigned char * ch, uint64_t secoff)
+{
+ *ch++ = '/';
+ mdso_obj_write_dec(ch,secoff);
+}
+
+static void mdso_obj_write_sym_symentry(char * ch, const char * sym)
+{
+ *ch++ = '.';
+
+ for (; *sym; )
+ *ch++ = *sym++;
+
+ memcpy(ch,"_symentry.s",11);
+}
+
+static void mdso_obj_write_sym_symstr(char * ch, const char * sym)
+{
+ memcpy(ch,".symstr_",8);
+ ch = &ch[8];
+
+ for (; *sym; )
+ *ch++ = *sym++;
+}
+
+static void mdso_obj_write_sym_impstr(char * ch, uint32_t uscore, const char * sym)
+{
+ memcpy(ch,"__imp_",6);
+ ch = &ch[6];
+
+ if (uscore)
+ *ch++ = '_';
+
+ for (; *sym; )
+ *ch++ = *sym++;
+}
+
+static void mdso_obj_write_sym_secstr(char * ch, const char * secname, const char * sym)
+{
+ for (; *secname; )
+ *ch++ = *secname++;
+
+ *ch++ = '$';
+
+ for (; *sym; )
+ *ch++ = *sym++;
+}
+
+static void mdso_obj_write_libname(char * ch, const char * secname, const char * sym)
+{
+ for (; *secname; )
+ *ch++ = *secname++;
+
+ *ch++ = '_';
+
+ for (; *sym; )
+ *ch++ = *sym++;
+}
+
int mdso_objgen_symentry(
const struct mdso_driver_ctx * dctx,
const char * sym,
@@ -42,6 +101,7 @@ int mdso_objgen_symentry(
void * mark;
char * ch;
char * strtbl;
+ const char * src;
struct pe_raw_aux_rec_section * aux;
size_t liblen;
uint32_t symlen;
@@ -147,13 +207,13 @@ int mdso_objgen_symentry(
mdso_obj_write_short(syment->hdr.cfh_characteristics,oattr);
/* .dsostrs section header */
- sprintf((char *)syment->sec[0].sh_name,"/%d",stroff_dsostrs);
+ mdso_obj_write_secoff(syment->sec[0].sh_name,stroff_dsostrs);
mdso_obj_write_long(syment->sec[0].sh_size_of_raw_data,symlen+1);
mdso_obj_write_long(syment->sec[0].sh_ptr_to_raw_data,stroff);
mdso_obj_write_long(syment->sec[0].sh_characteristics,sattr);
/* .dsosyms section header */
- sprintf((char *)syment->sec[1].sh_name,"/%d",stroff_dsosyms);
+ mdso_obj_write_secoff(syment->sec[1].sh_name,stroff_dsosyms);
mdso_obj_write_long(syment->sec[1].sh_size_of_raw_data,2*relrva);
mdso_obj_write_long(syment->sec[1].sh_ptr_to_raw_data,refoff);
mdso_obj_write_long(syment->sec[1].sh_ptr_to_relocs,reloff);
@@ -186,7 +246,7 @@ int mdso_objgen_symentry(
mdso_obj_write_long(&symrec[1].cs_name[4],stroff_file);
memcpy(symrec[0].cs_name,".file",5);
- sprintf(&strtbl[stroff_file],".%s_symentry.s",sym);
+ mdso_obj_write_sym_symentry(&strtbl[stroff_file],sym);
symrec += 2;
@@ -196,7 +256,7 @@ int mdso_objgen_symentry(
mdso_obj_write_short(symrec[0].cs_section_number,1);
mdso_obj_write_long(&symrec[0].cs_name[4],stroff_dsostrs);
- sprintf(&strtbl[stroff_dsostrs],"%s$%s",MDSO_STRS_SECTION,sym);
+ mdso_obj_write_sym_secstr(&strtbl[stroff_dsostrs],MDSO_STRS_SECTION,sym);
aux = (struct pe_raw_aux_rec_section *)&symrec[1];
mdso_obj_write_long(aux->aux_size,symlen+1);
@@ -210,7 +270,7 @@ int mdso_objgen_symentry(
mdso_obj_write_short(symrec[0].cs_section_number,2);
mdso_obj_write_long(&symrec[0].cs_name[4],stroff_dsosyms);
- sprintf(&strtbl[stroff_dsosyms],"%s$%s",MDSO_SYMS_SECTION,sym);
+ mdso_obj_write_sym_secstr(&strtbl[stroff_dsosyms],MDSO_SYMS_SECTION,sym);
aux = (struct pe_raw_aux_rec_section *)&symrec[1];
mdso_obj_write_long(aux->aux_size,2*relrva);
@@ -224,7 +284,7 @@ int mdso_objgen_symentry(
mdso_obj_write_short(symrec[0].cs_section_number,1);
mdso_obj_write_long(&symrec[0].cs_name[4],stroff_symstr);
- sprintf(&strtbl[stroff_symstr],".symstr_%s",sym);
+ mdso_obj_write_sym_symstr(&strtbl[stroff_symstr],sym);
symrec += 1;
@@ -234,13 +294,18 @@ int mdso_objgen_symentry(
mdso_obj_write_short(symrec[0].cs_section_number,2);
mdso_obj_write_long(&symrec[0].cs_name[4],stroff_impsym);
- sprintf(&strtbl[stroff_impsym],"__imp_%s%s",uscore ? "_" : "", sym);
+ mdso_obj_write_sym_impstr(&strtbl[stroff_impsym],uscore,sym);
symrec += 1;
/* archive symbol map */
- if (vobj->mapstrs)
- strcpy(vobj->mapstrs,&strtbl[stroff_impsym]);
+ if (vobj->mapstrs) {
+ ch = vobj->mapstrs;
+ src = &strtbl[stroff_impsym];
+
+ for (; *src; )
+ *ch++ = *src++;
+ }
/* coff symbol: .dsometa_libname */
symrec[0].cs_storage_class[0] = PE_IMAGE_SYM_CLASS_EXTERNAL;
@@ -249,7 +314,7 @@ int mdso_objgen_symentry(
mdso_obj_write_short(symrec[0].cs_section_number,0);
mdso_obj_write_long(&symrec[0].cs_name[4],stroff_libname);
- sprintf(&strtbl[stroff_libname],"%s_%s",
+ mdso_obj_write_libname(&strtbl[stroff_libname],
MDSO_META_SECTION,
dctx->cctx->libname);