On Feb 7, 2013, at 6:17 AM, Alexey Samsonov <[email protected]> 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.

When building a dynamic lib I've got to assume that the result is something 
that essentially becomes part of an OS and serves everyone instead of just a 
single client.

Howard

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to