<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
< html xmlns = "http://www.w3.org/1999/xhtml" >
< head >
< meta http-equiv = "Content-Type" content = "text/xhtml;charset=UTF-8" / >
< meta http-equiv = "X-UA-Compatible" content = "IE=11" / >
< meta name = "generator" content = "Doxygen 1.9.3" / >
< meta name = "viewport" content = "width=device-width, initial-scale=1" / >
< title > Theodosius: theo::decomp::routine_t Class Reference< / title >
< link href = "../../tabs.css" rel = "stylesheet" type = "text/css" / >
< script type = "text/javascript" src = "../../jquery.js" > < / script >
< script type = "text/javascript" src = "../../dynsections.js" > < / script >
< link href = "../../search/search.css" rel = "stylesheet" type = "text/css" / >
< script type = "text/javascript" src = "../../search/searchdata.js" > < / script >
< script type = "text/javascript" src = "../../search/search.js" > < / script >
< link href = "../../doxygen.css" rel = "stylesheet" type = "text/css" / >
< / head >
< body >
< div id = "top" > <!-- do not remove this div, it is closed by doxygen! -->
< div id = "titlearea" >
< table cellspacing = "0" cellpadding = "0" >
< tbody >
< tr id = "projectrow" >
< td id = "projectlogo" > < img alt = "Logo" src = "../../icon.png" / > < / td >
< td id = "projectalign" >
< div id = "projectname" > Theodosius< span id = "projectnumber" >   v3.0< / span >
< / div >
< div id = "projectbrief" > Jit linker, symbol mapper, and obfuscator< / div >
< / td >
< / tr >
< / tbody >
< / table >
< / div >
<!-- end header part -->
<!-- Generated by Doxygen 1.9.3 -->
< script type = "text/javascript" >
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699& dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "../../search",'Search','.html');
/* @license-end */
< / script >
< script type = "text/javascript" src = "../../menudata.js" > < / script >
< script type = "text/javascript" src = "../../menu.js" > < / script >
< script type = "text/javascript" >
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699& dn=expat.txt MIT */
$(function() {
initMenu('../../',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
< / script >
< div id = "main-nav" > < / div >
<!-- window showing the filter options -->
< div id = "MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
< / div >
<!-- iframe showing the search results (closed by default) -->
< div id = "MSearchResultsWindow" >
< iframe src = "javascript:void(0)" frameborder = "0"
name="MSearchResults" id="MSearchResults">
< / iframe >
< / div >
< div id = "nav-path" class = "navpath" >
< ul >
< li class = "navelem" > < a class = "el" href = "../../da/de6/namespacetheo.html" > theo< / a > < / li > < li class = "navelem" > < a class = "el" href = "../../d9/dbd/namespacetheo_1_1decomp.html" > decomp< / a > < / li > < li class = "navelem" > < a class = "el" href = "../../df/db4/classtheo_1_1decomp_1_1routine__t.html" > routine_t< / a > < / li > < / ul >
< / div >
< / div > <!-- top -->
< div class = "header" >
< div class = "summary" >
< a href = "#pub-methods" > Public Member Functions< / a > < / div >
< div class = "headertitle" > < div class = "title" > theo::decomp::routine_t Class Reference< / div > < / div >
< / div > <!-- header -->
< div class = "contents" >
< p > the routine class which is responsible for creating symbols for routines. if the routine is located inside a section with the name ".split" it will break functions into instruction symbols.
< a href = "../../df/db4/classtheo_1_1decomp_1_1routine__t.html#details" > More...< / a > < / p >
< p > < code > #include " < a class = "el" href = "../../de/df5/routine_8hpp_source.html" > routine.hpp< / a > " < / code > < / p >
< table class = "memberdecls" >
< tr class = "heading" > < td colspan = "2" > < h2 class = "groupheader" > < a id = "pub-methods" name = "pub-methods" > < / a >
Public Member Functions< / h2 > < / td > < / tr >
< tr class = "memitem:ab9f0693c5ec50954d953b28bebe4426b" > < td class = "memItemLeft" align = "right" valign = "top" >   < / td > < td class = "memItemRight" valign = "bottom" > < a class = "el" href = "../../df/db4/classtheo_1_1decomp_1_1routine__t.html#ab9f0693c5ec50954d953b28bebe4426b" > routine_t< / a > (coff::symbol_t *sym, coff::image_t *img, coff::section_header_t *< a class = "el" href = "../../df/db4/classtheo_1_1decomp_1_1routine__t.html#ad3a75cb97abbcd9b282772401b256f36" > scn< / a > , std::vector< std::uint8_t > & fn, < a class = "el" href = "../../d9/dbd/namespacetheo_1_1decomp.html#af96177687d0ad683c5897d8fa01135f9" > sym_type_t< / a > dcmp_type)< / td > < / tr >
< tr class = "memdesc:ab9f0693c5ec50954d953b28bebe4426b" > < td class = "mdescLeft" >   < / td > < td class = "mdescRight" > the explicit constructor for < a class = "el" href = "../../df/db4/classtheo_1_1decomp_1_1routine__t.html" title = "the routine class which is responsible for creating symbols for routines. if the routine is located i..." > routine_t< / a > . < a href = "../../df/db4/classtheo_1_1decomp_1_1routine__t.html#ab9f0693c5ec50954d953b28bebe4426b" > More...< / a > < br / > < / td > < / tr >
< tr class = "separator:ab9f0693c5ec50954d953b28bebe4426b" > < td class = "memSeparator" colspan = "2" >   < / td > < / tr >
< tr class = "memitem:a1f790bd144badc71d6c4942cac8fc4e8" > < td class = "memItemLeft" align = "right" valign = "top" > std::vector< < a class = "el" href = "../../d9/dd5/classtheo_1_1decomp_1_1symbol__t.html" > decomp::symbol_t< / a > >   < / td > < td class = "memItemRight" valign = "bottom" > < a class = "el" href = "../../df/db4/classtheo_1_1decomp_1_1routine__t.html#a1f790bd144badc71d6c4942cac8fc4e8" > decompose< / a > ()< / td > < / tr >
< tr class = "memdesc:a1f790bd144badc71d6c4942cac8fc4e8" > < td class = "mdescLeft" >   < / td > < td class = "mdescRight" > decompose the function into symbol(s). < a href = "../../df/db4/classtheo_1_1decomp_1_1routine__t.html#a1f790bd144badc71d6c4942cac8fc4e8" > More...< / a > < br / > < / td > < / tr >
< tr class = "separator:a1f790bd144badc71d6c4942cac8fc4e8" > < td class = "memSeparator" colspan = "2" >   < / td > < / tr >
< tr class = "memitem:ad3a75cb97abbcd9b282772401b256f36" > < td class = "memItemLeft" align = "right" valign = "top" > coff::section_header_t *  < / td > < td class = "memItemRight" valign = "bottom" > < a class = "el" href = "../../df/db4/classtheo_1_1decomp_1_1routine__t.html#ad3a75cb97abbcd9b282772401b256f36" > scn< / a > ()< / td > < / tr >
< tr class = "memdesc:ad3a75cb97abbcd9b282772401b256f36" > < td class = "mdescLeft" >   < / td > < td class = "mdescRight" > gets the section header of the section in which the symbol is located in. < a href = "../../df/db4/classtheo_1_1decomp_1_1routine__t.html#ad3a75cb97abbcd9b282772401b256f36" > More...< / a > < br / > < / td > < / tr >
< tr class = "separator:ad3a75cb97abbcd9b282772401b256f36" > < td class = "memSeparator" colspan = "2" >   < / td > < / tr >
< tr class = "memitem:a605a2be669a10a5a45325a5dca04401a" > < td class = "memItemLeft" align = "right" valign = "top" > std::vector< std::uint8_t >   < / td > < td class = "memItemRight" valign = "bottom" > < a class = "el" href = "../../df/db4/classtheo_1_1decomp_1_1routine__t.html#a605a2be669a10a5a45325a5dca04401a" > data< / a > ()< / td > < / tr >
< tr class = "memdesc:a605a2be669a10a5a45325a5dca04401a" > < td class = "mdescLeft" >   < / td > < td class = "mdescRight" > gets the function bytes. < a href = "../../df/db4/classtheo_1_1decomp_1_1routine__t.html#a605a2be669a10a5a45325a5dca04401a" > More...< / a > < br / > < / td > < / tr >
< tr class = "separator:a605a2be669a10a5a45325a5dca04401a" > < td class = "memSeparator" colspan = "2" >   < / td > < / tr >
< / table >
< a name = "details" id = "details" > < / a > < h2 class = "groupheader" > Detailed Description< / h2 >
< div class = "textblock" > < p > the routine class which is responsible for creating symbols for routines. if the routine is located inside a section with the name ".split" it will break functions into instruction symbols. < / p >
< p class = "definition" > Definition at line < a class = "el" href = "../../de/df5/routine_8hpp_source.html#l00053" > 53< / a > of file < a class = "el" href = "../../de/df5/routine_8hpp_source.html" > routine.hpp< / a > .< / p >
< / div > < h2 class = "groupheader" > Constructor & Destructor Documentation< / h2 >
< a id = "ab9f0693c5ec50954d953b28bebe4426b" name = "ab9f0693c5ec50954d953b28bebe4426b" > < / a >
< h2 class = "memtitle" > < span class = "permalink" > < a href = "#ab9f0693c5ec50954d953b28bebe4426b" > ◆ < / a > < / span > routine_t()< / h2 >
< div class = "memitem" >
< div class = "memproto" >
< table class = "mlabels" >
< tr >
< td class = "mlabels-left" >
< table class = "memname" >
< tr >
< td class = "memname" > theo::decomp::routine_t::routine_t < / td >
< td > (< / td >
< td class = "paramtype" > coff::symbol_t *  < / td >
< td class = "paramname" > < em > sym< / em > , < / td >
< / tr >
< tr >
< td class = "paramkey" > < / td >
< td > < / td >
< td class = "paramtype" > coff::image_t *  < / td >
< td class = "paramname" > < em > img< / em > , < / td >
< / tr >
< tr >
< td class = "paramkey" > < / td >
< td > < / td >
< td class = "paramtype" > coff::section_header_t *  < / td >
< td class = "paramname" > < em > scn< / em > , < / td >
< / tr >
< tr >
< td class = "paramkey" > < / td >
< td > < / td >
< td class = "paramtype" > std::vector< std::uint8_t > &   < / td >
< td class = "paramname" > < em > fn< / em > , < / td >
< / tr >
< tr >
< td class = "paramkey" > < / td >
< td > < / td >
< td class = "paramtype" > < a class = "el" href = "../../d9/dbd/namespacetheo_1_1decomp.html#af96177687d0ad683c5897d8fa01135f9" > sym_type_t< / a >   < / td >
< td class = "paramname" > < em > dcmp_type< / em >   < / td >
< / tr >
< tr >
< td > < / td >
< td > )< / td >
< td > < / td > < td > < / td >
< / tr >
< / table >
< / td >
< td class = "mlabels-right" >
< span class = "mlabels" > < span class = "mlabel" > explicit< / span > < / span > < / td >
< / tr >
< / table >
< / div > < div class = "memdoc" >
< p > the explicit constructor for < a class = "el" href = "../../df/db4/classtheo_1_1decomp_1_1routine__t.html" title = "the routine class which is responsible for creating symbols for routines. if the routine is located i..." > routine_t< / a > . < / p >
< dl class = "params" > < dt > Parameters< / dt > < dd >
< table class = "params" >
< tr > < td class = "paramname" > sym< / td > < td > the coff symbol for the routine.< / td > < / tr >
< tr > < td class = "paramname" > img< / td > < td > the coff image which contains the symbol.< / td > < / tr >
< tr > < td class = "paramname" > scn< / td > < td > the section header of the section that contains the symbol.< / td > < / tr >
< tr > < td class = "paramname" > fn< / td > < td > the data (bytes) of the function.< / td > < / tr >
< tr > < td class = "paramname" > dcmp_type< / td > < td > the type of decomp to do. if this is sym_type_t::function then this class wont split the function up into individual instructions.< / td > < / tr >
< / table >
< / dd >
< / dl >
< p class = "definition" > Definition at line < a class = "el" href = "../../d2/dbb/routine_8cpp_source.html#l00034" > 34< / a > of file < a class = "el" href = "../../d2/dbb/routine_8cpp_source.html" > routine.cpp< / a > .< / p >
< div class = "fragment" > < div class = "line" > < span class = "lineno" > 39< / span > : m_img(img), m_scn(< a class = "code hl_function" href = "../../df/db4/classtheo_1_1decomp_1_1routine__t.html#ad3a75cb97abbcd9b282772401b256f36" title = "gets the section header of the section in which the symbol is located in." > scn< / a > ), m_data(fn), m_dcmp_type(dcmp_type), m_sym(sym) {}< / div >
< / div > <!-- fragment -->
< / div >
< / div >
< h2 class = "groupheader" > Member Function Documentation< / h2 >
< a id = "a605a2be669a10a5a45325a5dca04401a" name = "a605a2be669a10a5a45325a5dca04401a" > < / a >
< h2 class = "memtitle" > < span class = "permalink" > < a href = "#a605a2be669a10a5a45325a5dca04401a" > ◆ < / a > < / span > data()< / h2 >
< div class = "memitem" >
< div class = "memproto" >
< table class = "memname" >
< tr >
< td class = "memname" > std::vector< std::uint8_t > theo::decomp::routine_t::data < / td >
< td > (< / td >
< td class = "paramname" > < / td > < td > )< / td >
< td > < / td >
< / tr >
< / table >
< / div > < div class = "memdoc" >
< p > gets the function bytes. < / p >
< dl class = "section return" > < dt > Returns< / dt > < dd > the function bytes.< / dd > < / dl >
< p class = "definition" > Definition at line < a class = "el" href = "../../d2/dbb/routine_8cpp_source.html#l00172" > 172< / a > of file < a class = "el" href = "../../d2/dbb/routine_8cpp_source.html" > routine.cpp< / a > .< / p >
< div class = "fragment" > < div class = "line" > < span class = "lineno" > 172< / span > {< / div >
< div class = "line" > < span class = "lineno" > 173< / span > < span class = "keywordflow" > return< / span > m_data;< / div >
< div class = "line" > < span class = "lineno" > 174< / span > }< / div >
< / div > <!-- fragment -->
< p class = "reference" > Referenced by < a class = "el" href = "../../d2/dbb/routine_8cpp_source.html#l00041" > decompose()< / a > .< / p >
< / div >
< / div >
< a id = "a1f790bd144badc71d6c4942cac8fc4e8" name = "a1f790bd144badc71d6c4942cac8fc4e8" > < / a >
< h2 class = "memtitle" > < span class = "permalink" > < a href = "#a1f790bd144badc71d6c4942cac8fc4e8" > ◆ < / a > < / span > decompose()< / h2 >
< div class = "memitem" >
< div class = "memproto" >
< table class = "memname" >
< tr >
< td class = "memname" > std::vector< < a class = "el" href = "../../d9/dd5/classtheo_1_1decomp_1_1symbol__t.html" > decomp::symbol_t< / a > > theo::decomp::routine_t::decompose < / td >
< td > (< / td >
< td class = "paramname" > < / td > < td > )< / td >
< td > < / td >
< / tr >
< / table >
< / div > < div class = "memdoc" >
< p > decompose the function into symbol(s). < / p >
< dl class = "section return" > < dt > Returns< / dt > < dd > symbol(s) of the function.< / dd > < / dl >
< p class = "definition" > Definition at line < a class = "el" href = "../../d2/dbb/routine_8cpp_source.html#l00041" > 41< / a > of file < a class = "el" href = "../../d2/dbb/routine_8cpp_source.html" > routine.cpp< / a > .< / p >
< div class = "fragment" > < div class = "line" > < span class = "lineno" > 41< / span > {< / div >
< div class = "line" > < span class = "lineno" > 42< / span > std::vector< decomp::symbol_t> result;< / div >
< div class = "line" > < span class = "lineno" > 43< / span > < / div >
< div class = "line" > < span class = "lineno" > 44< / span > < span class = "keywordflow" > switch< / span > (m_dcmp_type) {< / div >
< div class = "line" > < span class = "lineno" > 45< / span > < span class = "keywordflow" > case< / span > < a class = "code hl_enumvalue" href = "../../d9/dbd/namespacetheo_1_1decomp.html#af96177687d0ad683c5897d8fa01135f9acf6baee49c2ddb7e89724231bbd75d4a" > function< / a > : {< / div >
< div class = "line" > < span class = "lineno" > 46< / span > std::vector< recomp::reloc_t> relocs;< / div >
< div class = "line" > < span class = "lineno" > 47< / span > < span class = "keyword" > auto< / span > scn_relocs = < span class = "keyword" > reinterpret_cast< < / span > coff::reloc_t*< span class = "keyword" > > < / span > (< / div >
< div class = "line" > < span class = "lineno" > 48< / span > m_scn-> ptr_relocs + < span class = "keyword" > reinterpret_cast< < / span > std::uint8_t*< span class = "keyword" > > < / span > (m_img));< / div >
< div class = "line" > < span class = "lineno" > 49< / span > < / div >
< div class = "line" > < span class = "lineno" > 50< / span > < span class = "keywordflow" > for< / span > (< span class = "keyword" > auto< / span > idx = 0u; idx < m_scn-> num_relocs; ++idx) {< / div >
< div class = "line" > < span class = "lineno" > 51< / span > < span class = "keyword" > auto< / span > scn_reloc = & scn_relocs[idx];< / div >
< div class = "line" > < span class = "lineno" > 52< / span > < span class = "comment" > // if the reloc is in the current function...< / span > < / div >
< div class = "line" > < span class = "lineno" > 53< / span > < span class = "keywordflow" > if< / span > (scn_reloc-> virtual_address > = m_sym-> value & & < / div >
< div class = "line" > < span class = "lineno" > 54< / span > scn_reloc-> virtual_address < m_sym-> value + m_data.size()) {< / div >
< div class = "line" > < span class = "lineno" > 55< / span > < span class = "keyword" > auto< / span > sym_reloc = m_img-> get_symbol(scn_relocs[idx].symbol_index);< / div >
< div class = "line" > < span class = "lineno" > 56< / span > < span class = "keyword" > auto< / span > sym_name = < a class = "code hl_function" href = "../../d9/dd5/classtheo_1_1decomp_1_1symbol__t.html#a7c6dee036291ded334aa10d89293fc2a" title = "gets the name of the symbol." > symbol_t::name< / a > (m_img, sym_reloc);< / div >
< div class = "line" > < span class = "lineno" > 57< / span > < span class = "keyword" > auto< / span > sym_hash = < a class = "code hl_function" href = "../../d9/dd5/classtheo_1_1decomp_1_1symbol__t.html#a8695d75670cc4d61d275464e9109ff06" title = "gets the hash of the symbol name." > decomp::symbol_t::hash< / a > (sym_name.data());< / div >
< div class = "line" > < span class = "lineno" > 58< / span > relocs.push_back(< / div >
< div class = "line" > < span class = "lineno" > 59< / span > recomp::reloc_t(scn_reloc-> virtual_address - m_sym-> value,< / div >
< div class = "line" > < span class = "lineno" > 60< / span > sym_hash, sym_name.data()));< / div >
< div class = "line" > < span class = "lineno" > 61< / span > }< / div >
< div class = "line" > < span class = "lineno" > 62< / span > }< / div >
< div class = "line" > < span class = "lineno" > 63< / span > < / div >
< div class = "line" > < span class = "lineno" > 64< / span > result.push_back(decomp::symbol_t(< / div >
< div class = "line" > < span class = "lineno" > 65< / span > m_img, < a class = "code hl_function" href = "../../d9/dd5/classtheo_1_1decomp_1_1symbol__t.html#a7c6dee036291ded334aa10d89293fc2a" title = "gets the name of the symbol." > symbol_t::name< / a > (m_img, m_sym).< a class = "code hl_function" href = "../../df/db4/classtheo_1_1decomp_1_1routine__t.html#a605a2be669a10a5a45325a5dca04401a" title = "gets the function bytes." > data< / a > (), m_sym-> value, m_data,< / div >
< div class = "line" > < span class = "lineno" > 66< / span > m_scn, m_sym, relocs, < a class = "code hl_enumvalue" href = "../../d9/dbd/namespacetheo_1_1decomp.html#af96177687d0ad683c5897d8fa01135f9acf6baee49c2ddb7e89724231bbd75d4a" > sym_type_t::function< / a > ));< / div >
< div class = "line" > < span class = "lineno" > 67< / span > < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < span class = "lineno" > 68< / span > }< / div >
< div class = "line" > < span class = "lineno" > 69< / span > < span class = "keywordflow" > case< / span > < a class = "code hl_enumvalue" href = "../../d9/dbd/namespacetheo_1_1decomp.html#af96177687d0ad683c5897d8fa01135f9a4842f4c175b1ec87fc82ef3757d3a0e9" > instruction< / a > : {< / div >
< div class = "line" > < span class = "lineno" > 70< / span > std::uint32_t offset = {};< / div >
< div class = "line" > < span class = "lineno" > 71< / span > xed_error_enum_t err;< / div >
< div class = "line" > < span class = "lineno" > 72< / span > < / div >
< div class = "line" > < span class = "lineno" > 73< / span > xed_decoded_inst_t instr;< / div >
< div class = "line" > < span class = "lineno" > 74< / span > xed_state_t istate{XED_MACHINE_MODE_LONG_64, XED_ADDRESS_WIDTH_64b};< / div >
< div class = "line" > < span class = "lineno" > 75< / span > xed_decoded_inst_zero_set_mode(& instr, & istate);< / div >
< div class = "line" > < span class = "lineno" > 76< / span > < / div >
< div class = "line" > < span class = "lineno" > 77< / span > < span class = "comment" > // keep looping over the section, lower the number of bytes each time...< / span > < / div >
< div class = "line" > < span class = "lineno" > 78< / span > < span class = "comment" > //< / span > < / div >
< div class = "line" > < span class = "lineno" > 79< / span > < span class = "keywordflow" > while< / span > ((err = xed_decode(& instr, m_data.data() + offset,< / div >
< div class = "line" > < span class = "lineno" > 80< / span > m_data.size() - offset)) == XED_ERROR_NONE) {< / div >
< div class = "line" > < span class = "lineno" > 81< / span > < span class = "comment" > // symbol name is of the format: symbol@instroffset, I.E: main@11...< / span > < / div >
< div class = "line" > < span class = "lineno" > 82< / span > < span class = "comment" > //< / span > < / div >
< div class = "line" > < span class = "lineno" > 83< / span > < span class = "keyword" > auto< / span > new_sym_name = < a class = "code hl_function" href = "../../d9/dd5/classtheo_1_1decomp_1_1symbol__t.html#a7c6dee036291ded334aa10d89293fc2a" title = "gets the name of the symbol." > symbol_t::name< / a > (m_img, m_sym);< / div >
< div class = "line" > < span class = "lineno" > 84< / span > < / div >
< div class = "line" > < span class = "lineno" > 85< / span > < span class = "comment" > // first instruction doesnt need the @offset...< / span > < / div >
< div class = "line" > < span class = "lineno" > 86< / span > < span class = "comment" > //< / span > < / div >
< div class = "line" > < span class = "lineno" > 87< / span > < span class = "keywordflow" > if< / span > (offset)< / div >
< div class = "line" > < span class = "lineno" > 88< / span > new_sym_name.append(< span class = "stringliteral" > " @" < / span > ).append(std::to_string(offset));< / div >
< div class = "line" > < span class = "lineno" > 89< / span > < / div >
< div class = "line" > < span class = "lineno" > 90< / span > std::vector< recomp::reloc_t> relocs;< / div >
< div class = "line" > < span class = "lineno" > 91< / span > < span class = "keyword" > auto< / span > scn_relocs = < span class = "keyword" > reinterpret_cast< < / span > coff::reloc_t*< span class = "keyword" > > < / span > (< / div >
< div class = "line" > < span class = "lineno" > 92< / span > m_scn-> ptr_relocs + < span class = "keyword" > reinterpret_cast< < / span > std::uint8_t*< span class = "keyword" > > < / span > (m_img));< / div >
< div class = "line" > < span class = "lineno" > 93< / span > < / div >
< div class = "line" > < span class = "lineno" > 94< / span > < span class = "comment" > // find if this instruction has a relocation or not...< / span > < / div >
< div class = "line" > < span class = "lineno" > 95< / span > < span class = "comment" > // if so, return the reloc_t...< / span > < / div >
< div class = "line" > < span class = "lineno" > 96< / span > < span class = "comment" > //< / span > < / div >
< div class = "line" > < span class = "lineno" > 97< / span > < span class = "keyword" > auto< / span > reloc = std::find_if(< / div >
< div class = "line" > < span class = "lineno" > 98< / span > scn_relocs, scn_relocs + m_scn-> num_relocs,< / div >
< div class = "line" > < span class = "lineno" > 99< / span > [& ](coff::reloc_t reloc) {< / div >
< div class = "line" > < span class = "lineno" > 100< / span > return reloc.virtual_address > = m_sym-> value + offset & & < / div >
< div class = "line" > < span class = "lineno" > 101< / span > reloc.virtual_address < < / div >
< div class = "line" > < span class = "lineno" > 102< / span > m_sym-> value + offset +< / div >
< div class = "line" > < span class = "lineno" > 103< / span > xed_decoded_inst_get_length(& instr);< / div >
< div class = "line" > < span class = "lineno" > 104< / span > });< / div >
< div class = "line" > < span class = "lineno" > 105< / span > < / div >
< div class = "line" > < span class = "lineno" > 106< / span > < span class = "comment" > // if there is indeed a reloc for this instruction...< / span > < / div >
< div class = "line" > < span class = "lineno" > 107< / span > < span class = "comment" > //< / span > < / div >
< div class = "line" > < span class = "lineno" > 108< / span > < span class = "keywordflow" > if< / span > (reloc != scn_relocs + m_scn-> num_relocs) {< / div >
< div class = "line" > < span class = "lineno" > 109< / span > < span class = "keyword" > auto< / span > sym_reloc = m_img-> get_symbol(reloc-> symbol_index);< / div >
< div class = "line" > < span class = "lineno" > 110< / span > < span class = "keyword" > auto< / span > sym_name = < a class = "code hl_function" href = "../../d9/dd5/classtheo_1_1decomp_1_1symbol__t.html#a7c6dee036291ded334aa10d89293fc2a" title = "gets the name of the symbol." > symbol_t::name< / a > (m_img, sym_reloc);< / div >
< div class = "line" > < span class = "lineno" > 111< / span > < span class = "keyword" > auto< / span > sym_hash = < a class = "code hl_function" href = "../../d9/dd5/classtheo_1_1decomp_1_1symbol__t.html#a8695d75670cc4d61d275464e9109ff06" title = "gets the hash of the symbol name." > decomp::symbol_t::hash< / a > (sym_name.data());< / div >
< div class = "line" > < span class = "lineno" > 112< / span > < span class = "keyword" > auto< / span > reloc_offset = reloc-> virtual_address - m_sym-> value - offset;< / div >
< div class = "line" > < span class = "lineno" > 113< / span > < / div >
< div class = "line" > < span class = "lineno" > 114< / span > relocs.push_back(< / div >
< div class = "line" > < span class = "lineno" > 115< / span > recomp::reloc_t(reloc_offset, sym_hash, sym_name.data()));< / div >
< div class = "line" > < span class = "lineno" > 116< / span > }< / div >
< div class = "line" > < span class = "lineno" > 117< / span > < / div >
< div class = "line" > < span class = "lineno" > 118< / span > < span class = "comment" > // add a reloc to the next instruction...< / span > < / div >
< div class = "line" > < span class = "lineno" > 119< / span > < span class = "comment" > // note that the offset is ZERO... comp_t will understand that< / span > < / div >
< div class = "line" > < span class = "lineno" > 120< / span > < span class = "comment" > // relocs with offset ZERO means the next instructions...< / span > < / div >
< div class = "line" > < span class = "lineno" > 121< / span > < span class = "comment" > //< / span > < / div >
< div class = "line" > < span class = "lineno" > 122< / span > < span class = "keyword" > auto< / span > next_inst_sym =< / div >
< div class = "line" > < span class = "lineno" > 123< / span > < a class = "code hl_function" href = "../../d9/dd5/classtheo_1_1decomp_1_1symbol__t.html#a7c6dee036291ded334aa10d89293fc2a" title = "gets the name of the symbol." > symbol_t::name< / a > (m_img, m_sym)< / div >
< div class = "line" > < span class = "lineno" > 124< / span > .append(< span class = "stringliteral" > " @" < / span > )< / div >
< div class = "line" > < span class = "lineno" > 125< / span > .append(std::to_string(offset +< / div >
< div class = "line" > < span class = "lineno" > 126< / span > xed_decoded_inst_get_length(& instr)));< / div >
< div class = "line" > < span class = "lineno" > 127< / span > < / div >
< div class = "line" > < span class = "lineno" > 128< / span > relocs.push_back(recomp::reloc_t(< / div >
< div class = "line" > < span class = "lineno" > 129< / span > 0, < a class = "code hl_function" href = "../../d9/dd5/classtheo_1_1decomp_1_1symbol__t.html#a8695d75670cc4d61d275464e9109ff06" title = "gets the hash of the symbol name." > decomp::symbol_t::hash< / a > (next_inst_sym), next_inst_sym.data()));< / div >
< div class = "line" > < span class = "lineno" > 130< / span > < / div >
< div class = "line" > < span class = "lineno" > 131< / span > < span class = "comment" > // get the instructions bytes< / span > < / div >
< div class = "line" > < span class = "lineno" > 132< / span > < span class = "comment" > //< / span > < / div >
< div class = "line" > < span class = "lineno" > 133< / span > std::vector< std::uint8_t> inst_bytes(< / div >
< div class = "line" > < span class = "lineno" > 134< / span > m_data.data() + offset,< / div >
< div class = "line" > < span class = "lineno" > 135< / span > m_data.data() + offset + xed_decoded_inst_get_length(& instr));< / div >
< div class = "line" > < span class = "lineno" > 136< / span > < / div >
< div class = "line" > < span class = "lineno" > 137< / span > result.push_back(decomp::symbol_t(m_img, new_sym_name, offset,< / div >
< div class = "line" > < span class = "lineno" > 138< / span > inst_bytes, m_scn, m_sym, relocs,< / div >
< div class = "line" > < span class = "lineno" > 139< / span > < a class = "code hl_enumvalue" href = "../../d9/dbd/namespacetheo_1_1decomp.html#af96177687d0ad683c5897d8fa01135f9a4842f4c175b1ec87fc82ef3757d3a0e9" > sym_type_t::instruction< / a > ));< / div >
< div class = "line" > < span class = "lineno" > 140< / span > < / div >
< div class = "line" > < span class = "lineno" > 141< / span > < span class = "comment" > // after creating the symbol and dealing with relocs then print the< / span > < / div >
< div class = "line" > < span class = "lineno" > 142< / span > < span class = "comment" > // information we have concluded...< / span > < / div >
< div class = "line" > < span class = "lineno" > 143< / span > < span class = "comment" > //< / span > < / div >
< div class = "line" > < span class = "lineno" > 144< / span > < span class = "keywordtype" > char< / span > buff[255];< / div >
< div class = "line" > < span class = "lineno" > 145< / span > offset += xed_decoded_inst_get_length(& instr);< / div >
< div class = "line" > < span class = "lineno" > 146< / span > xed_format_context(XED_SYNTAX_INTEL, & instr, buff, < span class = "keyword" > sizeof< / span > buff, NULL,< / div >
< div class = "line" > < span class = "lineno" > 147< / span > NULL, NULL);< / div >
< div class = "line" > < span class = "lineno" > 148< / span > < / div >
< div class = "line" > < span class = "lineno" > 149< / span > spdlog::info(< span class = "stringliteral" > " {}: {}" < / span > , new_sym_name, buff);< / div >
< div class = "line" > < span class = "lineno" > 150< / span > < span class = "comment" > // need to set this so that instr can be used to decode again...< / span > < / div >
< div class = "line" > < span class = "lineno" > 151< / span > xed_decoded_inst_zero_set_mode(& instr, & istate);< / div >
< div class = "line" > < span class = "lineno" > 152< / span > }< / div >
< div class = "line" > < span class = "lineno" > 153< / span > < / div >
< div class = "line" > < span class = "lineno" > 154< / span > < span class = "comment" > // remove the relocation to the next symbol from the last instruction< / span > < / div >
< div class = "line" > < span class = "lineno" > 155< / span > < span class = "comment" > //< / span > < / div >
< div class = "line" > < span class = "lineno" > 156< / span > < span class = "keyword" > auto< / span > & last_inst = result.back();< / div >
< div class = "line" > < span class = "lineno" > 157< / span > < span class = "keyword" > auto< / span > & last_inst_relocs = last_inst.relocs();< / div >
< div class = "line" > < span class = "lineno" > 158< / span > last_inst_relocs.erase(last_inst_relocs.end() - 1);< / div >
< div class = "line" > < span class = "lineno" > 159< / span > < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < span class = "lineno" > 160< / span > }< / div >
< div class = "line" > < span class = "lineno" > 161< / span > < span class = "keywordflow" > default< / span > :< / div >
< div class = "line" > < span class = "lineno" > 162< / span > < span class = "keywordflow" > break< / span > ;< / div >
< div class = "line" > < span class = "lineno" > 163< / span > }< / div >
< div class = "line" > < span class = "lineno" > 164< / span > < / div >
< div class = "line" > < span class = "lineno" > 165< / span > < span class = "keywordflow" > return< / span > result;< / div >
< div class = "line" > < span class = "lineno" > 166< / span > }< / div >
< / div > <!-- fragment -->
< p class = "reference" > References < a class = "el" href = "../../d2/dbb/routine_8cpp_source.html#l00172" > data()< / a > , < a class = "el" href = "../../d6/d62/symbol_8hpp_source.html#l00044" > theo::decomp::function< / a > , < a class = "el" href = "../../d8/d67/symbol_8cpp_source.html#l00088" > theo::decomp::symbol_t::hash()< / a > , < a class = "el" href = "../../d6/d62/symbol_8hpp_source.html#l00045" > theo::decomp::instruction< / a > , and < a class = "el" href = "../../d8/d67/symbol_8cpp_source.html#l00052" > theo::decomp::symbol_t::name()< / a > .< / p >
< / div >
< / div >
< a id = "ad3a75cb97abbcd9b282772401b256f36" name = "ad3a75cb97abbcd9b282772401b256f36" > < / a >
< h2 class = "memtitle" > < span class = "permalink" > < a href = "#ad3a75cb97abbcd9b282772401b256f36" > ◆ < / a > < / span > scn()< / h2 >
< div class = "memitem" >
< div class = "memproto" >
< table class = "memname" >
< tr >
< td class = "memname" > coff::section_header_t * theo::decomp::routine_t::scn < / td >
< td > (< / td >
< td class = "paramname" > < / td > < td > )< / td >
< td > < / td >
< / tr >
< / table >
< / div > < div class = "memdoc" >
< p > gets the section header of the section in which the symbol is located in. < / p >
< dl class = "section return" > < dt > Returns< / dt > < dd > the section header of the section in which the symbol is located in.< / dd > < / dl >
< p class = "definition" > Definition at line < a class = "el" href = "../../d2/dbb/routine_8cpp_source.html#l00168" > 168< / a > of file < a class = "el" href = "../../d2/dbb/routine_8cpp_source.html" > routine.cpp< / a > .< / p >
< div class = "fragment" > < div class = "line" > < span class = "lineno" > 168< / span > {< / div >
< div class = "line" > < span class = "lineno" > 169< / span > < span class = "keywordflow" > return< / span > m_scn;< / div >
< div class = "line" > < span class = "lineno" > 170< / span > }< / div >
< / div > <!-- fragment -->
< / div >
< / div >
< hr / > The documentation for this class was generated from the following files:< ul >
< li > include/decomp/< a class = "el" href = "../../de/df5/routine_8hpp_source.html" > routine.hpp< / a > < / li >
< li > src/decomp/< a class = "el" href = "../../d2/dbb/routine_8cpp_source.html" > routine.cpp< / a > < / li >
< / ul >
< / div > <!-- contents -->
<!-- start footer part -->
< hr class = "footer" / > < address class = "footer" > < small >
Generated by  < a href = "https://www.doxygen.org/index.html" > < img class = "footer" src = "../../doxygen.svg" width = "104" height = "31" alt = "doxygen" / > < / a > 1.9.3
< / small > < / address >
< / body >
< / html >