2016-05-21 11 views
2

私はoptが必要な単純なllvmプラグインパスを書いて、xxx.soファイルをロードし、ModulePassを実行します。奇妙なことは、debパッケージopt(たとえば、apt-getから、それをopt-3.7と呼ぶ)を使用すると、プラグインが正常に機能することです(欠点はリリースビルドです)。しかし、私はオプトを使用する場合、私は(optそれを呼び出す簡素化)自分自身を構築し、それが頻繁に文句を言う:自己ビルドllvm optの未定義シンボル?

c++filtを使用して
Error opening 'xxx.so': xxx.so: undefined symbol: _ZNK4llvm12FunctionPass17createPrinterPassERNS_11raw_ostreamERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE 

私はoptllvm::FunctionPass::createPrinterPass(llvm::raw_ostream&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) constを見つけることができないことを知っています。

私はパスでFunctionPassを使用していないので、それは非常に奇妙です。これを無視して続けましょう。

私はその後、ldd opt

linux-vdso.so.1 => (0x00007ffd5c1ce000) 
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f16a90d3000) 
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f16a8ea9000) 
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f16a8c8c000) 
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f16a8a72000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f16a86ef000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f16a83e6000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f16a81d0000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f16a7e06000) 
/lib64/ld-linux-x86-64.so.2 (0x00005645f6210000) 

ldd opt-3.7

linux-vdso.so.1 => (0x00007ffc51bc0000) 
libLLVM-3.7.so.1 => /usr/lib/x86_64-linux-gnu/libLLVM-3.7.so.1 (0x00007fec3f725000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fec3f3a2000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fec3efb1000) 
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fec3ed97000) 
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fec3eb79000) 
libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007fec3e971000) 
libedit.so.2 => /usr/lib/x86_64-linux-gnu/libedit.so.2 (0x00007fec3e739000) 
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fec3e50f000) 
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fec3e30b000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fec3e002000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fec3ddeb000) 
/lib64/ld-linux-x86-64.so.2 (0x000055bad2080000) 
libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007fec3dbd6000) 

の結果に違いを確認し、私は推測するので、libLLVM-3.7.so.1ファイルです。

だから私は間違っていませんでしたか?

私のllvmはw/oなしで作成され、-DLLVM_BUILD_LLVM_DYLIB=1はどちらも未定義シンボルの問題があります。

答えて

2

CLANG 3.9でLLVMプラグインを使用した場合とまったく同じエラーが発生しました。 https://github.com/klee/klee/issues/336

LLVMとプラグインで使用されているlibstdC++のABIが異なる点を説明します。この問題を解決するには、プラグインを次のフラグ "-D_GLIBCXX_USE_CXX11_ABI = 0"で再コンパイルする必要があります。

LLVMプラグインのMakefileを例として確認してください:https://github.com/SamAinsworth/reproduce-cgo2017-paper/blob/master/package/plugin-llvm-sw-prefetch-pass/Makefile

関連する問題