2020-08-21 06:00:25 +08:00
|
|
|
# RUN: yaml2obj %s -o %t.obj
|
[LLD][COFF] When using LLD-as-a-library, always prevent re-entrance on failures
This is a follow-up for D70378 (Cover usage of LLD as a library).
While debugging an intermittent failure on a bot, I recalled this scenario which
causes the issue:
1.When executing lld/test/ELF/invalid/symtab-sh-info.s L45, we reach
lld::elf::Obj-File::ObjFile() which goes straight into its base ELFFileBase(),
then ELFFileBase::init().
2.At that point fatal() is thrown in lld/ELF/InputFiles.cpp L381, leaving a
half-initialized ObjFile instance.
3.We then end up in lld::exitLld() and since we are running with LLD_IN_TEST, we
hapily restore the control flow to CrashRecoveryContext::RunSafely() then back
in lld::safeLldMain().
4.Before this patch, we called errorHandler().reset() just after, and this
attempted to reset the associated SpecificAlloc<ObjFile<ELF64LE>>. That tried
to free the half-initialized ObjFile instance, and more precisely its
ObjFile::dwarf member.
Sometimes that worked, sometimes it failed and was catched by the
CrashRecoveryContext. This scenario was the reason we called
errorHandler().reset() through a CrashRecoveryContext.
But in some rare cases, the above repro somehow corrupted the heap, creating a
stack overflow. When the CrashRecoveryContext's filter (that is,
__except (ExceptionFilter(GetExceptionInformation()))) tried to handle the
exception, it crashed again since the stack was exhausted -- and that took the
whole application down. That is the issue seen on the bot. Locally it happens
about 1 times out of 15.
Now this situation can happen anywhere in LLD. Since catching stack overflows is
not a reliable scenario ATM when using CrashRecoveryContext, we're now
preventing further re-entrance when such failures occur, by signaling
lld::SafeReturn::canRunAgain=false. When running with LLD_IN_TEST=2 (or above),
only one iteration will be executed, instead of two.
Differential Revision: https://reviews.llvm.org/D88348
2020-11-12 21:14:20 +08:00
|
|
|
# RUN: env LLD_IN_TEST=1 not lld-link /out:%t.exe /entry:func1 /subsystem:console %t.obj 2>&1 | FileCheck %s
|
2020-07-09 20:54:53 +08:00
|
|
|
|
|
|
|
# This file is like pdata-arm64.yaml, except that .pdata has been extended with
|
|
|
|
# 4 bytes. This can happen due to for example bad assembler input. Check that
|
|
|
|
# lld errors gracefully instead of crashing.
|
|
|
|
|
|
|
|
# CHECK: unexpected .pdata size: 20 is not a multiple of 8
|
|
|
|
|
|
|
|
--- !COFF
|
|
|
|
header:
|
|
|
|
Machine: IMAGE_FILE_MACHINE_ARM64
|
|
|
|
Characteristics: [ ]
|
|
|
|
sections:
|
|
|
|
- Name: .text
|
|
|
|
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
|
|
|
|
Alignment: 4
|
|
|
|
SectionData: ff4300d1f37b00a9f303012a00000094e003132a00000094f37b40a9ff430091c0035fd6f353bea9fe0b00f9f303012af403022a00000094e003132a00000094e003142a00000094fe0b40f9f353c2a8c0035fd6c0035fd6
|
|
|
|
Relocations:
|
|
|
|
- VirtualAddress: 12
|
|
|
|
SymbolName: func3
|
|
|
|
Type: IMAGE_REL_ARM64_BRANCH26
|
|
|
|
- VirtualAddress: 20
|
|
|
|
SymbolName: func3
|
|
|
|
Type: IMAGE_REL_ARM64_BRANCH26
|
|
|
|
- VirtualAddress: 52
|
|
|
|
SymbolName: func3
|
|
|
|
Type: IMAGE_REL_ARM64_BRANCH26
|
|
|
|
- VirtualAddress: 60
|
|
|
|
SymbolName: func3
|
|
|
|
Type: IMAGE_REL_ARM64_BRANCH26
|
|
|
|
- VirtualAddress: 68
|
|
|
|
SymbolName: func3
|
|
|
|
Type: IMAGE_REL_ARM64_BRANCH26
|
|
|
|
- Name: .pdata
|
|
|
|
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
|
|
|
|
Alignment: 4
|
|
|
|
SectionData: 0000000031002201000000002500a10000000000
|
|
|
|
Relocations:
|
|
|
|
- VirtualAddress: 0
|
|
|
|
SymbolName: func2
|
|
|
|
Type: IMAGE_REL_ARM64_ADDR32NB
|
|
|
|
- VirtualAddress: 8
|
|
|
|
SymbolName: func1
|
|
|
|
Type: IMAGE_REL_ARM64_ADDR32NB
|
|
|
|
symbols:
|
|
|
|
- Name: .text
|
|
|
|
Value: 0
|
|
|
|
SectionNumber: 1
|
|
|
|
SimpleType: IMAGE_SYM_TYPE_NULL
|
|
|
|
ComplexType: IMAGE_SYM_DTYPE_NULL
|
|
|
|
StorageClass: IMAGE_SYM_CLASS_STATIC
|
|
|
|
SectionDefinition:
|
|
|
|
Length: 57
|
|
|
|
NumberOfRelocations: 0
|
|
|
|
NumberOfLinenumbers: 0
|
|
|
|
CheckSum: 0
|
|
|
|
Number: 1
|
|
|
|
- Name: .pdata
|
|
|
|
Value: 0
|
|
|
|
SectionNumber: 2
|
|
|
|
SimpleType: IMAGE_SYM_TYPE_NULL
|
|
|
|
ComplexType: IMAGE_SYM_DTYPE_NULL
|
|
|
|
StorageClass: IMAGE_SYM_CLASS_STATIC
|
|
|
|
SectionDefinition:
|
|
|
|
Length: 20
|
|
|
|
NumberOfRelocations: 2
|
|
|
|
NumberOfLinenumbers: 0
|
|
|
|
CheckSum: 0
|
|
|
|
Number: 2
|
|
|
|
- Name: func1
|
|
|
|
Value: 0
|
|
|
|
SectionNumber: 1
|
|
|
|
SimpleType: IMAGE_SYM_TYPE_NULL
|
|
|
|
ComplexType: IMAGE_SYM_DTYPE_FUNCTION
|
|
|
|
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
|
|
|
|
- Name: func2
|
|
|
|
Value: 36
|
|
|
|
SectionNumber: 1
|
|
|
|
SimpleType: IMAGE_SYM_TYPE_NULL
|
|
|
|
ComplexType: IMAGE_SYM_DTYPE_FUNCTION
|
|
|
|
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
|
|
|
|
- Name: func3
|
|
|
|
Value: 84
|
|
|
|
SectionNumber: 1
|
|
|
|
SimpleType: IMAGE_SYM_TYPE_NULL
|
|
|
|
ComplexType: IMAGE_SYM_DTYPE_NULL
|
|
|
|
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
|
|
|
|
...
|