[libcxx] r192074 - Eliminate more symbols multiply defined betweenlibsupc++ and libc++.
Peter Collingbourne
peter at pcc.me.uk
Tue Oct 8 10:48:13 PDT 2013
On Tue, Oct 08, 2013 at 12:29:39PM +0200, Andy Gibbs wrote:
> On Monday, October 07, 2013 12:13 AM, Peter Collingbourne wrote:
>> Author: pcc
>> Date: Sun Oct 6 17:13:16 2013
>> New Revision: 192074
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=192074&view=rev
>> Log:
>> Eliminate more symbols multiply defined between libsupc++ and libc++.
>>
>> The remaining multiple definitions were flushed out by attempting to
>> link libsupc++ and libc++ into the same executable with --whole-archive,
>> e.g.
>>
>> clang++ -I../llvm/projects/libcxx/include -nodefaultlibs
>> -Wl,--whole-archive lib/libc++.a
>> /usr/lib/gcc/x86_64-linux-gnu/4.6/libsupc++.a -Wl,--no-whole-archive
>> -lgcc -lgcc_s -lc -lpthread -lrt
>>
>> (The same technique was used to flush out multiple definitions in
>> libstdc++.)
>>
>> Differential Revision: http://llvm-reviews.chandlerc.com/D1824
>>
>> Modified:
>> libcxx/trunk/src/exception.cpp
>> libcxx/trunk/src/new.cpp
>>
>
> I'm afraid this patch breaks building llvm using libc++:
>
> Linking CXX executable ../../bin/llvm-tblgen
> CMakeFiles/llvm-tblgen.dir/AsmMatcherEmitter.cpp.o: In function
> `std::__1::pair<(anonymous namespace)::MatchableInfo**, long>
> std::__1::get_temporary_buffer<(anonymous
> namespace)::MatchableInfo*>(long)':
> /media/SSD/clang/build/include/c++/v1/memory:1829: undefined reference to
> `operator new(unsigned long, std::nothrow_t const&)'
> CMakeFiles/llvm-tblgen.dir/CodeGenRegisters.cpp.o: In function
> `std::__1::pair<unsigned int*, long>
> std::__1::get_temporary_buffer<unsigned int>(long)':
> /media/SSD/clang/build/include/c++/v1/memory:1829: undefined reference to
> `operator new(unsigned long, std::nothrow_t const&)'
> ../../lib/libLLVMSupport.a(MemoryBuffer.cpp.o): In function
> `llvm::MemoryBuffer::getNewUninitMemBuffer(unsigned long,
> llvm::StringRef)':
> /media/SSD/clang/source/lib/Support/MemoryBuffer.cpp:138: undefined
> reference to `operator new(unsigned long, std::nothrow_t const&)'
> clang-3.4: error: linker command failed with exit code 1 (use -v to see
> invocation)
>
>
> libc++ is built using libsupc++ in release mode and llvm is built with
> -stdlib=libc++.
>
> It is now necessary to explictly compile with -lsupc++, which surprises
> me since libc++ ought be linked against libsupc++?
If you are building libc++ as a DSO with libsupc++ it probably ought
to be using -Wl,--whole-archive to ensure that everything in libsupc++
(including operator new) is available. There's probably a way to do
that with CMake.
Thanks,
--
Peter
More information about the cfe-commits
mailing list