[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Crash occurs when catching std::exception in Objective-C++ code comp
From: |
Lobron, David |
Subject: |
Re: Crash occurs when catching std::exception in Objective-C++ code compiled with clang on Linux and using libobjc2 |
Date: |
Fri, 17 Nov 2017 15:39:58 +0000 |
Thank you for the help!
> It seems to be missing the linker command line for building the CXXException
> test. It’s probably worth taking a step back at this point:
>
> On Linux platforms, it’s common to provide libsupc++ (the GNU C++ runtime
> library) statically linked into libstdc++ (the GNU C++ standard library).
> This is somewhat awkward, because this means that the only way to use symbols
> in libsupc++ is to add a dependency on libstdc++. I’ve tried to avoid that
> for libobjc, because libstdc++ is a big library and is completely unused for
> pure Objective-C programs.
>
> On FreeBSD, we ship libcxxrt (the BSD C++ runtime, which I wrote) as a
> separate .so and link both libstdc++ and libc++ (the LLVM C++ standard
> library) to it dynamically, so we can support programs linked to both. This
> means that on FreeBSD we ship libobjc.so dynamically linked to libcxxrt.so,
> and that doesn’t add much to the dependency footprint for any Objective-C
> project.
>
> By default, the libobjc CMake build looks for libcxxrt.so or libsupc++.so
> and, if it doesn’t find them, will build a libobjcxx.so that links to
> libstdc++ and to libobjc.so. This extra library provides the required
> functionality for Objective-C++. If you are seeing this being built, then
> you will need to link it for Objective-C++ to work. This configuration isn’t
> as well tested, because I don’t use any platforms that package things like
> this on a regular basis.
>
> TL;DR: Can you try adding -lobjcxx and see if that makes things work again
> for you?
I tried adding this to Test/CMakeFiles/CXXExceptions.dir/link.txt and
Test/CMakeFiles/CXXExceptions_optimised.dir/link.txt, but the linker couldn't
find the shared library:
/usr/bin/ld.bfd.real: cannot find -lobjcxx
I located the .so at the root of my build tree:
(ALSI8)dlobron@bos-lps80:~/build/clangport/akamai/libobjc2$ find . -name
libobjcxx.so
./libobjc2-1.8.1/build/libobjcxx.so
I added -L.. to the linker command. The linker was then able to find
libobjcxx.so, but unfortunately the exception errors came back, along with some
new ones from libobjcxx.so:
(ALSI8)dlobron@bos-lps80:~/build/clangport/akamai/libobjc2/libobjc2-1.8.1/build/Test$
/home/dlobron/build/clangport/akamai/llvm/llvm-5.0.0.install/bin/clang
-std=gnu99 -fexceptions -rdynamic -lobjcxx
CMakeFiles/CXXExceptions_optimised.dir/CXXException.m.o
CMakeFiles/CXXExceptions_optimised.dir/CXXException.cc.o -o
CXXExceptions_optimised
-Wl,-rpath,/home/dlobron/build/clangport/akamai/libobjc2/libobjc2-1.8.1/build
../libobjc.so.4.6 -L..
CMakeFiles/CXXExceptions_optimised.dir/CXXException.cc.o: In function
`throw_int':
/home/dlobron/build/clangport/akamai/libobjc2/libobjc2-1.8.1/Test/CXXException.cc:(.text+0x7):
undefined reference to `__cxa_allocate_exception'
/home/dlobron/build/clangport/akamai/libobjc2/libobjc2-1.8.1/Test/CXXException.cc:(.text+0x12):
undefined reference to `typeinfo for int'
/home/dlobron/build/clangport/akamai/libobjc2/libobjc2-1.8.1/Test/CXXException.cc:(.text+0x1c):
undefined reference to `__cxa_throw'
CMakeFiles/CXXExceptions_optimised.dir/CXXException.cc.o: In function
`catchall':
/home/dlobron/build/clangport/akamai/libobjc2/libobjc2-1.8.1/Test/CXXException.cc:(.text+0x2c):
undefined reference to `__cxa_begin_catch'
/home/dlobron/build/clangport/akamai/libobjc2/libobjc2-1.8.1/Test/CXXException.cc:(.text+0x3b):
undefined reference to `__cxa_rethrow'
/home/dlobron/build/clangport/akamai/libobjc2/libobjc2-1.8.1/Test/CXXException.cc:(.text+0x43):
undefined reference to `__cxa_end_catch'
CMakeFiles/CXXExceptions_optimised.dir/CXXException.cc.o: In function
`__clang_call_terminate':
/home/dlobron/build/clangport/akamai/libobjc2/libobjc2-1.8.1/Test/CXXException.cc:(.text.__clang_call_terminate[__clang_call_terminate]+0x2):
undefined reference to `__cxa_begin_catch'
/home/dlobron/build/clangport/akamai/libobjc2/libobjc2-1.8.1/Test/CXXException.cc:(.text.__clang_call_terminate[__clang_call_terminate]+0x7):
undefined reference to `std::terminate()'
CMakeFiles/CXXExceptions_optimised.dir/CXXException.cc.o:(.eh_frame+0x3f):
undefined reference to `__gxx_personality_v0'
../libobjcxx.so: undefined reference to `operator delete(void*)'
../libobjcxx.so: undefined reference to `std::type_info::__is_pointer_p() const'
../libobjcxx.so: undefined reference to `typeinfo for std::type_info'
../libobjcxx.so: undefined reference to `std::type_info::__is_function_p()
const'
../libobjcxx.so: undefined reference to `__dynamic_cast'
../libobjcxx.so: undefined reference to
`std::type_info::__do_upcast(__cxxabiv1::__class_type_info const*, void**)
const'
../libobjcxx.so: undefined reference to `vtable for std::type_info'
../libobjcxx.so: undefined reference to `vtable for
__cxxabiv1::__si_class_type_info'
../libobjcxx.so: undefined reference to `std::type_info::~type_info()'
clang-6.0: error: linker command failed with exit code 1 (use -v to see
invocation)
Drat! :)
Do you know where I might go from here? BTW, in case I did not note them
before, here is a list of the versions I am using- please let me know if I
should try upgrading one of these:
libobjc2-1.8.1
gnustep-base-1.24.9
gnustep-make-2.6.0
llvm-5.0.0
Ubuntu Linux with kernel 3.13.0-125-generic
Thanks!
--David
- Re: Crash occurs when catching std::exception in Objective-C++ code compiled with clang on Linux and using libobjc2, David Chisnall, 2017/11/01
- Re: Crash occurs when catching std::exception in Objective-C++ code compiled with clang on Linux and using libobjc2, Lobron, David, 2017/11/01
- Re: Crash occurs when catching std::exception in Objective-C++ code compiled with clang on Linux and using libobjc2, Lobron, David, 2017/11/16
- Re: Crash occurs when catching std::exception in Objective-C++ code compiled with clang on Linux and using libobjc2, David Chisnall, 2017/11/16
- Re: Crash occurs when catching std::exception in Objective-C++ code compiled with clang on Linux and using libobjc2, Lobron, David, 2017/11/16
- Re: Crash occurs when catching std::exception in Objective-C++ code compiled with clang on Linux and using libobjc2, Lobron, David, 2017/11/16
- Re: Crash occurs when catching std::exception in Objective-C++ code compiled with clang on Linux and using libobjc2, David Chisnall, 2017/11/17
- Re: Crash occurs when catching std::exception in Objective-C++ code compiled with clang on Linux and using libobjc2,
Lobron, David <=
- Re: Crash occurs when catching std::exception in Objective-C++ code compiled with clang on Linux and using libobjc2, David Chisnall, 2017/11/17
- Re: Crash occurs when catching std::exception in Objective-C++ code compiled with clang on Linux and using libobjc2, Lobron, David, 2017/11/17
- Re: Crash occurs when catching std::exception in Objective-C++ code compiled with clang on Linux and using libobjc2, David Chisnall, 2017/11/18
- Re: Crash occurs when catching std::exception in Objective-C++ code compiled with clang on Linux and using libobjc2, Lobron, David, 2017/11/20
- Re: Crash occurs when catching std::exception in Objective-C++ code compiled with clang on Linux and using libobjc2, Lobron, David, 2017/11/20
- Re: Crash occurs when catching std::exception in Objective-C++ code compiled with clang on Linux and using libobjc2, David Chisnall, 2017/11/20
- Re: Crash occurs when catching std::exception in Objective-C++ code compiled with clang on Linux and using libobjc2, Lobron, David, 2017/11/21
- Re: Crash occurs when catching std::exception in Objective-C++ code compiled with clang on Linux and using libobjc2, Lobron, David, 2017/11/21
- Re: Crash occurs when catching std::exception in Objective-C++ code compiled with clang on Linux and using libobjc2, David Chisnall, 2017/11/21
- Re: Crash occurs when catching std::exception in Objective-C++ code compiled with clang on Linux and using libobjc2, Lobron, David, 2017/11/21