[llvm-dev] (Orc)JIT and weak symbol resolution

Axel Naumann via llvm-dev llvm-dev at lists.llvm.org
Mon May 2 11:33:24 PDT 2016


Hi Lang,


On 02/05/16 19:42, Lang Hames wrote:
> Hi Axel,
>
> Sorry for the delay. Attached is the patch for RuntimeDyld & MCJIT
> (plus a proof-of-concept MCJIT setup that uses it). This was just a
> quick hack to work around this issue in MCJIT - it needs some polish,
> and it hasn't been tested with ORC yet.

Thanks!

> I think the full solution should look more like this:
>
> 1) In loadObject all symbols in the object should be added to the
> RuntimeDyld instance's symbol table, each marked weak or not as
> appropriate.
> 2) In RuntimeDyldImpl::loadObjectImpl weak symbols should be treated
> as if they were externals - i.e. we add symbolic relocations for each
> of them.
> 3) In RuntimeDyldImpl::resolveRelocations, for each weak symbol we
> first search the logical dylib for an existing strong definition. If
> we find one we use that, and remove the weak definition from the local
> table entirely. If we don't find an existing strong definition we mark
> our local definition as strong and use it.
>
Yes makes sense, I also thought pseudo-relocs for weak symbols are the
way to go, given the symbol resolution mechanism of RtDyld.
> Are you interested in implementing this?
>
The fact that I thought relocs are the way to go, and that I hacked
something in in the past that "mostly" worked, makes me courageous ;-)

I'll give it a try. If I get stuck / time out I'll come back to you.

Cheers, Axel.

> On Fri, Apr 29, 2016 at 9:47 AM, Lang Hames <lhames at gmail.com
> <mailto:lhames at gmail.com>> wrote:
>
>     Hi Axel,
>
>     Yep - RuntimeDyld does not handle weak symbols properly at the
>     moment. About a month back I ran into a bug that I thought was due
>     to this lack of weak symbol support (but that actually turned out
>     to be something else) and wrote up a preliminary patch to fix it.
>     When I get in to the office in a couple of hours I'll dig that
>     patch up and see what kind of state it's in - it should serve as a
>     good starting point.
>
>     - Lang.
>
>     On Fri, Apr 29, 2016 at 5:20 AM, Axel Naumann via llvm-dev
>     <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>
>         Hi,
>
>         This is a question on how to resolve weak symbols from the
>         binary for
>         symbols that are also llvm::Module-local. Currently, the JIT
>         seems to
>         favor resolving to module-local symbols over existing symbols:
>
>         $ cat symbols.cxx
>         extern "C" int printf(const char*,...);
>
>         template <class T> struct StaticStuff {
>           static T s_data;
>         };
>         template <class T> T StaticStuff<T>::s_data = 42;
>
>         int compareAddr(int* interp);
>         #ifdef BUILD_SHARED
>         int compareAddr(int* interp) {
>           if (interp != &StaticStuff<int>::s_data) {
>             printf("Wrong address, %ld in shared lib, %ld in
>         interpreter!\n",
>                    (long)&StaticStuff<int>::s_data,
>                    (long)interp);
>             // CHECK-NOT: Wrong address
>             return 1;
>           }
>           return 0;
>         }
>         #else
>         # ifdef __CLING__
>         int Symbols() {
>         # else
>         int main()
>         # endif
>         {  return compareAddr(&StaticStuff<int>::s_data);}
>         #endif // ! BUILD_SHARED
>
>
>         $ clang++ -shared -fPIC -DBUILD_SHARED symbols.cxx -o
>         libSymbols.so
>         $ clang++ -cc1 -emit-llvm symbols.cxx -o - |  lli -load
>         ./libSymbols.so -
>         or
>         $ clang++ -lSymbols symbols.cxx && ./a.out
>
>         Compiled it's happy: the weak symbol used in main gets
>         resolved to be
>         the one in the binary for both references. That's the behavior
>         I'd expect.
>
>         The JIT OTOH is deciding that it shall use the local version
>         of the
>         symbol; RuntimeDyld::getSymbol() doesn't care about the fact
>         that the
>         symbol is weak and has an existing occurrence.
>
>         For weak symbols from a different module, RuntimeDyld would use
>         resolveExternalSymbols() and all would be good - but here this
>         doesn't
>         happen.
>
>         IIUC, RuntimeDyld::getSymbol() really needs to check whether
>         the local
>         symbol should survive or not, before handing out its address.
>         But that
>         seems to break the whole design of when relocs happen, so I'm
>         sure I'm
>         wrong. Can I get some hints on how to implement the proper patch?
>
>         Cheers, Axel.
>
>         --
>         ROOT - http://root.cern.ch
>         PH-SFT, CERN, 1211 Geneve 23, Switzerland
>         Tel: +41 22 7678225 <tel:%2B41%2022%207678225>
>         _______________________________________________
>         LLVM Developers mailing list
>         llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>         http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160502/27cb2336/attachment.html>


More information about the llvm-dev mailing list