• Martin Storsjö's avatar
    ntdll: Add ARM EHABI unwind instructions in assembly functions. · f7609768
    Martin Storsjö authored
    On most ELF platforms on ARM, ARM EHABI is the unwind info
    format normally used, instead of DWARF like on most other platforms.
    
    Currently, when unwinding through ELF objects with libunwind, the
    libraries don't have any .eh_frame section mapped at runtime (since
    DWARF isn't used for unwinding). Instead, what happens is that
    libunwind ends up loading .debug_frame from the libraries on disk
    instead.
    
    Therefore, currently, ELF unwinding relies on the .so files not being
    stripped.
    
    This patch adds the necessary EHABI unwinding instructions in the
    assembly functions that currently have DWARF CFI instructions.
    
    EHABI isn't signaled via any specific preprocessor macro, but
    is signaled by the absence of other unwind mechanisms (such
    as __ARM_DWARF_EH__ and __SEH__, or maybe SjLj).
    
    Mark the asm functions in the preloaders as .cantunwind, to avoid
    undefined references to __aeabi_unwind_cpp_pr* functions.
    
    Also mark other assembly functions as .cantunwind; for
    signal_exit_thread this is essential if the function is marked
    with .fnstart/.fnend - otherwise exiting threads does hang.
    (pthread_exit internally calls _Unwind_ForcedUnwind, which would
    hang if signal_exit_thread had .fnstart without any matching unwind
    info).
    
    This would, in principle, allow unwinding through these functions with
    libunwind, for versions of libunwind that can parse the EHABI unwind
    info - see e.g.
    https://github.com/libunwind/libunwind/commit/4d779f55c0d0a3814453517e54cd0f7bed69ca74.
    (This commit isn't yet in any current release AFAIK). Unwinding with
    EHABI via libunwind would require a few tweaks to the libunwind interface
    usage in unix/signal_arm.c though, since e.g. the unw_get_proc_info call
    fails if there's no .eh_frame or .debug_frame available.
    Signed-off-by: 's avatarMartin Storsjö <martin@martin.st>
    f7609768
preloader.c 47.9 KB