This is the GCC side of the patch series. To simplify testing, a weak reference to _dl_find_eh_frame is used to enable this feature when running on newer glibc even if built for older glibc.
The first three patches are cleanups/refactorings to simplify the actual change in the last patch. Benchmarking-wise, the new unwinder is slightly faster even in the optimal case for the old implementation (single-threaded, 100% cache hit rate). The old implementation performs really poorly once the cache hit rate drops and the number of shared objects participating in unwinding increases, so that's not a fair comparison. Old performance with multiple threads is also poor due to the global loader lock implied by dl_iterate_phdr (which is necessary to serialize access to the libgcc unwinder cache), and I haven't bother to benchmark that. Thanks, Florian Florian Weimer (4): libgcc: Remove tbase member from struct unw_eh_callback_data libgcc: Remove dbase member from struct unw_eh_callback_data if NULL libgcc: Split FDE search code from PT_GNU_EH_FRAME lookup libgcc: Use _dl_find_eh_frame in _Unwind_Find_FDE libgcc/unwind-dw2-fde-dip.c | 185 +++++++++++++++++++++++++++--------- 1 file changed, 139 insertions(+), 46 deletions(-) base-commit: 6b8b25575570ffde37cc8997af096514b929779d -- 2.31.1