Index: ELF/Writer.cpp =================================================================== --- ELF/Writer.cpp +++ ELF/Writer.cpp @@ -783,6 +783,9 @@ Sec->setSHName(Out::ShStrTab->addString(Sec->getName())); } + // DynSymTab->finalize() needs this. + Out::ARMExidx = findSection(".ARM.exidx"); + // Finalizers fix each section's size. // .dynsym is finalized early since that may fill up .gnu.hash. if (Out::DynSymTab) @@ -1296,6 +1299,11 @@ Sec->writeTo(Buf + Sec->getFileOff()); } +struct { + ulittle32_t StartAddr; + uint32_t Data; +} ARMExidxEntry; + // Write section contents to a mmap'ed file. template void Writer::writeSections() { uint8_t *Buf = Buffer->getBufferStart(); @@ -1316,6 +1324,16 @@ // it should be written after .eh_frame is written. if (!Out::EhFrame->empty() && Out::EhFrameHdr) Out::EhFrameHdr->writeTo(Buf + Out::EhFrameHdr->getFileOff()); + + // Sort ARM exception table by function start address. + if (Out::ARMExidx) { + auto *Start = (ARMExidxEntry *)(Buf + Out::ARMExidx->getFileOff()); + size_t NumEnt = Out::ARMExidx->getSize() / sizeof(ARMExidxEntry); + std::sort(Start, Start + NumEnt, + [](const ARMExidxEntry *A, const ARMExidxEntry *B) { + return A->StartAddr < B->StartAddr; + }); + } } template void Writer::writeBuildId() {