Nat! bio photo

Nat!

Senior Mull

Twitter Github Twitch

Using --eh-frame-header when using -fobjc-exceptions GNU/Linux: good, but not necessarily good enough

This is on Linux, with the gcc compiler (4.6). Not OS X.

When you compile code with -fobjc-exceptions, you presumably do that to somewhere execute a throw. Lets say, this is my callstack:

abort // glibc
objc_exception_throw // libobjc
-[MyClass methodThrowingAnException] // myclass.so
myClassMethodBouncer // myclass.so
function_with_a_callback // thirdparty.so
-[MyClass waitingForAnException] // myclass.so
main // main

What has happened ? I compiled all the MyClass code with -fobjc-exceptions and even did not forget to link the resulting shared library with --eh-frame-header. So all my code and libobjc.so has PT_GNU_EH_FRAME information, which is necessary for the "modern" C++ like stack unwinding.

Still not good enough. The third party library code function_with_a_callback, was not linked with --eh-frame-header and the unwinding stops right there. No catch handler can be found and objc_exception_throw treats this as an uncaught exception.

An example for the rule, that with every increase of complexity, there is also an increase in brittleness.