| commit f457863ae345d2635026501f5383e0e625869639 |
| Author: Fangrui Song <i@maskray.me> |
| Date: Fri Feb 4 13:20:49 2022 -0800 |
| |
| [ELF] Support REL-format R_AARCH64_NONE relocation |
| |
| -fprofile-use=/-fprofile-sample-use= compiles may produce REL-format |
| .rel.llvm.call-graph-profile even if the prevailing format is RELA on AArch64. |
| Add R_AARCH64_NONE to getImplicitAddend to fix this linker error: |
| |
| ``` |
| ld.lld: error: internal linker error: cannot read addend for relocation R_AARCH64_NONE |
| PLEASE submit a bug report to https://crbug.com and run tools/clang/scripts/process_crashreports.py (only works inside Google) which will upload a report and include the crash backtrace. |
| ``` |
| |
| diff --git a/lld/ELF/Arch/AArch64.cpp b/lld/ELF/Arch/AArch64.cpp |
| index 5789bc935b63..9e857d590684 100644 |
| --- a/lld/ELF/Arch/AArch64.cpp |
| +++ b/lld/ELF/Arch/AArch64.cpp |
| @@ -197,6 +197,8 @@ int64_t AArch64::getImplicitAddend(const uint8_t *buf, RelType type) const { |
| switch (type) { |
| case R_AARCH64_TLSDESC: |
| return read64(buf + 8); |
| + case R_AARCH64_NONE: |
| + return 0; |
| default: |
| internalLinkerError(getErrorLocation(buf), |
| "cannot read addend for relocation " + toString(type)); |
| diff --git a/lld/test/ELF/relocation-none-aarch64.s b/lld/test/ELF/relocation-none-aarch64.s |
| deleted file mode 100644 |
| index 7783c127cf86..000000000000 |
| --- a/lld/test/ELF/relocation-none-aarch64.s |
| +++ /dev/null |
| @@ -1,26 +0,0 @@ |
| -# REQUIRES: aarch64 |
| - |
| -# RUN: llvm-mc -filetype=obj -triple=aarch64-linux-musl %s -o %t.o |
| -# RUN: ld.lld --gc-sections %t.o -o %t |
| -# RUN: llvm-readelf -S -r %t | FileCheck %s |
| - |
| -# Test that we discard R_AARCH64_NONE, but respect the references it creates |
| -# among sections. |
| - |
| -# CHECK: .data |
| -# CHECK: There are no relocations in this file. |
| - |
| -# RUN: ld.lld -r %t.o -o %t |
| -# RUN: llvm-readobj -r %t | FileCheck --check-prefix=RELOC %s |
| - |
| -# RELOC: Section ({{.*}}) .rela.text { |
| -# RELOC-NEXT: 0x0 R_AARCH64_NONE .data 0x0 |
| -# RELOC-NEXT: } |
| - |
| -.globl _start |
| -_start: |
| - ret |
| - .reloc 0, R_AARCH64_NONE, .data |
| - |
| -.data |
| - .long 0 |
| diff --git a/lld/test/ELF/relocation-none-aarch64.test b/lld/test/ELF/relocation-none-aarch64.test |
| new file mode 100644 |
| index 000000000000..0147085021f7 |
| --- /dev/null |
| +++ b/lld/test/ELF/relocation-none-aarch64.test |
| @@ -0,0 +1,69 @@ |
| +# REQUIRES: aarch64 |
| +# RUN: yaml2obj %s -o %t.o |
| +# RUN: ld.lld --gc-sections %t.o -o %t |
| +# RUN: llvm-readelf -S -r %t | FileCheck %s |
| + |
| +## Test that we discard R_AARCH64_NONE, but respect the references it creates |
| +## among sections. |
| + |
| +# CHECK: .data |
| +# CHECK: There are no relocations in this file. |
| + |
| +# RUN: ld.lld -r %t.o -o %t |
| +# RUN: llvm-readobj -r %t | FileCheck --check-prefix=RELOC %s |
| + |
| +## Both REL and RELA are supported. .rel.llvm.call-graph-profile uses REL even |
| +## if the prevailing format is RELA. |
| +# RELOC: Section ({{.*}}) .rela.text { |
| +# RELOC-NEXT: 0x0 R_AARCH64_NONE .data 0x0 |
| +# RELOC-NEXT: } |
| +# RELOC: Section ({{.*}}) .rel.nonalloc1 { |
| +# RELOC-NEXT: 0x0 R_AARCH64_NONE .data |
| +# RELOC-NEXT: } |
| +# RELOC: Section ({{.*}}) .rela.nonalloc2 { |
| +# RELOC-NEXT: 0x0 R_AARCH64_NONE .data 0x0 |
| +# RELOC-NEXT: } |
| + |
| +--- !ELF |
| +FileHeader: |
| + Class: ELFCLASS64 |
| + Data: ELFDATA2LSB |
| + Type: ET_REL |
| + Machine: EM_AARCH64 |
| +Sections: |
| + - Name: .text |
| + Type: SHT_PROGBITS |
| + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] |
| + - Name: .data |
| + Type: SHT_PROGBITS |
| + Flags: [ SHF_WRITE, SHF_ALLOC ] |
| + - Name: .nonalloc1 |
| + Type: SHT_PROGBITS |
| + - Name: .nonalloc2 |
| + Type: SHT_PROGBITS |
| + - Name: .rela.text |
| + Type: SHT_RELA |
| + Info: .text |
| + Relocations: |
| + - Symbol: .data |
| + Type: R_AARCH64_NONE |
| + - Name: .rel.nonalloc1 |
| + Type: SHT_REL |
| + Info: .nonalloc1 |
| + Relocations: |
| + - Symbol: .data |
| + Type: R_AARCH64_NONE |
| + - Name: .rela.nonalloc2 |
| + Type: SHT_RELA |
| + Info: .nonalloc2 |
| + Relocations: |
| + - Symbol: .data |
| + Type: R_AARCH64_NONE |
| +Symbols: |
| + - Name: .data |
| + Type: STT_SECTION |
| + Section: .data |
| + - Name: _start |
| + Section: .text |
| + Binding: STB_GLOBAL |
| +... |