Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Trying to use remill (with cxx-commons precompiled vcpkg packages) #560

Open
idkreally785 opened this issue Nov 14, 2021 · 1 comment
Open

Comments

@idkreally785
Copy link

Hello, I just switched to Ubuntu (20.04) a couple of days ago and now I'm using the CLion IDE here. I'm trying to create a project using remill and LLVM, but I ran into a problem when creating the CMakeList. I have an example to get it started, but when I tried to recreate it, I realized that I can't link the libraries from the LLVM downloaded from cxx-common (v0.1.5, vcpkg_ubuntu-20.04_llvm-12_amd64.tar.xz). What should I do, maybe there are some repositories that show how to connect it all?

I've tried a lot of options, but here's my last one

cmake_minimum_required(VERSION 3.20)
project(idk)

set(CMAKE_CXX_STANDARD 20)

set(LLVM_PATH /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel)
link_directories(${LLVM_PATH}/lib)
include_directories(${LLVM_PATH}/include)

set(SOURCES source/main.cpp)
add_executable(idk ${SOURCES})
target_link_libraries(idk
        libLLVMAArch64Utils.a
        libLLVMMCJIT.a
        libLLVMOrcJIT.a
        libLLVMBitReader.a
        libLLVMAArch64CodeGen.a
        libLLVMDWARFLinker.a
        libLLVMDebugInfoPDB.a
        libLLVMOption.a
        libLLVMSymbolize.a
        libLLVMObjectYAML.a
        libLLVMDlltoolDriver.a
        libLLVMARMAsmParser.a
        libLLVMScalarOpts.a
        libLLVMInterfaceStub.a
        libLLVMSparcCodeGen.a
        libLLVMOrcTargetProcess.a
        libLLVMDemangle.a
        libLLVMX86AsmParser.a
        libLLVMXRay.a
        libLLVMTableGen.a
        libLLVMVectorize.a
        libLLVMFrontendOpenMP.a
        libLLVMExecutionEngine.a
        libLLVMInstrumentation.a
        libLLVMWindowsManifest.a
        libLLVMAArch64Info.a
        libLLVMLibDriver.a
        libLLVMLTO.a
        libLLVMDebugInfoCodeView.a
        libLLVMARMInfo.a
        libLLVMExtensions.a
        libLLVMIRReader.a
        libLLVMLinker.a
        libLLVMFileCheck.a
        libLLVMTransformUtils.a
        libLLVMJITLink.a
        libLLVMARMUtils.a
        libLLVMRemarks.a
        libLLVMNVPTXCodeGen.a
        libLLVMRuntimeDyld.a
        libLLVMX86Info.a
        libLLVMObjCARCOpts.a
        libLLVMARMCodeGen.a
        libLLVMCFGuard.a
        libLLVMFrontendOpenACC.a
        libLLVMProfileData.a
        libLLVMSparcDisassembler.a
        libLLVMBinaryFormat.a
        libLLVMCodeGen.a
        libLLVMBitWriter.a
        libLLVMTarget.a
        libLLVMMC.a
        libLLVMFuzzMutate.a
        libLLVMNVPTXDesc.a
        libLLVMCoroutines.a
        libLLVMMCDisassembler.a
        libLLVMMIRParser.a
        libLLVMDebugInfoGSYM.a
        libLLVMAArch64Disassembler.a
        libLLVMAArch64AsmParser.a
        libLLVMARMDesc.a
        libLLVMSupport.a
        libLLVMX86Desc.a
        libLLVMOrcShared.a
        libLLVMNVPTXInfo.a
        libLLVMLineEditor.a
        libLLVMHelloNew.a
        libLLVMDebugInfoMSF.a
        libLLVMCore.a
        libLLVMX86Disassembler.a
        libLLVMAArch64Desc.a
        libLLVMMCParser.a
        libLLVMAsmParser.a
        libLLVMSelectionDAG.a
        libLLVMInstCombine.a
        libLLVMSparcAsmParser.a
        libLLVMAnalysis.a
        libLLVMARMDisassembler.a
        libLLVMX86CodeGen.a
        libLLVMPasses.a
        libLLVMAggressiveInstCombine.a
        libLLVMipo.a
        libLLVMObject.a
        libLLVMCoverage.a
        libLLVMGlobalISel.a
        libLLVMSparcInfo.a
        libLLVMAsmPrinter.a
        libLLVMTextAPI.a
        libLLVMMCA.a
        libLLVMSparcDesc.a
        libLLVMBitstreamReader.a
        libLLVMInterpreter.a
        libLLVMDebugInfoDWARF.a
        )

