Index: ELF/SyntheticSections.cpp =================================================================== --- ELF/SyntheticSections.cpp +++ ELF/SyntheticSections.cpp @@ -2181,13 +2181,19 @@ // This section will have been sorted last in the .ARM.exidx table. // This table entry will have the form: // | PREL31 upper bound of code that has exception tables | EXIDX_CANTUNWIND | +// The sentinel must have the PREL31 value of an address higher than any +// address described by any other table entry. void ARMExidxSentinelSection::writeTo(uint8_t *Buf) { - // Get the InputSection before us, we are by definition last - auto RI = cast(this->OutSec)->Sections.rbegin(); - InputSection *LE = *(++RI); - InputSection *LC = cast(LE->getLinkOrderDep()); - uint64_t S = LC->OutSec->Addr + LC->getOffset(LC->getSize()); - uint64_t P = this->getVA(); + uint64_t S = 0; + uint64_t P = getVA(); + std::vector *> Ranges = + Script->inputSectionRanges(OutSec->Name); + for (std::vector *Range : Ranges) + for (InputSection *IS : *Range) + if (IS->kind() != InputSectionBase::Synthetic) { + InputSection *LS = cast(IS->getLinkOrderDep()); + S = std::max(S, LS->OutSec->Addr + LS->getOffset(LS->getSize())); + } Target->relocateOne(Buf, R_ARM_PREL31, S - P); write32le(Buf + 4, 0x1); }