On Tue, Aug 27, 2019 at 4:56 PM Praveen Velliengiri <praveenvelliengiri at gmail.com> wrote:> > HI > Did you run the static constructor and destructor? How did you make your process symbols visible to ORC jit?Yes. It's the constructor that generates the undefined symbol error. We use DynamicLibrary::LoadLibraryPermanently(nullptr) to add process symbols.> Could you please share us the for what symbols you get undefined references :-)Certainly! Mangled: _ZNSi4swapERSi _ZNSt13basic_filebufIcSt11char_traitsIcEE4swapERS2_ And unmangled: std::basic_istream<char, std::char_traits<char>>::swap(std::basic_istream<char, std::char_traits<char> >&)std::basic_filebuf<char, std::char_traits<char>>::swap(std::basic_filebuf<char, std::char_traits<char> >&)Incidentally, if I call that STL swap() function in the application, to ensure it is in the process symbols, the second symbol is found, but the first is still undefined.> > On Aug 27, 2019 8:18 PM, "Geoff Levner via llvm-dev" <llvm-dev at lists.llvm.org> wrote: >> >> Greetings, LLVM wizards. >> >> We are using Clang and Orc JIT (v1) to compile and execute C++ code on the fly. If a C++ module calls functions from external libraries, we add them via DynamicLibrary::LoadLibraryPermanently(). >> >> The problem we have run into recently is when a module calls a function from the STL -- in particular this swap() function for input streams: >> >> #include <fstream> >> std::ifstream stream1, stream2; >> stream1.swap(stream2); >> >> When we run the constructors for the module, we get two undefined symbols. And explicitly adding libstdc++ doesn't help. It turns out that the missing symbols are defined not in the runtime DSO but in an archive file: >> >> /opt/rh/devtoolset-6/root/usr/lib/gcc/x86_64-redhat-linux/6.3.1/libstdc++.a >> >> So my questions are: >> >> 1. Is there a simple way to get access to all symbols defined in the STL? Intuitively, it seems like we should not need to know about such compiler magic. >> >> 2. If there is no magical solution, is there a way to explicitly add symbols from an archive? >> >> Thanks, >> Geoff >> >> >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >>
Hi Geoff, I tried it, but I can't able to reproduce it. Test Program: #include <fstream> int main() { std::ifstream stream1, stream2; stream1.swap(stream2); return 0; } I didn't get undefined symbols error. I used DynamicLibrarySearchGenerator::GetForCurrentProcess API to make symbols from STL visible to ORC JIT. On Tue, 27 Aug 2019 at 20:36, Geoff Levner <glevner at gmail.com> wrote:> On Tue, Aug 27, 2019 at 4:56 PM Praveen Velliengiri > <praveenvelliengiri at gmail.com> wrote: > > > > HI > > Did you run the static constructor and destructor? How did you make your > process symbols visible to ORC jit? > > Yes. It's the constructor that generates the undefined symbol error. > We use DynamicLibrary::LoadLibraryPermanently(nullptr) to add process > symbols. > > > Could you please share us the for what symbols you get undefined > references :-) > > Certainly! Mangled: > > _ZNSi4swapERSi > _ZNSt13basic_filebufIcSt11char_traitsIcEE4swapERS2_ > > And unmangled: > > std::basic_istream<char, std::char_traits<char> > >::swap(std::basic_istream<char, std::char_traits<char> >&) > std::basic_filebuf<char, std::char_traits<char> > >::swap(std::basic_filebuf<char, std::char_traits<char> >&) > > Incidentally, if I call that STL swap() function in the application, > to ensure it is in the process symbols, the second symbol is found, > but the first is still undefined. > > > > > > On Aug 27, 2019 8:18 PM, "Geoff Levner via llvm-dev" < > llvm-dev at lists.llvm.org> wrote: > >> > >> Greetings, LLVM wizards. > >> > >> We are using Clang and Orc JIT (v1) to compile and execute C++ code on > the fly. If a C++ module calls functions from external libraries, we add > them via DynamicLibrary::LoadLibraryPermanently(). > >> > >> The problem we have run into recently is when a module calls a function > from the STL -- in particular this swap() function for input streams: > >> > >> #include <fstream> > >> std::ifstream stream1, stream2; > >> stream1.swap(stream2); > >> > >> When we run the constructors for the module, we get two undefined > symbols. And explicitly adding libstdc++ doesn't help. It turns out that > the missing symbols are defined not in the runtime DSO but in an archive > file: > >> > >> > /opt/rh/devtoolset-6/root/usr/lib/gcc/x86_64-redhat-linux/6.3.1/libstdc++.a > >> > >> So my questions are: > >> > >> 1. Is there a simple way to get access to all symbols defined in the > STL? Intuitively, it seems like we should not need to know about such > compiler magic. > >> > >> 2. If there is no magical solution, is there a way to explicitly add > symbols from an archive? > >> > >> Thanks, > >> Geoff > >> > >> > >> _______________________________________________ > >> 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/20190827/ef7da6b4/attachment.html>
You can add symbols from Archieve via StaticLibrarySearchGenerator. But it is added recently though On Tue, 27 Aug 2019 at 21:02, Praveen Velliengiri < praveenvelliengiri at gmail.com> wrote:> Hi Geoff, > I tried it, but I can't able to reproduce it. > > Test Program: > #include <fstream> > int main() > { > std::ifstream stream1, stream2; > stream1.swap(stream2); > return 0; > } > > I didn't get undefined symbols error. I used > DynamicLibrarySearchGenerator::GetForCurrentProcess API to make symbols > from STL visible to ORC JIT. > > On Tue, 27 Aug 2019 at 20:36, Geoff Levner <glevner at gmail.com> wrote: > >> On Tue, Aug 27, 2019 at 4:56 PM Praveen Velliengiri >> <praveenvelliengiri at gmail.com> wrote: >> > >> > HI >> > Did you run the static constructor and destructor? How did you make >> your process symbols visible to ORC jit? >> >> Yes. It's the constructor that generates the undefined symbol error. >> We use DynamicLibrary::LoadLibraryPermanently(nullptr) to add process >> symbols. >> >> > Could you please share us the for what symbols you get undefined >> references :-) >> >> Certainly! Mangled: >> >> _ZNSi4swapERSi >> _ZNSt13basic_filebufIcSt11char_traitsIcEE4swapERS2_ >> >> And unmangled: >> >> std::basic_istream<char, std::char_traits<char> >> >::swap(std::basic_istream<char, std::char_traits<char> >&) >> std::basic_filebuf<char, std::char_traits<char> >> >::swap(std::basic_filebuf<char, std::char_traits<char> >&) >> >> Incidentally, if I call that STL swap() function in the application, >> to ensure it is in the process symbols, the second symbol is found, >> but the first is still undefined. >> >> >> > >> > On Aug 27, 2019 8:18 PM, "Geoff Levner via llvm-dev" < >> llvm-dev at lists.llvm.org> wrote: >> >> >> >> Greetings, LLVM wizards. >> >> >> >> We are using Clang and Orc JIT (v1) to compile and execute C++ code on >> the fly. If a C++ module calls functions from external libraries, we add >> them via DynamicLibrary::LoadLibraryPermanently(). >> >> >> >> The problem we have run into recently is when a module calls a >> function from the STL -- in particular this swap() function for input >> streams: >> >> >> >> #include <fstream> >> >> std::ifstream stream1, stream2; >> >> stream1.swap(stream2); >> >> >> >> When we run the constructors for the module, we get two undefined >> symbols. And explicitly adding libstdc++ doesn't help. It turns out that >> the missing symbols are defined not in the runtime DSO but in an archive >> file: >> >> >> >> >> /opt/rh/devtoolset-6/root/usr/lib/gcc/x86_64-redhat-linux/6.3.1/libstdc++.a >> >> >> >> So my questions are: >> >> >> >> 1. Is there a simple way to get access to all symbols defined in the >> STL? Intuitively, it seems like we should not need to know about such >> compiler magic. >> >> >> >> 2. If there is no magical solution, is there a way to explicitly add >> symbols from an archive? >> >> >> >> Thanks, >> >> Geoff >> >> >> >> >> >> _______________________________________________ >> >> 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/20190827/e2f58cbb/attachment.html>