avast / retdec

RetDec is a retargetable machine-code decompiler based on LLVM.
https://retdec.com/
MIT License
8k stars 946 forks source link

Linking of retdec-bin2llvmir fails on Kali Linux due to undefined references in demangler #466

Closed ghost closed 5 years ago

ghost commented 5 years ago

When I try to build RetDec on Kali, I get this error:

frinto@kali:~/Documents/retdec/build$ make -j2
[  1%] Built target capstone-project
[  1%] Built target jsoncpp-project
[  2%] Built target rapidjson-project
[  3%] Built target llvm-project
[  5%] Built target elfio-project
[  5%] Built target tinyxml2-project
[  6%] Built target pelib-project
[  7%] Built target libdwarf-project
[  9%] Built target yaramod-project
[  9%] Built target yaracpp-project
[ 10%] Built target retdec-pdbparser
[ 10%] Built target whereami
[ 11%] Built target retdec-utils
[ 11%] Built target retdec-ar-extractor
[ 12%] Built target retdec-capstone2llvmir
[ 15%] Built target retdec-config
[ 15%] Built target retdec-crypto
[ 19%] Built target retdec-ctypes
[ 20%] Built target retdec-demangler
[ 20%] Built target retdec-llvm-support
[ 20%] Built target retdec-configtool
[ 28%] Built target retdec-fileformat
[ 28%] Built target retdec-idr2pat
[ 28%] Built target retdec-macho-extractor
[ 28%] Built target retdec-getsig
[ 29%] Built target retdec-ar-extractortool
[ 29%] Built target retdec-ctypesparser
[ 30%] Built target retdec-dwarfparser
[ 66%] Built target retdec-llvmir2hll
[ 67%] Built target retdec-patterngen
[ 69%] Built target retdec-loader
[ 69%] Built target retdec-llvmir2hlltool
[ 71%] Built target retdec-cpdetect
[ 72%] Built target retdec-macho-extractortool
[ 72%] Built target retdec-pat2yara
[ 73%] Built target retdec-unpacker
[ 74%] Built target retdec-debugformat
[ 75%] Built target retdec-stacofin
[ 75%] Built target retdec-rtti-finder
[ 75%] Built target retdec-bin2pat
[ 75%] Built target retdec-stacofintool
[ 75%] Built target retdec-unpacker-mpress
[ 76%] Built target retdec-unpacker-upx
[ 77%] Built target retdec-unpacker-example
[ 89%] Built target retdec-fileinfo
[ 90%] Built target retdec-unpackertool
[ 99%] Built target retdec-bin2llvmir
[ 99%] Linking CXX executable retdec-bin2llvmir
/usr/bin/ld: ../demangler/libretdec-demangler.a(demangler.cpp.o): in function `retdec::demangler::CDemangler::CDemangler(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)':
demangler.cpp:(.text+0xb2): undefined reference to `retdec::demangler::cGram::cGram()'
/usr/bin/ld: demangler.cpp:(.text+0x170): undefined reference to `retdec::demangler::cGram::initialize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)'
/usr/bin/ld: ../demangler/libretdec-demangler.a(demangler.cpp.o): in function `retdec::demangler::CDemangler::createGrammar(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
demangler.cpp:(.text+0x628): undefined reference to `retdec::demangler::cGram::generateIgrammar(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
/usr/bin/ld: ../demangler/libretdec-demangler.a(demangler.cpp.o): in function `retdec::demangler::CDemangler::demangleToClass(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
demangler.cpp:(.text+0x7bb): undefined reference to `retdec::demangler::cGram::perform(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, retdec::demangler::cGram::errcode*)'
/usr/bin/ld: ../demangler/libretdec-demangler.a(demangler.cpp.o): in function `retdec::demangler::CDemangler::demangleToString(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
demangler.cpp:(.text+0x920): undefined reference to `retdec::demangler::cGram::perform(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, retdec::demangler::cGram::errcode*)'
/usr/bin/ld: demangler.cpp:(.text+0x9af): undefined reference to `retdec::demangler::cName::printall(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
/usr/bin/ld: ../demangler/libretdec-demangler.a(demangler.cpp.o): in function `retdec::demangler::CDemangler::setSubAnalyze(bool)':
demangler.cpp:(.text+0xbc9): undefined reference to `retdec::demangler::cGram::setSubAnalyze(bool)'
collect2: error: ld returned 1 exit status
make[2]: *** [src/bin2llvmirtool/CMakeFiles/retdec-bin2llvmirtool.dir/build.make:142: src/bin2llvmirtool/retdec-bin2llvmir] Error 1
make[1]: *** [CMakeFiles/Makefile2:1140: src/bin2llvmirtool/CMakeFiles/retdec-bin2llvmirtool.dir/all] Error 2
make: *** [Makefile:130: all] Error 2

I have zero experience with ld error handling, so I can really use some help right now...

s3rvac commented 5 years ago

Hi. Unfortunately, I am unable to reproduce this on Kali Linux in Docker via the following Dockerfile:

FROM kalilinux/kali-linux-docker

RUN apt-get -y update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y   \
    build-essential                                     \
    cmake                                               \
    git                                                 \
    perl                                                \
    python3                                             \
    doxygen                                             \
    graphviz                                            \
    upx                                                 \
    flex                                                \
    bison                                               \
    zlib1g-dev                                          \
    autoconf                                            \
    automake                                            \
    pkg-config                                          \
    m4                                                  \
    libtool

RUN git clone https://github.com/avast-tl/retdec && \
    cd retdec && \
    mkdir build && \
    cd build && \
    cmake .. -DCMAKE_INSTALL_PREFIX=/home/retdec/retdec-install && \
    make -j$(nproc) && \
    make install

The build has succeeded for me.

What compiler and which version do you use? This information should be printed when running cmake .. for the first time in the build directory. In my Kali Docker container, it has printed

-- The C compiler identification is GNU 8.2.0
-- The CXX compiler identification is GNU 8.2.0
ghost commented 5 years ago

Hey, I got it to work. I just removed the build directory and restarted from scratch. Thanks for trying to help!

s3rvac commented 5 years ago

Then I am not sure what has caused this (I have never seen that error before when building RetDec). Maybe CMake has somehow ordered the linking dependencies in an incorrect order. Anyway, I am glad that the build has succeeded for you.