[PATCH] D32397: [LLD] Avoid empty .eh_frame sections

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Mon May 1 09:01:16 PDT 2017


LGTM

Thanks,
Rafael

Mark Kettenis via Phabricator <reviews at reviews.llvm.org> writes:

> kettenis created this revision.
>
> Since D30335: [LLD] Add terminator to .eh_frame sections <https://reviews.llvm.org/D30335> got reverted, here is a new attempt to address the issue that prompted me to look into the unterminated .eh_frame section issue. This is that strip on OpenBSD does not correctly handle an empty .eh_frame section and produces broken binaries in that case.  Currently lld creates such an empty .eh_frame section, despite the fact that the OpenBSD crtend.o explicitly inserts a terminator.  The Linux LSB "standard":
>
> https://refspecs.linuxfoundation.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/ehframechpt.html#EHFRAME
>
> explicitly says that
>
>>   The .eh_frame section shall contain 1 or more Call Frame Information (CFI) records.
>
> This diff includes a test that specifically tests the issue I'm seeing on OpenBSD.
>
>
> https://reviews.llvm.org/D32397
>
> Files:
>   lld/ELF/SyntheticSections.cpp
>   lld/test/ELF/Inputs/eh-frame-end.s
>   lld/test/ELF/eh-frame-begin-end.s
>
>
> 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__:
> 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/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/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__:
> 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/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;
>  }
>  


More information about the llvm-commits mailing list