diff options
Diffstat (limited to 'src/object/mdso_objgen_symentry.c')
-rw-r--r-- | src/object/mdso_objgen_symentry.c | 87 |
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); |