libcxx on Linux: symbols used but not defined

Saleem Abdulrasool compnerd at compnerd.org
Thu Feb 14 07:25:08 PST 2013


On Feb 14, 2013 6:39 AM, "Alexey Samsonov" <samsonov at google.com> wrote:
>
>
> On Thu, Feb 7, 2013 at 7:47 PM, Howard Hinnant <hhinnant at apple.com> wrote:
>>
>> On Feb 7, 2013, at 6:17 AM, Alexey Samsonov <samsonov at google.com> wrote:
>>
>> > Hi!
>> >
>> > I'm trying to build libcxx on Linux (Ubuntu Precise) using the
following command:
>> >
>> > cmake -DLIBCXX_CXX_ABI=libsupc++
'-DLIBCXX_LIBSUPCXX_INCLUDE_PATHS=/usr/include/c++/4.6;/usr/include/c++/4.6/x86_64-linux-gnu/.;'
-DLIBCXX_ENABLE_EXCEPTIONS=OFF -DLIBCXX_ENABLE_SHARED=OFF
-DLIBCXX_ENABLE_RTTI=OFF -DCMAKE_BUILD_TYPE=Release
-DCMAKE_INSTALL_PREFIX=/tmp/tmp.boBpS5zFqt/libcxx_inst
/tmp/tmp.boBpS5zFqt/libcxx
>> >
>> > and I want the result to be "hermetic" in the sense that resulting
static library libc++.a doesn't reference undefined symbols from std::
>> > However, I see the following problems:
>> >
>> > (libc++.a.new.cpp.o):/tmp/tmp.boBpS5zFqt/libcxx/src/new.cpp:function
std::bad_alloc::~bad_alloc(): error: undefined reference to
'std::exception::~exception()'
>> > (libc++.a.new.cpp.o):/tmp/tmp.boBpS5zFqt/libcxx/src/new.cpp:function
std::bad_array_new_length::~bad_array_new_length(): error: undefined
reference to 'std::exception::~exception()'
>> > (libc++.a.new.cpp.o):/tmp/tmp.boBpS5zFqt/libcxx/src/new.cpp:function
std::bad_array_new_length::~bad_array_new_length(): error: undefined
reference to 'std::exception::~exception()'
>> > (libc++.a.ios.cpp.o):/tmp/tmp.boBpS5zFqt/libcxx/src/ios.cpp:function
std::__1::basic_ostream<char, std::__1::char_traits<char> >::flush():
error: undefined reference to 'std::uncaught_exception()'
>> > (libc++.a.ios.cpp.o):/tmp/tmp.boBpS5zFqt/libcxx/src/ios.cpp:function
std::__1::basic_ostream<wchar_t, std::__1::char_traits<wchar_t> >::flush():
error: undefined reference to 'std::uncaught_exception()'
>> > (libc++.a.ios.cpp.o):/tmp/tmp.boBpS5zFqt/libcxx/src/ios.cpp:function
std::__1::basic_ostream<char, std::__1::char_traits<char>
>::sentry::~sentry(): error: undefined reference to
'std::uncaught_exception()'
>> > (libc++.a.ios.cpp.o):/tmp/tmp.boBpS5zFqt/libcxx/src/ios.cpp:function
std::__1::basic_ostream<char, std::__1::char_traits<char>
>::sentry::~sentry(): error: undefined reference to
'std::uncaught_exception()'
>> >
(libc++.a.memory.cpp.o):/tmp/tmp.boBpS5zFqt/libcxx/src/memory.cpp:function
std::__1::bad_weak_ptr::~bad_weak_ptr(): error: undefined reference to
'std::exception::~exception()'
>> >
(libc++.a.memory.cpp.o):/tmp/tmp.boBpS5zFqt/libcxx/src/memory.cpp:function
vtable for std::__1::__shared_weak_count: error: undefined reference to
'std::__1::__shared_weak_count::__get_deleter(std::type_info const&) const'
>> >
(libc++.a.thread.cpp.o):/tmp/tmp.boBpS5zFqt/libcxx/src/thread.cpp:function
std::__1::thread::~thread(): error: undefined reference to
'std::terminate()'
>> >
>> > What is the correct way to for that? I have the patch (attached) that
works for me, but I'm not really sure it's correct
>> > (especially the first part).
>>
>> Yeah, we tried this once:
>>
>> > --- include/memory    (revision 173248)
>> > +++ include/memory    (working copy)
>> > @@ -3629,10 +3629,9 @@
>> >      long use_count() const _NOEXCEPT {return
__shared_count::use_count();}
>> >      __shared_weak_count* lock() _NOEXCEPT;
>> >
>> > -    // purposefully not protected with #ifndef _LIBCPP_NO_RTTI
because doing so
>> > -    //  breaks ABI for those clients who need to compile their
projects with
>> > -    //    -fno-rtti and yet link against a libc++.dylib compiled
without -fno-rtti.
>> > +#ifndef _LIBCPP_NO_RTTI
>> >      virtual const void* __get_deleter(const type_info&) const
_NOEXCEPT;
>> > +#endif _LIBCPP_NO_RTTI
>>
>> and as the comments indicate, got bitten by it, at least on Apple
platforms.
>>
>> Way forward:  Perhaps you could #ifdef it a little more in such a way
that it isn't going to trigger except for someone trying to do exactly what
you are doing:  Build a static lib on linux with rtti and exceptions off.
 Or perhaps slightly more general:  Build a static lib with rtti and
exceptions off.
>
>
> Yes, I can add some #ifdefs here. But I also wonder about the second part
of the patch:
> I have __GLIBCXX__ defined because of commit:
>
> r173164 Saleem Abdulrasool: Ensure that __GLIBCXX__ is defined when
building with libsupc++.
>
> and, as a result, I don't get definitions of terminate(),
uncaught_exception(), exception>::~exception() and exception::what() in the
resulting libc++ library,
> yet these functions are referenced from it.

Those functions are provided by libsupc++, and redefining them results in
conflicts.  If you are building a static libc++, you would still need to
link against the low level provider, or you need to merge a static copy of
libsupc++ into your resulting libc++.a.

> --
> Alexey Samsonov, MSK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130214/f4b52636/attachment.html>


More information about the cfe-commits mailing list