- 
                Notifications
    
You must be signed in to change notification settings  - Fork 15.1k
 
ELF: Add support for R_AARCH64_PATCHINST relocation type. #133534
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 18 commits
9928f6e
              fdcf6f4
              5db4682
              de0f3a2
              ad4e0ff
              0d90bca
              a45639b
              cccd109
              099bf34
              efb98de
              41e42c0
              ab863bf
              fcf4206
              240e141
              f403ad9
              7546eb8
              0a100d1
              988db55
              4e2946f
              068ad5c
              File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | 
|---|---|---|
| @@ -0,0 +1,87 @@ | ||
| # RUN: rm -rf %t && split-file %s %t | ||
| # RUN: llvm-mc -filetype=obj -triple=aarch64 %t/use.s -o %t/use-le.o | ||
| # RUN: llvm-mc -filetype=obj -triple=aarch64 %t/def.s -o %t/def-le.o | ||
| # RUN: llvm-mc -filetype=obj -triple=aarch64 %t/rel.s -o %t/rel-le.o | ||
| 
     | 
||
| ## Deactivation symbol used without being defined: instruction emitted as usual. | ||
| # RUN: ld.lld -o %t/undef-le %t/use-le.o --emit-relocs | ||
| # RUN: llvm-objdump -r %t/undef-le | FileCheck --check-prefix=RELOC %s | ||
| # RUN: llvm-objdump -d %t/undef-le | FileCheck --check-prefix=UNDEF %s | ||
| # RUN: ld.lld -pie -o %t/undef-le %t/use-le.o --emit-relocs | ||
| # RUN: llvm-objdump -r %t/undef-le | FileCheck --check-prefix=RELOC %s | ||
| # RUN: llvm-objdump -d %t/undef-le | FileCheck --check-prefix=UNDEF %s | ||
| 
     | 
||
| ## Deactivation symbol defined: instructions overwritten with NOPs. | ||
| # RUN: ld.lld -o %t/def-le %t/use-le.o %t/def-le.o --emit-relocs | ||
| # RUN: llvm-objdump -r %t/def-le | FileCheck --check-prefix=RELOC %s | ||
| # RUN: llvm-objdump -d %t/def-le | FileCheck --check-prefix=DEF %s | ||
| # RUN: ld.lld -pie -o %t/def-le %t/use-le.o %t/def-le.o --emit-relocs | ||
| # RUN: llvm-objdump -r %t/def-le | FileCheck --check-prefix=RELOC %s | ||
| # RUN: llvm-objdump -d %t/def-le | FileCheck --check-prefix=DEF %s | ||
| 
     | 
||
| ## Relocation pointing to a non-SHN_UNDEF non-SHN_ABS symbol is an error. | ||
| # RUN: not ld.lld -o %t/rel-le %t/use-le.o %t/rel-le.o 2>&1 | FileCheck --check-prefix=ERROR %s | ||
| # RUN: not ld.lld -pie -o %t/rel-le %t/use-le.o %t/rel-le.o 2>&1 | FileCheck --check-prefix=ERROR %s | ||
| 
     | 
||
| ## Behavior unchanged by endianness: relocation always written as little endian. | ||
| # RUN: llvm-mc -filetype=obj -triple=aarch64_be %t/use.s -o %t/use-be.o | ||
| # RUN: llvm-mc -filetype=obj -triple=aarch64_be %t/def.s -o %t/def-be.o | ||
| # RUN: llvm-mc -filetype=obj -triple=aarch64_be %t/rel.s -o %t/rel-be.o | ||
| # RUN: ld.lld -o %t/undef-be %t/use-be.o --emit-relocs | ||
| # RUN: llvm-objdump -r %t/undef-be | FileCheck --check-prefix=RELOC %s | ||
| # RUN: llvm-objdump -d %t/undef-be | FileCheck --check-prefix=UNDEF %s | ||
| # RUN: ld.lld -pie -o %t/undef-be %t/use-be.o --emit-relocs | ||
| # RUN: llvm-objdump -r %t/undef-be | FileCheck --check-prefix=RELOC %s | ||
| # RUN: llvm-objdump -d %t/undef-be | FileCheck --check-prefix=UNDEF %s | ||
| # RUN: ld.lld -o %t/def-be %t/use-be.o %t/def-be.o --emit-relocs | ||
| # RUN: llvm-objdump -r %t/def-be | FileCheck --check-prefix=RELOC %s | ||
| # RUN: llvm-objdump -d %t/def-be | FileCheck --check-prefix=DEF %s | ||
| # RUN: ld.lld -pie -o %t/def-be %t/use-be.o %t/def-be.o --emit-relocs | ||
| # RUN: llvm-objdump -r %t/def-be | FileCheck --check-prefix=RELOC %s | ||
| # RUN: llvm-objdump -d %t/def-be | FileCheck --check-prefix=DEF %s | ||
| # RUN: not ld.lld -o %t/rel-be %t/use-be.o %t/rel-be.o 2>&1 | FileCheck --check-prefix=ERROR %s | ||
| # RUN: not ld.lld -pie -o %t/rel-be %t/use-be.o %t/rel-be.o 2>&1 | FileCheck --check-prefix=ERROR %s | ||
| 
     | 
