forked from OSchip/llvm-project
[ELF] - Assign proper values for DefinedSynthetic symbols attached to non-allocatable sections.
DefinedSynthetic symbols are attached to sections, for the case when such symbol was attached to non-allocated section, we calculated its value incorrectly. We subtracted Body->Section->Addr, but non-allocatable sections should have zero VA in output and therefore result value was wrong. And at the same time we have Body->Section->Addr != 0 for them internally because use it for calculation of section size. Patch fixes calculation of such symbols values. Differential revision: https://reviews.llvm.org/D29653 llvm-svn: 294322
This commit is contained in:
parent
5ea971ced5
commit
c6cf1f1f02
|
|
@ -101,8 +101,12 @@ static void assignSymbol(SymbolAssignment *Cmd, typename ELFT::uint Dot = 0) {
|
|||
|
||||
if (auto *Body = dyn_cast<DefinedSynthetic>(Cmd->Sym)) {
|
||||
Body->Section = Cmd->Expression.Section();
|
||||
if (Body->Section)
|
||||
Body->Value = Cmd->Expression(Dot) - Body->Section->Addr;
|
||||
if (Body->Section) {
|
||||
uint64_t VA = 0;
|
||||
if (Body->Section->Flags & SHF_ALLOC)
|
||||
VA = Body->Section->Addr;
|
||||
Body->Value = Cmd->Expression(Dot) - VA;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
# REQUIRES: x86
|
||||
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
|
||||
|
||||
# RUN: echo "SECTIONS { . = SIZEOF_HEADERS; \
|
||||
# RUN: .text : { *(.text) } \
|
||||
# RUN: .nonalloc : { *(.nonalloc) } \
|
||||
# RUN: Sym = .; \
|
||||
# RUN: }" > %t.script
|
||||
# RUN: ld.lld -o %t2 --script %t.script %t
|
||||
# RUN: llvm-objdump -section-headers -t %t2 | FileCheck %s
|
||||
|
||||
# CHECK: SYMBOL TABLE:
|
||||
# CHECK: 00000000000000f0 .nonalloc 00000000 Sym
|
||||
|
||||
.section .nonalloc,""
|
||||
.quad 0
|
||||
Loading…
Reference in New Issue