libgcc, nios2: Fix exception handling on nios2 with -fpic

Exception handling on nios2-linux-gnu with -fpic has been broken since
revision 790854ea76, "Use _dl_find_object
in _Unwind_Find_FDE".  For whatever reason, this doesn't work on nios2.

Nios2 uses the GOT address as the base for DW_EH_PE_datarel
relocations in PIC; see my previous fix to make this work, revision
2d33dcfe9f, "Support for GOT-relative
DW_EH_PE_datarel encoding".  So this may be a horrible bug in the ABI
or in my interpretation of it or just glibc's implementation of
_dl_find_object for this target, but there's existing code out there
that does things this way; and realistically, nobody is going to
re-engineer this now that the vendor has EOL'ed the nios2
architecture.  So, just skip over the code trying to use
_dl_find_object on this target and fall back to the way that works.

I plan to backport this patch to the GCC 12 and GCC 13 branches as well.

libgcc/ChangeLog
	* unwind-dw2-fde-dip.c (_Unwind_Find_FDE): Do not try to use
	_dl_find_object on nios2; it doesn't work.
This commit is contained in:
Sandra Loosemore 2024-01-11 21:12:56 +00:00
parent 75ed46558a
commit cc9cac9f07

View file

@ -543,8 +543,9 @@ _Unwind_Find_FDE (void *pc, struct dwarf_eh_bases *bases)
return ret;
/* Use DLFO_STRUCT_HAS_EH_DBASE as a proxy for the existence of a glibc-style
_dl_find_object function. */
#ifdef DLFO_STRUCT_HAS_EH_DBASE
_dl_find_object function. However, do not use _dl_find_object on nios2,
which uses the GOT address as the base for DW_EH_PE_datarel instead. */
#if defined(DLFO_STRUCT_HAS_EH_DBASE) && !defined(__nios2__)
{
struct dl_find_object dlfo;
if (_dl_find_object (pc, &dlfo) == 0 && dlfo.dlfo_eh_frame != NULL)