||
| # RELOC: R_AARCH64_JUMP26 | ||
| # RELOC-NEXT: R_AARCH64_PATCHINST ds | ||
| # RELOC-NEXT: R_AARCH64_PATCHINST ds | ||
| # RELOC-NEXT: R_AARCH64_PATCHINST ds0+0xd503201f | ||
| 
     | 
||
| #--- use.s | ||
| .weak ds | ||
| .weak ds0 | ||
| # This instruction has a single relocation: the DS relocation. | ||
| # UNDEF: add x0, x1, x2 | ||
| # DEF: nop | ||
| # ERROR: R_AARCH64_PATCHINST relocation against non-absolute symbol ds | ||
| .reloc ., R_AARCH64_PATCHINST, ds | ||
| add x0, x1, x2 | ||
| # This instruction has two relocations: the DS relocation and the JUMP26 to f1. | ||
| # Make sure that the DS relocation takes precedence. | ||
| .reloc ., R_AARCH64_PATCHINST, ds | ||
| 
         There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could be worth a test with emit-relocs to show both relocations coming out. Thinking of Bolt, which relies on emit-relocs, I expect that it would just ignore the R_AARCH_PATCHINST relocations on their own as it wouldn't know how to recreate the original value [1]. It would have to discard any relocation at the same location. We're hoping to create a binary analysis ABI supplement soon to document conventions that binary analysis tools are using. First step ARM-software/abi-aa#333 [1] In theory if we did want to let Bolt reverse a patch, the emit-relocs output could give the reverse patch. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done  | 
||
| # UNDEF: b {{.*}} <f1> | ||
| # DEF: nop | ||
| # ERROR: R_AARCH64_PATCHINST relocation against non-absolute symbol ds | ||
| b f1 | ||
| # Alternative representation: instruction opcode stored in addend. | ||
| # UNDEF: add x3, x4, x5 | ||
| # DEF: nop | ||
| # ERROR: R_AARCH64_PATCHINST relocation against non-absolute symbol ds0 | ||
| .reloc ., R_AARCH64_PATCHINST, ds0 + 0xd503201f | ||
| add x3, x4, x5 | ||
| 
     | 
||
| .section .text.f1,"ax",@progbits | ||
| f1: | ||
| ret | ||
| 
     | 
||
| #--- def.s | ||
| .globl ds | ||
| ds = 0xd503201f | ||
| .globl ds0 | ||
| ds0 = 0 | ||
| 
     | 
||
| #--- rel.s | ||
| .globl ds | ||
| ds: | ||
| .globl ds0 | ||
| ds0: | ||
| Original file line number | Diff line number | Diff line change | 
|---|---|---|
| 
          
            
          
           | 
    @@ -61,6 +61,7 @@ ELF_RELOC(R_AARCH64_LD64_GOT_LO12_NC, 0x138) | |
| ELF_RELOC(R_AARCH64_LD64_GOTPAGE_LO15, 0x139) | ||
| ELF_RELOC(R_AARCH64_PLT32, 0x13a) | ||
| ELF_RELOC(R_AARCH64_GOTPCREL32, 0x13b) | ||
| ELF_RELOC(R_AARCH64_PATCHINST, 0x13c) | ||
| 
         There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Also add a test to tools/llvm-readobj/ELF/reloc-types-aarch64.test There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done  | 
||
| // General dynamic TLS relocations | ||
| ELF_RELOC(R_AARCH64_TLSGD_ADR_PREL21, 0x200) | ||
| ELF_RELOC(R_AARCH64_TLSGD_ADR_PAGE21, 0x201) | ||
| 
          
            
          
           | 
    ||
| Original file line number | Diff line number | Diff line change | 
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| // RUN: llvm-mc -triple aarch64-elf -filetype=obj %s -o - | llvm-objdump -r - | FileCheck %s | ||
| 
     | 
||
| // Test that PATCHINST appears after JUMP26. | ||
| // CHECK: R_AARCH64_JUMP26 | ||
| // CHECK-NEXT: R_AARCH64_PATCHINST | ||
| .reloc ., R_AARCH64_PATCHINST, ds | ||
| b f1 | ||
| 
         There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Improve the test to test that with more than one fragments and more than one PATCHINST, the relocations are still ordered. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done in 55e71c0  | 
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
consider adding
&& cd %tso that we can remove%t/below, which clutter up the commands...There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I prefer this form so that the commands are copy-pastable into the shell.