[LLVMdev] ORC and relocations
Lang Hames
lhames at gmail.com
Fri Jun 26 10:28:23 PDT 2015
Hi Eugene,
Returning null addresses to the linker is unusual enough that I'd prefer to
keep it as an error.
Could you return a non-zero marker value, e.g. all-ones? If not, we should
add an option to RuntimeDyld like "AllowUnresolvedSymbols" and change the
error condition to if '(!Addr && !AllowUnresolvedSymbols)'.
Cheers,
Lang.
On Thu, Jun 25, 2015 at 6:35 PM, Eugene Rozenfeld <
Eugene.Rozenfeld at microsoft.com> wrote:
> Hi Lang,
>
>
>
> Can you please let me know you think it would be right to modify
> RuntimeDyldImpl::resolveExternalSymbols to allow resolvers to return 0
> addresses? Something like this would be ideal for me:
>
>
>
> void RuntimeDyldImpl::resolveExternalSymbols() {
>
> while (!ExternalSymbolRelocations.empty()) {
>
> StringMap<RelocationList>::iterator
> i = ExternalSymbolRelocations.begin();
>
>
>
> StringRef Name = i->first();
>
> if (Name.size() == 0) {
>
> // This is an absolute symbol, use an address of zero.
>
> DEBUG(dbgs() << "Resolving absolute relocations."
>
> << "\n");
>
> RelocationList &Relocs = i->second;
>
> resolveRelocationList(Relocs, 0);
>
> } else {
>
> uint64_t Addr = 0;
>
> RTDyldSymbolTable::const_iterator
> Loc = GlobalSymbolTable.find(Name);
>
> if (Loc == GlobalSymbolTable.end()) {
>
>
> // This is an external symbol, try to get its address from the symbol
>
> // resolver.
>
> Addr = Resolver.findSymbol(Name.data()).getAddress();
>
>
> // The call to getSymbolAddress may have caused additional modules to
>
> // be loaded, which may have added new entries to the
>
>
> // ExternalSymbolRelocations map. Consquently, we need to update our
>
> // iterator. This is also why retrieval of the relocation list
>
> // associated with this symbol is deferred until below this point.
>
> // New entries may have been added to the relocation list.
>
> i = ExternalSymbolRelocations.find(Name);
>
> } else {
>
> // We found the symbol in our global table. It was probably in a
>
> // Module that we loaded previously.
>
> const auto &SymInfo = Loc->second;
>
> Addr = getSectionLoadAddress(SymInfo.getSectionID()) +
>
> SymInfo.getOffset();
>
> }
>
>
>
> if (Addr) {
>
> DEBUG(dbgs() << "Resolving relocations Name: " << Name << "\t"
>
> << format("0x%lx", Addr) << "\n");
>
>
> // This list may have been updated when we called getSymbolAddress, so
>
> // don't change this code to get the list earlier.
>
> RelocationList &Relocs = i->second;
>
> resolveRelocationList(Relocs, Addr);
>
> }
>
> }
>
>
>
> ExternalSymbolRelocations.erase(i);
>
> }
>
> }
>
>
>
> Thanks,
>
>
>
> Eugene
>
> *From:* Eugene Rozenfeld
> *Sent:* Wednesday, June 24, 2015 4:47 PM
> *To:* 'Lang Hames'
> *Cc:* llvmdev at cs.uiuc.edu
> *Subject:* RE: ORC and relocations
>
>
>
> Hi Lang,
>
>
>
> 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 fatal
> error below. If that can be changed, then yes,
>
> it would be sufficient for my use case.
>
>
>
> Thanks,
>
>
>
> Eugene
>
>
>
> void RuntimeDyldImpl::resolveExternalSymbols() {
>
> while (!ExternalSymbolRelocations.empty()) {
>
> StringMap<RelocationList>::iterator
> i = ExternalSymbolRelocations.begin();
>
>
>
> StringRef Name = i->first();
>
> if (Name.size() == 0) {
>
> // This is an absolute symbol, use an address of zero.
>
> DEBUG(dbgs() << "Resolving absolute relocations."
>
> << "\n");
>
> RelocationList &Relocs = i->second;
>
> resolveRelocationList(Relocs, 0);
>
> } else {
>
> uint64_t Addr = 0;
>
> RTDyldSymbolTable::const_iterator
> Loc = GlobalSymbolTable.find(Name);
>
> if (Loc == GlobalSymbolTable.end()) {
>
>
> // This is an external symbol, try to get its address from the symbol
>
> // resolver.
>
> Addr = Resolver.findSymbol(Name.data()).getAddress();
>
>
> // The call to getSymbolAddress may have caused additional modules to
>
> // be loaded, which may have added new entries to the
>
>
> // ExternalSymbolRelocations map. Consquently, we need to update our
>
> // iterator. This is also why retrieval of the relocation list
>
> // associated with this symbol is deferred until below this point.
>
> // New entries may have been added to the relocation list.
>
> i = ExternalSymbolRelocations.find(Name);
>
> } else {
>
> // We found the symbol in our global table. It was probably in a
>
> // Module that we loaded previously.
>
> const auto &SymInfo = Loc->second;
>
> Addr = getSectionLoadAddress(SymInfo.getSectionID()) +
>
> SymInfo.getOffset();
>
> }
>
>
>
>
> // FIXME: Implement error handling that doesn't kill the host program!
>
> if (!Addr) {
>
> report_fatal_error("Program used external function '" + Name +
>
> "' which could not be resolved!");
>
> }
>
>
>
> DEBUG(dbgs() << "Resolving relocations Name: " << Name << "\t"
>
> << format("0x%lx", Addr) << "\n");
>
>
> // This list may have been updated when we called getSymbolAddress, so
>
> // don't change this code to get the list earlier.
>
> RelocationList &Relocs = i->second;
>
> resolveRelocationList(Relocs, Addr);
>
> }
>
>
>
> ExternalSymbolRelocations.erase(i);
>
> }
>
> }
>
>
>
>
>
> *From:* Lang Hames [mailto:lhames at gmail.com <lhames at gmail.com>]
> *Sent:* Wednesday, June 24, 2015 4:42 PM
> *To:* Eugene Rozenfeld
> *Cc:* llvmdev at cs.uiuc.edu
> *Subject:* Re: ORC and relocations
>
>
>
> Hi Eugene,
>
>
>
> There's no way to 'skip' application of a relocation.
>
>
>
> 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.
>
>
>
> 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.
>
>
>
> Is that sufficient to support your use-case?
>
>
>
> Cheers,
>
> Lang.
>
>
>
> On Wed, Jun 24, 2015 at 12:03 AM, Eugene Rozenfeld <
> Eugene.Rozenfeld at microsoft.com> wrote:
>
> Hello,
>
>
>
> 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.
>
>
>
> 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?
>
>
>
> Thanks,
>
>
>
> Eugene
>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150626/cee1c861/attachment.html>
More information about the llvm-dev
mailing list