Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ELF] Prevent crash in writing an .ARM.exidx sentinel entry.
We might crash in 'ARMExidxSentinelSection::writeTo()' because it expected the sentinel entry to be put in the same 'InputSectionDescription' as the last real entry. This assumption fails if the last output section command for .ARM.exidx is anything but an input section description, because in this case 'OutputSection::addSection()' creates a new 'InputSectionDescription'. Differential Revision: https://reviews.llvm.org/D41105 llvm-svn: 320668
- Loading branch information
1 parent
b308cac
commit f01caab
Showing
2 changed files
with
39 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
24 changes: 24 additions & 0 deletions
24
lld/test/ELF/linkerscript/arm-exidx-sentinel-and-assignment.s
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
# REQUIRES: arm | ||
# RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t.o | ||
# RUN: echo "SECTIONS { \ | ||
# RUN: .ARM.exidx 0x1000 : { *(.ARM.exidx*) foo = .; } \ | ||
# RUN: .text 0x2000 : { *(.text*) } \ | ||
# RUN: }" > %t.script | ||
## We used to crash if the last output section command for .ARM.exidx | ||
## was anything but an input section description. | ||
# RUN: ld.lld -T %t.script %t.o -shared -o %t.so | ||
# RUN: llvm-objdump -s -triple=armv7a-none-linux-gnueabi %t.so | FileCheck %s | ||
|
||
.syntax unified | ||
.text | ||
.global _start | ||
_start: | ||
.fnstart | ||
.cantunwind | ||
bx lr | ||
.fnend | ||
|
||
// CHECK: Contents of section .ARM.exidx: | ||
// 1000 + 1000 = 0x2000 = _start | ||
// 1008 + 0ffc = 0x2004 = _start + sizeof(_start) | ||
// CHECK-NEXT: 1000 00100000 01000000 fc0f0000 01000000 |