[PATCH] D80855: [lld-macho] Support non-pcrel section relocs
Jez Ng via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 15 14:21:11 PDT 2020
int3 updated this revision to Diff 270860.
int3 added a comment.
add reloc types in comments
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D80855/new/
https://reviews.llvm.org/D80855
Files:
lld/MachO/InputFiles.cpp
lld/test/MachO/relocations.s
Index: lld/test/MachO/relocations.s
===================================================================
--- lld/test/MachO/relocations.s
+++ lld/test/MachO/relocations.s
@@ -19,23 +19,33 @@
# CHECK: leaq [[#%u, LSTR_OFF:]](%rip), %rsi
# CHECK-NEXT: [[#%x, CSTRING_ADDR + 22 - LSTR_OFF]]
+# RUN: llvm-objdump --section=__const --full-contents -d %t | FileCheck %s --check-prefix=NONPCREL
+# NONPCREL: Contents of section __const:
+# NONPCREL-NEXT: 100001000 b0030000 01000000 b0030000 01000000
+
.section __TEXT,__text
.globl _main, _f
_main:
- callq _f
+ callq _f # X86_64_RELOC_BRANCH
mov $0, %rax
ret
_f:
movl $0x2000004, %eax # write() syscall
mov $1, %rdi # stdout
- leaq _str(%rip), %rsi
+ leaq _str(%rip), %rsi # Generates a X86_64_RELOC_SIGNED pcrel symbol relocation
mov $21, %rdx # length of str
syscall
movl $0x2000004, %eax # write() syscall
mov $1, %rdi # stdout
- leaq L_.str(%rip), %rsi
+ leaq L_.str(%rip), %rsi # Generates a X86_64_RELOC_SIGNED pcrel section relocation
+ mov $15, %rdx # length of str
+ syscall
+
+ movl $0x2000004, %eax # write() syscall
+ mov $1, %rdi # stdout
+ movq L_.ptr_1_to_str(%rip), %rsi
mov $15, %rdx # length of str
syscall
ret
@@ -47,3 +57,10 @@
## References to this generate a section relocation
L_.str:
.asciz "Private symbol\n"
+
+.section __DATA,__const
+## These generate X86_64_RELOC_UNSIGNED non-pcrel section relocations
+L_.ptr_1_to_str:
+ .quad L_.str
+L_.ptr_2_to_str:
+ .quad L_.str
Index: lld/MachO/InputFiles.cpp
===================================================================
--- lld/MachO/InputFiles.cpp
+++ lld/MachO/InputFiles.cpp
@@ -185,9 +185,6 @@
r.target = symbols[rel.r_symbolnum];
r.addend = rawAddend;
} else {
- if (!rel.r_pcrel)
- fatal("TODO: Only pcrel section relocations are supported");
-
if (rel.r_symbolnum == 0 || rel.r_symbolnum > subsections.size())
fatal("invalid section index in relocation for offset " +
std::to_string(r.offset) + " in section " + sec.sectname +
@@ -195,14 +192,19 @@
SubsectionMap &targetSubsecMap = subsections[rel.r_symbolnum - 1];
const section_64 &targetSec = sectionHeaders[rel.r_symbolnum - 1];
- // The implicit addend for pcrel section relocations is the pcrel offset
- // in terms of the addresses in the input file. Here we adjust it so that
- // it describes the offset from the start of the target section.
- // TODO: Figure out what to do for non-pcrel section relocations.
- // TODO: The offset of 4 is probably not right for ARM64, nor for
- // relocations with r_length != 2.
- uint32_t targetOffset =
- sec.addr + rel.r_address + 4 + rawAddend - targetSec.addr;
+ uint32_t targetOffset;
+ if (rel.r_pcrel) {
+ // The implicit addend for pcrel section relocations is the pcrel offset
+ // in terms of the addresses in the input file. Here we adjust it so
+ // that it describes the offset from the start of the target section.
+ // TODO: The offset of 4 is probably not right for ARM64, nor for
+ // relocations with r_length != 2.
+ targetOffset =
+ sec.addr + rel.r_address + 4 + rawAddend - targetSec.addr;
+ } else {
+ // The addend for a non-pcrel relocation is its absolute address.
+ targetOffset = rawAddend - targetSec.addr;
+ }
r.target = findContainingSubsection(targetSubsecMap, &targetOffset);
r.addend = targetOffset;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D80855.270860.patch
Type: text/x-patch
Size: 3576 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200615/e1041f57/attachment.bin>
More information about the llvm-commits
mailing list