<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"Courier New";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Hi Lang,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Thank you for your reply. I tried to supply a custom Resolver that just returns 0 for the symbols I want to handle manually, but that results in a
<span style="background:yellow;mso-highlight:yellow">fatal error</span> below. If that can be changed, then yes,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">it would be sufficient for my use case.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Thanks,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Eugene<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:blue">void</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> </span><span style="font-size:10.0pt;font-family:Consolas;color:#2B91AF">RuntimeDyldImpl</span><span style="font-size:10.0pt;font-family:Consolas;color:black">::resolveExternalSymbols() {<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">  </span><span style="font-size:10.0pt;font-family:Consolas;color:blue">while</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> (!ExternalSymbolRelocations.empty()) {<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">    </span><span style="font-size:10.0pt;font-family:Consolas;color:#2B91AF">StringMap</span><span style="font-size:10.0pt;font-family:Consolas;color:black"><</span><span style="font-size:10.0pt;font-family:Consolas;color:#2B91AF">RelocationList</span><span style="font-size:10.0pt;font-family:Consolas;color:black">>::</span><span style="font-size:10.0pt;font-family:Consolas;color:#2B91AF">iterator</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> i = ExternalSymbolRelocations.begin();<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">    </span><span style="font-size:10.0pt;font-family:Consolas;color:#2B91AF">StringRef</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> Name = i->first();<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">    </span><span style="font-size:10.0pt;font-family:Consolas;color:blue">if</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> (Name.size() == 0) {<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">      </span><span style="font-size:10.0pt;font-family:Consolas;color:green">// This is an absolute symbol, use an address of zero.</span><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">      </span><span style="font-size:10.0pt;font-family:Consolas;color:#6F008A">DEBUG</span><span style="font-size:10.0pt;font-family:Consolas;color:black">(dbgs() << </span><span style="font-size:10.0pt;font-family:Consolas;color:#A31515">"Resolving absolute relocations."</span><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">                   << </span><span style="font-size:10.0pt;font-family:Consolas;color:#A31515">"\n"</span><span style="font-size:10.0pt;font-family:Consolas;color:black">);<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">      </span><span style="font-size:10.0pt;font-family:Consolas;color:#2B91AF">RelocationList</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> &Relocs = i->second;<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">      resolveRelocationList(Relocs, 0);<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">    } </span><span style="font-size:10.0pt;font-family:Consolas;color:blue">else</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> {<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">      </span><span style="font-size:10.0pt;font-family:Consolas;color:#2B91AF">uint64_t</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> Addr = 0;<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">      </span><span style="font-size:10.0pt;font-family:Consolas;color:#2B91AF">RTDyldSymbolTable</span><span style="font-size:10.0pt;font-family:Consolas;color:black">::</span><span style="font-size:10.0pt;font-family:Consolas;color:#2B91AF">const_iterator</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> Loc = GlobalSymbolTable.find(Name);<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">      </span><span style="font-size:10.0pt;font-family:Consolas;color:blue">if</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> (Loc == GlobalSymbolTable.end()) {<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">        </span><span style="font-size:10.0pt;font-family:Consolas;color:green">// This is an external symbol, try to get its address from the symbol</span><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">        </span><span style="font-size:10.0pt;font-family:Consolas;color:green">// resolver.</span><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">        Addr = Resolver.findSymbol(Name.data()).getAddress();<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">        </span><span style="font-size:10.0pt;font-family:Consolas;color:green">// The call to getSymbolAddress may have caused additional modules to</span><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">        </span><span style="font-size:10.0pt;font-family:Consolas;color:green">// be loaded, which may have added new entries to the</span><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">        </span><span style="font-size:10.0pt;font-family:Consolas;color:green">// ExternalSymbolRelocations map.  Consquently, we need to update our</span><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">        </span><span style="font-size:10.0pt;font-family:Consolas;color:green">// iterator.  This is also why retrieval of the relocation list</span><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">        </span><span style="font-size:10.0pt;font-family:Consolas;color:green">// associated with this symbol is deferred until below this point.</span><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">        </span><span style="font-size:10.0pt;font-family:Consolas;color:green">// New entries may have been added to the relocation list.</span><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">        i = ExternalSymbolRelocations.find(Name);<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">      } </span><span style="font-size:10.0pt;font-family:Consolas;color:blue">else</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> {<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">        </span><span style="font-size:10.0pt;font-family:Consolas;color:green">// We found the symbol in our global table.  It was probably in a</span><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">        </span><span style="font-size:10.0pt;font-family:Consolas;color:green">// Module that we loaded previously.</span><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">        </span><span style="font-size:10.0pt;font-family:Consolas;color:blue">const</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> </span><span style="font-size:10.0pt;font-family:Consolas;color:blue">auto</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> &SymInfo = Loc->second;<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">        Addr = getSectionLoadAddress(SymInfo.getSectionID()) +<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">               SymInfo.getOffset();<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">      }<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">      </span><span style="font-size:10.0pt;font-family:Consolas;color:green">// FIXME: Implement error handling that doesn't kill the host program!</span><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">      </span><span style="font-size:10.0pt;font-family:Consolas;color:blue;background:yellow;mso-highlight:yellow">if</span><span style="font-size:10.0pt;font-family:Consolas;color:black;background:yellow;mso-highlight:yellow"> (!Addr) {<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black;background:yellow;mso-highlight:yellow">        </span><span style="font-size:10.0pt;font-family:Consolas;background:yellow;mso-highlight:yellow">report_fatal_error("Program used external function '" + Name +<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;background:yellow;mso-highlight:yellow">                           "' which could not be resolved!");<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:green;background:yellow;mso-highlight:yellow">      }</span><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">      </span><span style="font-size:10.0pt;font-family:Consolas;color:#6F008A">DEBUG</span><span style="font-size:10.0pt;font-family:Consolas;color:black">(dbgs() << </span><span style="font-size:10.0pt;font-family:Consolas;color:#A31515">"Resolving relocations Name: "</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> << Name << </span><span style="font-size:10.0pt;font-family:Consolas;color:#A31515">"\t"</span><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">        << format(</span><span style="font-size:10.0pt;font-family:Consolas;color:#A31515">"0x%lx"</span><span style="font-size:10.0pt;font-family:Consolas;color:black">, Addr) << </span><span style="font-size:10.0pt;font-family:Consolas;color:#A31515">"\n"</span><span style="font-size:10.0pt;font-family:Consolas;color:black">);<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">      </span><span style="font-size:10.0pt;font-family:Consolas;color:green">// This list may have been updated when we called getSymbolAddress, so</span><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">      </span><span style="font-size:10.0pt;font-family:Consolas;color:green">// don't change this code to get the list earlier.</span><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">      </span><span style="font-size:10.0pt;font-family:Consolas;color:#2B91AF">RelocationList</span><span style="font-size:10.0pt;font-family:Consolas;color:black"> &Relocs = i->second;<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">      resolveRelocationList(Relocs, Addr);<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">    }<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">    ExternalSymbolRelocations.erase(i);<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">  }<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:10.0pt;font-family:Consolas;color:black">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Lang Hames [mailto:lhames@gmail.com]
<br>
<b>Sent:</b> Wednesday, June 24, 2015 4:42 PM<br>
<b>To:</b> Eugene Rozenfeld<br>
<b>Cc:</b> llvmdev@cs.uiuc.edu<br>
<b>Subject:</b> Re: ORC and relocations<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Hi Eugene,<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">There's no way to 'skip' application of a relocation.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">You could use the NotifyLoadedFtor and libObject to scan the object ahead of time and record the relocations that you'd like to override, then you could supply a custom Resolver that just returns '0' for the symbols that you want to handle
 manually. <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">There's no way to handle distinct relocations for the same symbol differently: For performance reasons we only look up each symbol once and re-use the supplied address to apply every relocation for that symbol.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Is that sufficient to support your use-case?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Cheers,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Lang.<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On Wed, Jun 24, 2015 at 12:03 AM, Eugene Rozenfeld <<a href="mailto:Eugene.Rozenfeld@microsoft.com" target="_blank">Eugene.Rozenfeld@microsoft.com</a>> wrote:<o:p></o:p></p>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Hello,<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">I’m working on LLILC (a jit for the CoreCLR built on ORC), in particular, on using LLILC as an ngen jit. I would like to have an ability to be notified of relocations that ObjectLinkingLayer
  is applying and to be able to tell the linking layer not to resolve certain relocations for external symbols (so that the client can do some custom resolutions later). The only way I found of looking at relocations in the client is via NotifyLoadedFtor notifications
 but I couldn’t find a way of blocking a relocation resolution.<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">One way to achieve that is to change the Resolver::findSymbol api to allow clients to indicate that the relocations for the symbol shouldn’t be resolved and update RuntimeDyldImpl::resolveExternalSymbols
 accordingly. Would this be a reasonable approach?<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Thanks,<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Eugene<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
</div>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</body>
</html>