[PATCH] D47602: Correct aligment computation for shared object symbols
Han Shen via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 1 13:44:26 PDT 2018
shenhan updated this revision to Diff 149538.
shenhan added a comment.
@pcc thanks for the review. Updated the patch -
1. if getAlignment sees a ABS symbols, returns 0
2. initialize Ret to UINT64_MAX
3. in "addCopyRelSymbol", errors out if alignment is 0.
4. unit test case that tests for proper handling of ABS symbols.
Repository:
rLLD LLVM Linker
https://reviews.llvm.org/D47602
Files:
ELF/InputFiles.cpp
ELF/Relocations.cpp
test/ELF/Inputs/copy-relocation-zero-abs-addr.s
test/ELF/copy-relocation-zero-abs-addr.s
Index: test/ELF/copy-relocation-zero-abs-addr.s
===================================================================
--- /dev/null
+++ test/ELF/copy-relocation-zero-abs-addr.s
@@ -0,0 +1,44 @@
+// REQUIRES: x86
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/copy-relocation-zero-abs-addr.s -o %t.o
+// RUN: ld.lld -shared -o %t2.so %t.o
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t3.o
+// RUN: ld.lld %t2.so %t3.o -o %t4
+// RUN: llvm-readobj -symbols %t2.so | FileCheck -check-prefix=ABSADDR %s
+// RUN: llvm-readobj -s -r --expand-relocs %t4 | FileCheck %s
+
+// This tests that symbols with absolute addresses are properly
+// handled. Normal DSO symbols are handled as usual.
+
+.text
+.globl _start
+_start:
+ movl $5, foo
+
+// ABSADDR: Name: ver1
+// ABSADDR-NEXT: Value: 0x0
+// ABSADDR-NEXT: Size: 0
+// ABSADDR-NEXT: Binding: Global
+// ABSADDR-NEXT: Type: None
+// ABSADDR-NEXT: Other: 0
+// ABSADDR-NEXT: Section: Absolute (0xFFF1)
+// ABSADDR-NEXT: }
+// ABSADDR-NEXT: Symbol {
+// ABSADDR-NEXT: Name: ver2
+// ABSADDR-NEXT: Value: 0x0
+// ABSADDR-NEXT: Size: 0
+// ABSADDR-NEXT: Binding: Global
+// ABSADDR-NEXT: Type: None
+// ABSADDR-NEXT: Other: 0
+// ABSADDR-NEXT: Section: Absolute (0xFFF1)
+// ABSADDR-NEXT: }
+
+// CHECK: Relocations [
+// CHECK-NEXT: Section (5) .rela.dyn {
+// CHECK-NEXT: Relocation {
+// CHECK-NEXT: Offset:
+// CHECK-NEXT: Type: R_X86_64_COPY
+// CHECK-NEXT: Symbol: foo
+// CHECK-NEXT: Addend:
+// CHECK-NEXT: }
+// CHECK-NEXT: }
+// CHECK-NEXT: ]
Index: test/ELF/Inputs/copy-relocation-zero-abs-addr.s
===================================================================
--- /dev/null
+++ test/ELF/Inputs/copy-relocation-zero-abs-addr.s
@@ -0,0 +1,7 @@
+.globl ver1
+.globl ver2
+ ver1 = 0x0
+ ver2 = 0x0
+
+.type foo, at object
+.comm foo,16,16
Index: ELF/Relocations.cpp
===================================================================
--- ELF/Relocations.cpp
+++ ELF/Relocations.cpp
@@ -529,6 +529,9 @@
uint64_t SymSize = SS.getSize();
if (SymSize == 0)
fatal("cannot create a copy relocation for symbol " + toString(SS));
+ if (SS.Alignment == 0)
+ fatal("cannot create a copy relocation for symbol "
+ "with absolute address " + toString(SS));
// See if this symbol is in a read-only segment. If so, preserve the symbol's
// memory protection by reserving space in the .bss.rel.ro section.
Index: ELF/InputFiles.cpp
===================================================================
--- ELF/InputFiles.cpp
+++ ELF/InputFiles.cpp
@@ -895,7 +895,12 @@
template <class ELFT>
uint32_t SharedFile<ELFT>::getAlignment(ArrayRef<Elf_Shdr> Sections,
const Elf_Sym &Sym) {
- uint64_t Ret = 1;
+ // If a sym has absolute address, no alignment information is
+ // needed (because it's final address is fixed), return 0.
+ if (Sym.st_shndx == SHN_ABS)
+ return 0;
+
+ uint64_t Ret = UINT64_MAX;
if (Sym.st_value)
Ret = 1ULL << countTrailingZeros((uint64_t)Sym.st_value);
if (0 < Sym.st_shndx && Sym.st_shndx < Sections.size())
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D47602.149538.patch
Type: text/x-patch
Size: 3169 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180601/4817f77d/attachment.bin>
More information about the llvm-commits
mailing list