Eli Baum via llvm-dev
2019-Mar-12 01:25 UTC
[llvm-dev] symbol resolution on statically-compiled JIT
Hi!
I am using LLVM to create a JIT – I have followed the excellent
Kaleidoscope tutorial, and am now starting to build off of it.
Down the line, I plan to use this JIT for my research into computer
architecture, which means that I will need to run the JIT itself within a
simulated CPU and bare-bones linux system. To make that research easier, I
am trying to statically compile my JIT. Everything works with the normal
compilation (clang ... -rdynamic) but when switched to static (clang ...
-static), *I can no longer execute externally defined C functions*. I
suspect this is something to do with the symbol loader not being properly
set up for static linking, but I don't know much about that.
Here are some more details:
*In the normally-compiled kaleidoscope JIT, *I can run something like this:
kld> extern printd(x);
kld> printd(10);
10.000000
printd was one of the C functions defined within the main program:
/// printd - printf that takes a double prints it as "%f\n", returning
0.
extern "C" DLLEXPORT double printd(double X) {
fprintf(stderr, "%f\n", X);
return X;
}
However, in the static linked version, the JIT cannot find the symbol:
kld> extern printd(x);
kld> printd(1);
kaleidoscope error: Symbols not found: { printd }
But the symbol is there:
$ llvm-nm kld_s | grep printd
0000000000497e30 T printd
$ llvm-nm kld | grep printd
00000000006b1820 T printd
(kld_s is the static version)
How can I begin to debug this issue? Does something different happen to the
symbol loader when I compile statically?
My two make scripts look like
$ make kld
clang++ -v kld.cpp libkld.o /home/eli/sproj-git/passes/test/libTestPass.o
`llvm-config --cxxflags --ldflags --system-libs --libs core orcjit native `
-fuse-ld=gold -g3 -o kld *-rdynamic*
$ make kld_s
clang++ -v kld.cpp libkld.o /home/eli/sproj-git/passes/test/libTestPass.o
`llvm-config --cxxflags --ldflags --system-libs --libs core orcjit native `
-fuse-ld=gold -g3 -o kld_s *-static*
The only difference is in the final flag (bold). libkld.o and libTestPass.o
are unrelated object files I am linking from other parts of my project.
If the clang option -static behaves like gcc's, the man page does say that
it "... prevents linking with the shared libraries", which I suppose
is not
precisely what I want.
I previously emailed llvm-dev a few months ago about a similar issue, where
extern functions were not working at all (even dynamically). I resolved* that
*issue by downgrading to LLVM 6, and recently, by upgrading to LLVM 9. Now
the issue has returned, I suppose, in slightly different form.
If anyone has any ideas, please let me know!
Thank you so much,
Eli Baum
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20190311/59a24344/attachment-0001.html>
Lang Hames via llvm-dev
2019-Mar-30 00:15 UTC
[llvm-dev] symbol resolution on statically-compiled JIT
Hi Eli, You will need to add the process symbols explicitly to the search space using: sys::DynamicLibrary::LoadLibraryPermanently(nullptr); If you are on linux, you will also need to make sure that process symbols are exported by passing -Wl,--export-dynamic to clang, and ensure that any symbols that you want to call are not dead-stripped by the linker. Hope that helps! Cheers, Lang. On Mon, Mar 11, 2019 at 8:16 PM Eli Baum via llvm-dev < llvm-dev at lists.llvm.org> wrote:> Hi! > > I am using LLVM to create a JIT – I have followed the excellent > Kaleidoscope tutorial, and am now starting to build off of it. > > Down the line, I plan to use this JIT for my research into computer > architecture, which means that I will need to run the JIT itself within a > simulated CPU and bare-bones linux system. To make that research easier, I > am trying to statically compile my JIT. Everything works with the normal > compilation (clang ... -rdynamic) but when switched to static (clang ... > -static), *I can no longer execute externally defined C functions*. I > suspect this is something to do with the symbol loader not being properly > set up for static linking, but I don't know much about that. > > Here are some more details: > > *In the normally-compiled kaleidoscope JIT, *I can run something like > this: > kld> extern printd(x); > kld> printd(10); > 10.000000 > > printd was one of the C functions defined within the main program: > /// printd - printf that takes a double prints it as "%f\n", returning 0. > extern "C" DLLEXPORT double printd(double X) { > fprintf(stderr, "%f\n", X); > return X; > } > > However, in the static linked version, the JIT cannot find the symbol: > kld> extern printd(x); > kld> printd(1); > kaleidoscope error: Symbols not found: { printd } > > But the symbol is there: > $ llvm-nm kld_s | grep printd > 0000000000497e30 T printd > $ llvm-nm kld | grep printd > 00000000006b1820 T printd > > (kld_s is the static version) > > How can I begin to debug this issue? Does something different happen to > the symbol loader when I compile statically? > > My two make scripts look like > $ make kld > clang++ -v kld.cpp libkld.o /home/eli/sproj-git/passes/test/libTestPass.o > `llvm-config --cxxflags --ldflags --system-libs --libs core orcjit native ` > -fuse-ld=gold -g3 -o kld *-rdynamic* > > $ make kld_s > clang++ -v kld.cpp libkld.o /home/eli/sproj-git/passes/test/libTestPass.o > `llvm-config --cxxflags --ldflags --system-libs --libs core orcjit native ` > -fuse-ld=gold -g3 -o kld_s *-static* > > The only difference is in the final flag (bold). libkld.o and > libTestPass.o are unrelated object files I am linking from other parts of > my project. > > If the clang option -static behaves like gcc's, the man page does say that > it "... prevents linking with the shared libraries", which I suppose is not > precisely what I want. > > I previously emailed llvm-dev a few months ago about a similar issue, > where extern functions were not working at all (even dynamically). I > resolved* that *issue by downgrading to LLVM 6, and recently, by > upgrading to LLVM 9. Now the issue has returned, I suppose, in slightly > different form. > > If anyone has any ideas, please let me know! > > Thank you so much, > Eli Baum > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://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/20190329/b2a4cfb5/attachment.html>