Here is my main.cpp (located in source folder)

#include <llvm/IR/LLVMContext.h>

int main() {
    llvm::LLVMContext context;

    return 0;
}

Here's part of the output I get (besides these, there are hundreds more lines of "undefined reference to" errors)

4_S4_DpOT_[_ZN4llvm12handleErrorsIJZNS_24LLVMRemarkSetupErrorInfoINS_26LLVMRemarkSetupFormatErrorEEC1ENS_5ErrorEEUlRKNS_13ErrorInfoBaseEE_EEES4_S4_DpOT_]+0x2e): undefined reference to `llvm::ErrorList::ID'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(LLVMRemarkStreamer.cpp.o): in function `llvm::ErrorList::join(llvm::Error, llvm::Error)':
LLVMRemarkStreamer.cpp:(.text._ZN4llvm9ErrorList4joinENS_5ErrorES1_[_ZN4llvm9ErrorList4joinENS_5ErrorES1_]+0x34): undefined reference to `llvm::ErrorList::ID'
/usr/bin/ld: LLVMRemarkStreamer.cpp:(.text._ZN4llvm9ErrorList4joinENS_5ErrorES1_[_ZN4llvm9ErrorList4joinENS_5ErrorES1_]+0x59): undefined reference to `llvm::ErrorList::ID'
/usr/bin/ld: LLVMRemarkStreamer.cpp:(.text._ZN4llvm9ErrorList4joinENS_5ErrorES1_[_ZN4llvm9ErrorList4joinENS_5ErrorES1_]+0xe8): undefined reference to `llvm::ErrorList::ID'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(LLVMRemarkStreamer.cpp.o): in function `llvm::Error llvm::handleErrorImpl<llvm::LLVMRemarkSetupErrorInfo<llvm::LLVMRemarkSetupFormatError>::LLVMRemarkSetupErrorInfo(llvm::Error)::{lambda(llvm::ErrorInfoBase const&)#1}>(std::unique_ptr<llvm::ErrorInfoBase, std::default_delete<llvm::ErrorInfoBase> >, llvm::LLVMRemarkSetupErrorInfo<llvm::LLVMRemarkSetupFormatError>::LLVMRemarkSetupErrorInfo(llvm::Error)::{lambda(llvm::ErrorInfoBase const&)#1}&&)':
LLVMRemarkStreamer.cpp:(.text._ZN4llvm15handleErrorImplIZNS_24LLVMRemarkSetupErrorInfoINS_26LLVMRemarkSetupFormatErrorEEC1ENS_5ErrorEEUlRKNS_13ErrorInfoBaseEE_JEEES4_St10unique_ptrIS5_St14default_deleteIS5_EEOT_DpOT0_[_ZN4llvm15handleErrorImplIZNS_24LLVMRemarkSetupErrorInfoINS_26LLVMRemarkSetupFormatErrorEEC1ENS_5ErrorEEUlRKNS_13ErrorInfoBaseEE_JEEES4_St10unique_ptrIS5_St14default_deleteIS5_EEOT_DpOT0_]+0x1d): undefined reference to `llvm::ErrorInfoBase::ID'
/usr/bin/ld: LLVMRemarkStreamer.cpp:(.text._ZN4llvm15handleErrorImplIZNS_24LLVMRemarkSetupErrorInfoINS_26LLVMRemarkSetupFormatErrorEEC1ENS_5ErrorEEUlRKNS_13ErrorInfoBaseEE_JEEES4_St10unique_ptrIS5_St14default_deleteIS5_EEOT_DpOT0_[_ZN4llvm15handleErrorImplIZNS_24LLVMRemarkSetupErrorInfoINS_26LLVMRemarkSetupFormatErrorEEC1ENS_5ErrorEEUlRKNS_13ErrorInfoBaseEE_JEEES4_St10unique_ptrIS5_St14default_deleteIS5_EEOT_DpOT0_]+0x39): undefined reference to `llvm::ErrorInfoBase::ID'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(LLVMRemarkStreamer.cpp.o): in function `llvm::ErrorList::ErrorList(std::unique_ptr<llvm::ErrorInfoBase, std::default_delete<llvm::ErrorInfoBase> >, std::unique_ptr<llvm::ErrorInfoBase, std::default_delete<llvm::ErrorInfoBase> >)':
LLVMRemarkStreamer.cpp:(.text._ZN4llvm9ErrorListC2ESt10unique_ptrINS_13ErrorInfoBaseESt14default_deleteIS2_EES5_[_ZN4llvm9ErrorListC2ESt10unique_ptrINS_13ErrorInfoBaseESt14default_deleteIS2_EES5_]+0x14): undefined reference to `vtable for llvm::ErrorList'
/usr/bin/ld: LLVMRemarkStreamer.cpp:(.text._ZN4llvm9ErrorListC2ESt10unique_ptrINS_13ErrorInfoBaseESt14default_deleteIS2_EES5_[_ZN4llvm9ErrorListC2ESt10unique_ptrINS_13ErrorInfoBaseESt14default_deleteIS2_EES5_]+0x3b): undefined reference to `llvm::ErrorList::ID'
/usr/bin/ld: LLVMRemarkStreamer.cpp:(.text._ZN4llvm9ErrorListC2ESt10unique_ptrINS_13ErrorInfoBaseESt14default_deleteIS2_EES5_[_ZN4llvm9ErrorListC2ESt10unique_ptrINS_13ErrorInfoBaseESt14default_deleteIS2_EES5_]+0x4f): undefined reference to `llvm::ErrorList::ID'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(LLVMRemarkStreamer.cpp.o): in function `llvm::LLVMRemarkSetupErrorInfo<llvm::LLVMRemarkSetupFileError>::log(llvm::raw_ostream&) const':
LLVMRemarkStreamer.cpp:(.text._ZNK4llvm24LLVMRemarkSetupErrorInfoINS_24LLVMRemarkSetupFileErrorEE3logERNS_11raw_ostreamE[_ZNK4llvm24LLVMRemarkSetupErrorInfoINS_24LLVMRemarkSetupFileErrorEE3logERNS_11raw_ostreamE]+0xf): undefined reference to `llvm::raw_ostream::write(char const*, unsigned long)'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(LLVMRemarkStreamer.cpp.o): in function `llvm::ErrorInfo<llvm::LLVMRemarkSetupFileError, llvm::ErrorInfoBase>::isA(void const*) const':
LLVMRemarkStreamer.cpp:(.text._ZNK4llvm9ErrorInfoINS_24LLVMRemarkSetupFileErrorENS_13ErrorInfoBaseEE3isAEPKv[_ZNK4llvm9ErrorInfoINS_24LLVMRemarkSetupFileErrorENS_13ErrorInfoBaseEE3isAEPKv]+0xd): undefined reference to `llvm::ErrorInfoBase::ID'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(LLVMRemarkStreamer.cpp.o): in function `llvm::Error llvm::handleErrors<llvm::LLVMRemarkSetupErrorInfo<llvm::LLVMRemarkSetupFileError>::LLVMRemarkSetupErrorInfo(llvm::Error)::{lambda(llvm::ErrorInfoBase const&)#1}>(llvm::Error, llvm::LLVMRemarkSetupErrorInfo<llvm::LLVMRemarkSetupFileError>::LLVMRemarkSetupErrorInfo(llvm::Error)::{lambda(llvm::ErrorInfoBase const&)#1}&&)':
LLVMRemarkStreamer.cpp:(.text._ZN4llvm12handleErrorsIJZNS_24LLVMRemarkSetupErrorInfoINS_24LLVMRemarkSetupFileErrorEEC1ENS_5ErrorEEUlRKNS_13ErrorInfoBaseEE_EEES4_S4_DpOT_[_ZN4llvm12handleErrorsIJZNS_24LLVMRemarkSetupErrorInfoINS_24LLVMRemarkSetupFileErrorEEC1ENS_5ErrorEEUlRKNS_13ErrorInfoBaseEE_EEES4_S4_DpOT_]+0x2e): undefined reference to `llvm::ErrorList::ID'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(LLVMRemarkStreamer.cpp.o): in function `llvm::Error llvm::handleErrorImpl<llvm::LLVMRemarkSetupErrorInfo<llvm::LLVMRemarkSetupFileError>::LLVMRemarkSetupErrorInfo(llvm::Error)::{lambda(llvm::ErrorInfoBase const&)#1}>(std::unique_ptr<llvm::ErrorInfoBase, std::default_delete<llvm::ErrorInfoBase> >, llvm::LLVMRemarkSetupErrorInfo<llvm::LLVMRemarkSetupFileError>::LLVMRemarkSetupErrorInfo(llvm::Error)::{lambda(llvm::ErrorInfoBase const&)#1}&&)':
LLVMRemarkStreamer.cpp:(.text._ZN4llvm15handleErrorImplIZNS_24LLVMRemarkSetupErrorInfoINS_24LLVMRemarkSetupFileErrorEEC1ENS_5ErrorEEUlRKNS_13ErrorInfoBaseEE_JEEES4_St10unique_ptrIS5_St14default_deleteIS5_EEOT_DpOT0_[_ZN4llvm15handleErrorImplIZNS_24LLVMRemarkSetupErrorInfoINS_24LLVMRemarkSetupFileErrorEEC1ENS_5ErrorEEUlRKNS_13ErrorInfoBaseEE_JEEES4_St10unique_ptrIS5_St14default_deleteIS5_EEOT_DpOT0_]+0x1d): undefined reference to `llvm::ErrorInfoBase::ID'
/usr/bin/ld: LLVMRemarkStreamer.cpp:(.text._ZN4llvm15handleErrorImplIZNS_24LLVMRemarkSetupErrorInfoINS_24LLVMRemarkSetupFileErrorEEC1ENS_5ErrorEEUlRKNS_13ErrorInfoBaseEE_JEEES4_St10unique_ptrIS5_St14default_deleteIS5_EEOT_DpOT0_[_ZN4llvm15handleErrorImplIZNS_24LLVMRemarkSetupErrorInfoINS_24LLVMRemarkSetupFileErrorEEC1ENS_5ErrorEEUlRKNS_13ErrorInfoBaseEE_JEEES4_St10unique_ptrIS5_St14default_deleteIS5_EEOT_DpOT0_]+0x39): undefined reference to `llvm::ErrorInfoBase::ID'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(LLVMRemarkStreamer.cpp.o): in function `llvm::LLVMRemarkSetupErrorInfo<llvm::LLVMRemarkSetupPatternError>::log(llvm::raw_ostream&) const':
LLVMRemarkStreamer.cpp:(.text._ZNK4llvm24LLVMRemarkSetupErrorInfoINS_27LLVMRemarkSetupPatternErrorEE3logERNS_11raw_ostreamE[_ZNK4llvm24LLVMRemarkSetupErrorInfoINS_27LLVMRemarkSetupPatternErrorEE3logERNS_11raw_ostreamE]+0xf): undefined reference to `llvm::raw_ostream::write(char const*, unsigned long)'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(LLVMRemarkStreamer.cpp.o): in function `llvm::ErrorInfo<llvm::LLVMRemarkSetupPatternError, llvm::ErrorInfoBase>::isA(void const*) const':
LLVMRemarkStreamer.cpp:(.text._ZNK4llvm9ErrorInfoINS_27LLVMRemarkSetupPatternErrorENS_13ErrorInfoBaseEE3isAEPKv[_ZNK4llvm9ErrorInfoINS_27LLVMRemarkSetupPatternErrorENS_13ErrorInfoBaseEE3isAEPKv]+0xd): undefined reference to `llvm::ErrorInfoBase::ID'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(LLVMRemarkStreamer.cpp.o): in function `llvm::Error llvm::handleErrors<llvm::LLVMRemarkSetupErrorInfo<llvm::LLVMRemarkSetupPatternError>::LLVMRemarkSetupErrorInfo(llvm::Error)::{lambda(llvm::ErrorInfoBase const&)#1}>(llvm::Error, llvm::LLVMRemarkSetupErrorInfo<llvm::LLVMRemarkSetupPatternError>::LLVMRemarkSetupErrorInfo(llvm::Error)::{lambda(llvm::ErrorInfoBase const&)#1}&&)':
LLVMRemarkStreamer.cpp:(.text._ZN4llvm12handleErrorsIJZNS_24LLVMRemarkSetupErrorInfoINS_27LLVMRemarkSetupPatternErrorEEC1ENS_5ErrorEEUlRKNS_13ErrorInfoBaseEE_EEES4_S4_DpOT_[_ZN4llvm12handleErrorsIJZNS_24LLVMRemarkSetupErrorInfoINS_27LLVMRemarkSetupPatternErrorEEC1ENS_5ErrorEEUlRKNS_13ErrorInfoBaseEE_EEES4_S4_DpOT_]+0x2e): undefined reference to `llvm::ErrorList::ID'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(LLVMRemarkStreamer.cpp.o): in function `llvm::Error llvm::handleErrorImpl<llvm::LLVMRemarkSetupErrorInfo<llvm::LLVMRemarkSetupPatternError>::LLVMRemarkSetupErrorInfo(llvm::Error)::{lambda(llvm::ErrorInfoBase const&)#1}>(std::unique_ptr<llvm::ErrorInfoBase, std::default_delete<llvm::ErrorInfoBase> >, llvm::LLVMRemarkSetupErrorInfo<llvm::LLVMRemarkSetupPatternError>::LLVMRemarkSetupErrorInfo(llvm::Error)::{lambda(llvm::ErrorInfoBase const&)#1}&&)':
LLVMRemarkStreamer.cpp:(.text._ZN4llvm15handleErrorImplIZNS_24LLVMRemarkSetupErrorInfoINS_27LLVMRemarkSetupPatternErrorEEC1ENS_5ErrorEEUlRKNS_13ErrorInfoBaseEE_JEEES4_St10unique_ptrIS5_St14default_deleteIS5_EEOT_DpOT0_[_ZN4llvm15handleErrorImplIZNS_24LLVMRemarkSetupErrorInfoINS_27LLVMRemarkSetupPatternErrorEEC1ENS_5ErrorEEUlRKNS_13ErrorInfoBaseEE_JEEES4_St10unique_ptrIS5_St14default_deleteIS5_EEOT_DpOT0_]+0x1d): undefined reference to `llvm::ErrorInfoBase::ID'
/usr/bin/ld: LLVMRemarkStreamer.cpp:(.text._ZN4llvm15handleErrorImplIZNS_24LLVMRemarkSetupErrorInfoINS_27LLVMRemarkSetupPatternErrorEEC1ENS_5ErrorEEUlRKNS_13ErrorInfoBaseEE_JEEES4_St10unique_ptrIS5_St14default_deleteIS5_EEOT_DpOT0_[_ZN4llvm15handleErrorImplIZNS_24LLVMRemarkSetupErrorInfoINS_27LLVMRemarkSetupPatternErrorEEC1ENS_5ErrorEEUlRKNS_13ErrorInfoBaseEE_JEEES4_St10unique_ptrIS5_St14default_deleteIS5_EEOT_DpOT0_]+0x39): undefined reference to `llvm::ErrorInfoBase::ID'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(LLVMRemarkStreamer.cpp.o):(.data.rel.ro._ZTVN4llvm26LLVMRemarkSetupFormatErrorE[_ZTVN4llvm26LLVMRemarkSetupFormatErrorE]+0x48): undefined reference to `llvm::ErrorInfoBase::anchor()'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(LLVMRemarkStreamer.cpp.o):(.data.rel.ro._ZTIN4llvm9ErrorInfoINS_26LLVMRemarkSetupFormatErrorENS_13ErrorInfoBaseEEE[_ZTIN4llvm9ErrorInfoINS_26LLVMRemarkSetupFormatErrorENS_13ErrorInfoBaseEEE]+0x10): undefined reference to `typeinfo for llvm::ErrorInfoBase'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(LLVMRemarkStreamer.cpp.o):(.data.rel.ro._ZTVN4llvm24LLVMRemarkSetupErrorInfoINS_26LLVMRemarkSetupFormatErrorEEE[_ZTVN4llvm24LLVMRemarkSetupErrorInfoINS_26LLVMRemarkSetupFormatErrorEEE]+0x48): undefined reference to `llvm::ErrorInfoBase::anchor()'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(LLVMRemarkStreamer.cpp.o):(.data.rel.ro._ZTVN4llvm24LLVMRemarkSetupFileErrorE[_ZTVN4llvm24LLVMRemarkSetupFileErrorE]+0x48): undefined reference to `llvm::ErrorInfoBase::anchor()'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(LLVMRemarkStreamer.cpp.o):(.data.rel.ro._ZTIN4llvm9ErrorInfoINS_24LLVMRemarkSetupFileErrorENS_13ErrorInfoBaseEEE[_ZTIN4llvm9ErrorInfoINS_24LLVMRemarkSetupFileErrorENS_13ErrorInfoBaseEEE]+0x10): undefined reference to `typeinfo for llvm::ErrorInfoBase'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(LLVMRemarkStreamer.cpp.o):(.data.rel.ro._ZTVN4llvm24LLVMRemarkSetupErrorInfoINS_24LLVMRemarkSetupFileErrorEEE[_ZTVN4llvm24LLVMRemarkSetupErrorInfoINS_24LLVMRemarkSetupFileErrorEEE]+0x48): undefined reference to `llvm::ErrorInfoBase::anchor()'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(LLVMRemarkStreamer.cpp.o):(.data.rel.ro._ZTVN4llvm27LLVMRemarkSetupPatternErrorE[_ZTVN4llvm27LLVMRemarkSetupPatternErrorE]+0x48): undefined reference to `llvm::ErrorInfoBase::anchor()'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(LLVMRemarkStreamer.cpp.o):(.data.rel.ro._ZTIN4llvm9ErrorInfoINS_27LLVMRemarkSetupPatternErrorENS_13ErrorInfoBaseEEE[_ZTIN4llvm9ErrorInfoINS_27LLVMRemarkSetupPatternErrorENS_13ErrorInfoBaseEEE]+0x10): undefined reference to `typeinfo for llvm::ErrorInfoBase'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(LLVMRemarkStreamer.cpp.o):(.data.rel.ro._ZTVN4llvm24LLVMRemarkSetupErrorInfoINS_27LLVMRemarkSetupPatternErrorEEE[_ZTVN4llvm24LLVMRemarkSetupErrorInfoINS_27LLVMRemarkSetupPatternErrorEEE]+0x48): undefined reference to `llvm::ErrorInfoBase::anchor()'
/usr/bin/ld: /home/idkreally785/third_party_libs/vcpkg_llvm12_amd64/installed/x64-linux-rel/lib/libLLVMCore.a(Metadata.cpp.o): in function `llvm::ReplaceableMetadataImpl::replaceAllUsesWith(llvm::Metadata*)':
Metadata.cpp:(.text._ZN4llvm23ReplaceableMetadataImpl18replaceAllUsesWithEPNS_8MetadataE+0x853): undefined reference to `llvm::llvm_unreachable_internal(char const*, char const*, unsigned int)'
@pgoodman
Copy link
Collaborator

pgoodman commented Nov 14, 2021

This is my process:

Build and install

My directory layout, update as you see fit.

~/Code/remill
~/Code/anvill
~/Build/remill-release
~/Build/anvill-release
~/Build/vcpkg-12-release

Create a virtual environment:

python3 -m venv ~/Build/install-release

Activate the virtual environment so that your PATH variables are up-to-date.

source ~/Build/install-release/bin/activate

Go into build directory for a release build of Remill.

cd ~/Build/remill-release

Compile Remill. Specifying clang is important if you're building on macOS. You're on Ubuntu so you can probably just ignore the manual specification of the C and CXX compilers for CMake. Be sure to change the VCPKG_ROOT and VCPKG_TARGET_TRIPLET for your own system!

cmake \
  -DCMAKE_BUILD_TYPE=RelWithDebInfo \
  -DCMAKE_INSTALL_PREFIX=/Users/pag/Build/install-release \
  -DVCPKG_ROOT=/Users/pag/Build/vcpkg-12-release \
  -DVCPKG_TARGET_TRIPLET=x64-osx-rel \
  -DCMAKE_C_COMPILER=`which clang` \
  -DCMAKE_CXX_COMPILER=`which clang++` \
  ~/Code/remill

Then you build and install that, and it installs into ~/Build/install-release.

Here's Anvill following the same process:

  -DCMAKE_BUILD_TYPE=RelWithDebInfo \
  -DCMAKE_INSTALL_PREFIX=/Users/pag/Build/install-release \
  -DVCPKG_ROOT=/Users/pag/Build/vcpkg-12-release \
  -DVCPKG_TARGET_TRIPLET=x64-osx-rel \
  -DCMAKE_C_COMPILER=`which clang` \
  -DCMAKE_CXX_COMPILER=`which clang++` \
  ~/Code/anvill

Build and install that. Then, if you have Binary Ninja, do roughly the following to install the Binary Ninja API into the virtual environment:

python3 /Applications/Binary\ Ninja.app/Contents/Resources/scripts/install_api.py -v

That -v switch says "install binary ninja into my virtual environment"

Now you have remill and anvill installed. Next up, using it.

Integrate into another project

Right now, all of our projects that integrate with our vcpkg dependencies go and use copies of vcpkg_helper.cmake. I think @ekilmer might want to change this in the future, but this works for now.

Here's what a typical CMakeLists.txt should look like that uses Remill:

cmake_minimum_required(VERSION 3.19)

include("cmake/options.cmake")
include("cmake/ccache.cmake")
include("cmake/vcpkg_helper.cmake")

project("project_name")

include(GNUInstallDirs)
include("cmake/system.cmake")
include("cmake/target_settings.cmake")
include("cmake/llvm.cmake")

if(ENABLE_INSTALL)
  include("cmake/packaging.cmake")
endif()

set(_VCPKG_SHARE_DIR "${VCPKG_ROOT}/installed/${VCPKG_TARGET_TRIPLET}/${CMAKE_INSTALL_DATADIR}")

find_package(XED CONFIG REQUIRED HINTS "${_VCPKG_SHARE_DIR}")
find_package(gflags CONFIG REQUIRED HINTS "${_VCPKG_SHARE_DIR}")
find_package(glog CONFIG REQUIRED HINTS "${_VCPKG_SHARE_DIR}")
find_package(Z3 4.8.12.0 EXACT CONFIG REQUIRED)
find_llvm(llvm "${_VCPKG_SHARE_DIR}")

find_package(remill CONFIG REQUIRED)
find_package(anvill CONFIG REQUIRED)

if(ENABLE_INSTALL)
  export(PACKAGE "${PROJECT_NAME}")
  
  set(cmake_install_dir "lib/cmake/${PROJECT_NAME}")
  
  include(CMakePackageConfigHelpers)
  configure_package_config_file("${PROJECT_NAME}Config.cmake.in"
      "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
      INSTALL_DESTINATION "${cmake_install_dir}"
  )

  install(EXPORT "${PROJECT_NAME}Targets"
      DESTINATION "${cmake_install_dir}"
      NAMESPACE "${PROJECT_NAME}::"
  )
  install(
    TARGETS
      "llvm"
    EXPORT
      "${PROJECT_NAME}Targets"
  )
endif()

add_subdirectory("blah")

and llvm.cmake:

#
# Copyright (c) 2021-present, Trail of Bits, Inc.
# All rights reserved.
#
# This source code is licensed in accordance with the terms specified in
# the LICENSE file found in the root directory of this source tree.
#

function(find_llvm target_name hint_dir)
  
  find_package(llvm CONFIG REQUIRED HINTS "${hint_dir}")
  
  add_library("${target_name}" INTERFACE)
  target_include_directories("${target_name}" SYSTEM INTERFACE
    $<BUILD_INTERFACE:${LLVM_INCLUDE_DIRS}>
  )
  target_compile_definitions("${target_name}" INTERFACE
    ${LLVM_DEFINITIONS}
  )
  
  # Go find only the static libraries of LLVM, and link against those.
  foreach(LLVM_LIB IN LISTS LLVM_AVAILABLE_LIBS)
    get_target_property(LLVM_LIB_TYPE ${LLVM_LIB} TYPE)
    if(LLVM_LIB_TYPE STREQUAL "STATIC_LIBRARY")
      list(APPEND LLVM_LIBRARIES "${LLVM_LIB}")
    endif()
  endforeach()
  
  # These are out-of-order in `LLVM_AVAILABLE_LIBS` and should always be last.
  list(REMOVE_ITEM LLVM_LIBRARIES LLVMMC LLVMCore LLVMSupport)
  list(APPEND LLVM_LIBRARIES LLVMMC LLVMCore LLVMSupport)
  
  target_link_libraries("${target_name}" INTERFACE
    ${LLVM_LIBRARIES}
  )

endfunction(find_llvm)

Usage:

target_link_libraries("my_target_name"
  PUBLIC
    llvm
    remill
    anvill
)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants