Index: ELF/InputFiles.cpp =================================================================== --- ELF/InputFiles.cpp +++ ELF/InputFiles.cpp @@ -895,7 +895,12 @@ template uint32_t SharedFile::getAlignment(ArrayRef 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()) Index: ELF/Relocations.cpp =================================================================== --- ELF/Relocations.cpp +++ ELF/Relocations.cpp @@ -530,6 +530,10 @@ if (SymSize == 0) fatal("cannot create a copy relocation for symbol " + toString(SS)); + assert(SS.Alignment != 0 && + "Must not create 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. bool IsReadOnly = isReadOnly(SS); 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,@object +.comm foo,16,16 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: ]