Index: lld/ELF/SyntheticSections.cpp =================================================================== --- lld/ELF/SyntheticSections.cpp +++ lld/ELF/SyntheticSections.cpp @@ -541,6 +541,13 @@ Off += alignTo(Fde->size(), Config->Wordsize); } } + + // The LSB standard does not allow a .eh_frame section with zero + // Call Frame Information records. Therefore add a CIE record length + // 0 as a terminator if this .eh_frame section is empty. + if (Off == 0) + Off = 4; + this->Size = Off; } Index: lld/test/ELF/Inputs/eh-frame-end.s =================================================================== --- lld/test/ELF/Inputs/eh-frame-end.s +++ lld/test/ELF/Inputs/eh-frame-end.s @@ -0,0 +1,2 @@ + .section ".eh_frame", "a", @progbits + .long 0 Index: lld/test/ELF/eh-frame-begin-end.s =================================================================== --- lld/test/ELF/eh-frame-begin-end.s +++ lld/test/ELF/eh-frame-begin-end.s @@ -0,0 +1,17 @@ +// REQUIRES: x86 +// RUN: llvm-mc -filetype=obj -triple=amd64-unknown-openbsd %s -o %t.o +// RUN: llvm-mc -filetype=obj -triple=amd64-unknown-openbsd %p/Inputs/eh-frame-end.s -o %t2.o +// RUN: ld.lld %t.o %t2.o -o %t +// RUN: llvm-readobj -sections %t | FileCheck %s + +// CHECK: Name: .eh_frame +// CHECK-NEXT: Type: SHT_PROGBITS +// CHECK-NEXT: Flags [ +// CHECK-NEXT: SHF_ALLOC +// CHECK-NEXT: ] +// CHECK-NEXT: Address: 0x200120 +// CHECK-NEXT: Offset: 0x120 +// CHECK-NEXT: Size: 4 + + .section ".eh_frame", "a", @progbits +__EH_FRAME_BEGIN__: