无法使用clang与libc ++

时间:2017-09-01 17:21:36

标签: c++ clang clang++ libc++

我正在尝试链接在一起:

  • libFuzzer.a,使用clang ++ - 5.0和-std=c++11
  • 编译
  • 我的fuzz驱动程序,使用clang ++ - 5.0和-std=c++11 -stdlib=libc++
  • 编译
  • libcurl,使用clang-5.0
  • 编译

具体来说,正在执行此链接器命令:

  

/ bin / bash ../../libtool --silent --tag = CXX --mode = link clang ++ - 5.0 -I ../../ include -I ../../ lib -I ../../lib -I ../../ tests / fuzz -fsanitize = address -fsanitize-address-use-after-scope -fsanitize-coverage = trace-pc-guard,trace-cmp -std = c ++ 11 -stdlib = libc ++ -o curl_fuzzer curl_fuzzer-curl_fuzzer.o ../../lib/libcurl.la /root/checkouts/Fuzzer/libFuzzer.a -lssh2 -lssl -lcrypto -lssl -lcrypto -lz -lpthread -lm

执行此命令将输出以下内容:

/bin/bash ../../libtool --silent --tag=CXX   --mode=link clang++-5.0 -I../../include -I../../lib -I../../lib -I../../tests/fuzz -fsanitize=address -fsanitize-address-use-after-scope -fsanitize-coverage=trace-pc-guard,trace-cmp -std=c++11 -stdlib=libc++   -o curl_fuzzer curl_fuzzer-curl_fuzzer.o ../../lib/libcurl.la /root/checkouts/Fuzzer/libFuzzer.a  -lssh2 -lssl -lcrypto -lssl -lcrypto -lz -lpthread -lm > /tmp/cat.txt 2>&1; head -20 /tmp/cat.txt
/root/checkouts/Fuzzer/libFuzzer.a(FuzzerIO.o): In function `fuzzer::FileToVector(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long, bool)':
/root/checkouts/Fuzzer/./FuzzerIO.cpp:34: undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::_Ios_Openmode)'
/root/checkouts/Fuzzer/./FuzzerIO.cpp:40: undefined reference to `std::istream::seekg(long, std::_Ios_Seekdir)'
/root/checkouts/Fuzzer/./FuzzerIO.cpp:41: undefined reference to `std::istream::tellg()'
/root/checkouts/Fuzzer/./FuzzerIO.cpp:47: undefined reference to `std::istream::seekg(long, std::_Ios_Seekdir)'
/root/checkouts/Fuzzer/./FuzzerIO.cpp:49: undefined reference to `std::istream::read(char*, long)'
/root/checkouts/Fuzzer/libFuzzer.a(FuzzerIO.o): In function `~basic_ifstream':
/usr/bin/../lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/fstream:534: undefined reference to `VTT for std::basic_ifstream<char, std::char_traits<char> >'
/usr/bin/../lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/fstream:534: undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::~basic_ifstream()'
/root/checkouts/Fuzzer/libFuzzer.a(FuzzerIO.o): In function `~basic_ios':
/usr/bin/../lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/bits/basic_ios.h:282: undefined reference to `std::ios_base::~ios_base()'
/root/checkouts/Fuzzer/libFuzzer.a(FuzzerIO.o): In function `~basic_ifstream':
/usr/bin/../lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/fstream:534: undefined reference to `VTT for std::basic_ifstream<char, std::char_traits<char> >'
/usr/bin/../lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/fstream:534: undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::~basic_ifstream()'
/root/checkouts/Fuzzer/libFuzzer.a(FuzzerIO.o): In function `~basic_ios':
/usr/bin/../lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/bits/basic_ios.h:282: undefined reference to `std::ios_base::~ios_base()'
/root/checkouts/Fuzzer/libFuzzer.a(FuzzerIO.o): In function `fuzzer::FileToString(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
/root/checkouts/Fuzzer/./FuzzerIO.cpp:54: undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::_Ios_Openmode)'
/root/checkouts/Fuzzer/libFuzzer.a(FuzzerIO.o): In function `~basic_ifstream':
/usr/bin/../lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/fstream:534: undefined reference to `VTT for std::basic_ifstream<char, std::char_traits<char> >'
<snip>

我已尝试执行以下操作来解决此问题:

  • 添加-lc++ - 没有做任何事情
  • 添加-lc++abi - 没有做任何事情

感觉我错过了一些明显的东西,但我不确定是什么......

我对clang-5.0的安装来自clang-5.0/kali-rolling

3 个答案:

答案 0 :(得分:1)

您已使用libstdc ++编译部分代码,并使用libc ++编译部分代码。当你将它们链接在一起时(使用libc ++),引用libstdc ++的部分不会得到解决。

例如,admin/first_page#index绝对是libstdc ++符号。

答案 1 :(得分:0)

无论出于什么原因,kali的clang-5.0版本都没有正确地将二进制文件与libc ++链接起来。我使用google的clang(clang-6.0)的ossfuzz版本测试了相同的代码,并且所有内容都成功链接在一起。

答案 2 :(得分:0)

提到的 OP(2017 年):

<块引用>

无论出于何种原因,kali 的 clang-5.0 版本似乎都没有将二进制文件与 libc++ 正确链接。
我使用 google 的 ossfuzz 版本的 clang (clang-6.0) 测试了相同的代码,并且所有内容都成功链接在一起。

当时需要libstdc++
但是现在,从当前的 LibFuzzer documentation(2021 年 3 月)

<块引用>

Clang 的最新版本(从 6.0 开始)包括 libFuzzer,无需额外安装。

Git 2.31.1(2021 年第一季度)引用了相同的 LibFuzzer 11.0 documentation section

请参阅 commit 68b5c3aAndrzej Hunt (ahunt)(2021 年 3 月 8 日)。
(由 Junio C Hamano -- gitster --commit af10702 合并,2021 年 3 月 19 日)

<块引用>

Makefile:更新“make fuzz-all”文档以反映现代 clang

签字人:Andrzej Hunt

<块引用>

Clang 不再产生 libFuzzer.a
相反,您可以使用 -fsanitize=fuzzer 来包含 libFuzzer。
因此,我们应该在示例命令中使用它来构建模糊器。

我们还将 -fsanitize=fuzzer-no-link 添加到 CFLAGS 以确保在编译 git 1 时添加所有必需的检测,并删除 -fsanitize-coverage=trace-pc-guard,因为它已被弃用。

我碰巧用 LLVM 11 进行了测试 - 但是 -fsanitize=fuzzer 似乎适用于各种合理的现代叮当声。

(在我的系统上:以前的 libFuzzer.a 现在位于以下路径下,这很棘手,尽管对于我这样的新手来说并非不可能:
/usr/lib64/clang/11.0.0/lib/linux/libclang_rt.fuzzer-x86_64.a )