diff --git a/include/plugin_man.h b/include/plugin_man.h index 86c404f7ec18e6fcf019a91fcfd21e0507245e65..58f464c4b774bae76e8ab2e7c2e040079e0abaad 100644 --- a/include/plugin_man.h +++ b/include/plugin_man.h @@ -40,12 +40,19 @@ class ZiprPluginManager_t : public ZiprPluginInterface_t virtual void CallbackLinkingBegin(); virtual void CallbackLinkingEnd(); + virtual RangeAddress_t PlaceScoopsBegin(const RangeAddress_t max_addr); + virtual RangeAddress_t PlaceScoopsEnd(const RangeAddress_t max_addr); + virtual bool DoesPluginPlop(libIRDB::Instruction_t*,DLFunctionHandle_t&); virtual bool DoesPluginAddress(const Dollop_t *, const RangeAddress_t &, Range_t &, bool &coalesce, DLFunctionHandle_t &); virtual bool DoesPluginRetargetCallback(const RangeAddress_t &, const DollopEntry_t *, RangeAddress_t &, DLFunctionHandle_t &) ; virtual bool DoesPluginRetargetPin(const RangeAddress_t &, const Dollop_t *, RangeAddress_t &, DLFunctionHandle_t &) ; + + + + private: void open_plugins diff --git a/src/elfwrite.cpp b/src/elfwrite.cpp index 32c1c70785b68f014ee4cf15084e4c10700df06a..006fa9ff5c8edaa67295e939369af4112b9752d8 100644 --- a/src/elfwrite.cpp +++ b/src/elfwrite.cpp @@ -453,7 +453,7 @@ void ElfWriterImpl<T_Elf_Ehdr,T_Elf_Phdr,T_Elf_Addr>::update_phdr_for_scoop_sec {PT_DYNAMIC, ".dynamic"}, {PT_NOTE, ".note.ABI-tag"}, {PT_GNU_EH_FRAME, ".eh_frame_hdr"}, - {PT_GNU_RELRO, ".init_array"} +// {PT_GNU_RELRO, ".init_array"} }; // check if a type of header listed above. @@ -528,13 +528,17 @@ bool ElfWriterImpl<T_Elf_Ehdr,T_Elf_Phdr,T_Elf_Addr>::CreateNewPhdrs_internal( // go through orig. phdrs any copy any that aren't of type pt_load or pt_hdr for(unsigned int i=0;i<phdrs.size();i++) { - // skip any load sections, the irdb tells us what to load. + // skip any load headers, the irdb tells us what to load. if(phdrs[i].p_type == PT_LOAD) continue; - // skip phdr section. + // skip phdr header. if(phdrs[i].p_type == PT_PHDR) continue; + + // skip RELRO header, we're relocating stuff and wil have to create 1 or more. + if(phdrs[i].p_type == PT_GNU_RELRO) + continue; T_Elf_Phdr newphdr=phdrs[i]; diff --git a/src/plugin_man.cpp b/src/plugin_man.cpp index ee5ed1b373a880e0581913c4fe947de449aba75d..8f928bae07ac1518630c97ef2e5cde02f0a2b5d7 100644 --- a/src/plugin_man.cpp +++ b/src/plugin_man.cpp @@ -52,6 +52,13 @@ for(DLFunctionHandleSet_t::iterator it=m_handleList.begin(); it!=m_handleList.en ZiprPluginInterface_t* zpi=(ZiprPluginInterface_t*)*it; \ zpi->func(); \ } + +#define dispatch_to_with_var(func, var) \ +for(DLFunctionHandleSet_t::iterator it=m_handleList.begin(); it!=m_handleList.end();++it) \ +{ \ + ZiprPluginInterface_t* zpi=(ZiprPluginInterface_t*)*it; \ + var=zpi->func(var); \ +} void ZiprPluginManager_t::PinningBegin() { @@ -81,6 +88,21 @@ void ZiprPluginManager_t::CallbackLinkingEnd() dispatch_to(CallbackLinkingEnd); } +RangeAddress_t ZiprPluginManager_t::PlaceScoopsBegin(const RangeAddress_t max_addr) +{ + RangeAddress_t ret=max_addr; + dispatch_to_with_var(PlaceScoopsBegin,ret); + return ret; +} + +RangeAddress_t ZiprPluginManager_t::PlaceScoopsEnd(const RangeAddress_t max_addr) +{ + RangeAddress_t ret=max_addr; + dispatch_to_with_var(PlaceScoopsEnd,ret); + return ret; +} + + bool ZiprPluginManager_t::DoesPluginAddress(const Dollop_t *dollop, const RangeAddress_t &source, Range_t &place, bool &coalesce, DLFunctionHandle_t &placer) { DLFunctionHandleSet_t::iterator it=m_handleList.begin(); diff --git a/src/zipr.cpp b/src/zipr.cpp index b465283ac94db9c22bb2bafce66c9c6e4e825e1a..0b16c33e4b62cf955d00ce392ae11f610a40cfdb 100644 --- a/src/zipr.cpp +++ b/src/zipr.cpp @@ -483,7 +483,7 @@ void ZiprImpl_t::CreateExecutableScoops(const std::map<RangeAddress_t, int> &ord // zero init is OK, after zipring we'll update with the right bytes. string text_contents; text_contents.resize(text_end->GetVirtualOffset() - text_start->GetVirtualOffset()); - DataScoop_t* text_scoop=new DataScoop_t(BaseObj_t::NOT_IN_DATABASE, string(".zipr_text_")+to_string(count++), text_start, text_end, NULL, 5, text_contents); + DataScoop_t* text_scoop=new DataScoop_t(BaseObj_t::NOT_IN_DATABASE, string(".zipr_text_")+to_string(count++), text_start, text_end, NULL, 5, false, text_contents); m_firp->GetDataScoops().insert(text_scoop); cout<<"Adding scoop "<<text_scoop->GetName()<<hex<<" at "<<hex<<text_start->GetVirtualOffset()<<" - "<<text_end->GetVirtualOffset()<<endl; @@ -494,6 +494,8 @@ void ZiprImpl_t::CreateExecutableScoops(const std::map<RangeAddress_t, int> &ord RangeAddress_t ZiprImpl_t::PlaceUnplacedScoops(RangeAddress_t max_addr) { + max_addr=plugman.PlaceScoopsBegin(max_addr); + map<int,DataScoopSet_t> scoops_by_perms; for( @@ -508,9 +510,6 @@ RangeAddress_t ZiprImpl_t::PlaceUnplacedScoops(RangeAddress_t max_addr) if(scoop->GetStart()->GetVirtualOffset()==0) scoops_by_perms[scoop->getRawPerms()].insert(scoop); } - - - for(map<int,DataScoopSet_t>::iterator pit=scoops_by_perms.begin(); pit!=scoops_by_perms.end(); ++pit) { @@ -533,6 +532,7 @@ RangeAddress_t ZiprImpl_t::PlaceUnplacedScoops(RangeAddress_t max_addr) } + max_addr=plugman.PlaceScoopsEnd(max_addr); return max_addr; } @@ -2837,7 +2837,7 @@ void ZiprImpl_t::OutputBinaryFile(const string &name) m_firp->GetAddresses().insert(textra_end); string textra_contents; textra_contents.resize(end_of_new_space-start_of_new_space); - DataScoop_t* textra_scoop=new DataScoop_t(BaseObj_t::NOT_IN_DATABASE, ".textra", textra_start, textra_end, NULL, 5, textra_contents); + DataScoop_t* textra_scoop=new DataScoop_t(BaseObj_t::NOT_IN_DATABASE, ".textra", textra_start, textra_end, NULL, 5, false, textra_contents); m_firp->GetDataScoops().insert(textra_scoop);