mirror of
https://github.com/intel/llvm.git
synced 2026-01-26 12:26:52 +08:00
Fix assigning to _gp in linker scripts.
The previous logic was to try to detect if a linker script defined _gp by checking !ElfSym::MipsGp->Value. That doesn't work in all cases as the assigned value can be 0. We now just always defined it Writer.cpp and always overwrite it afterwards if needed. llvm-svn: 313788
This commit is contained in:
@@ -148,6 +148,7 @@ void LinkerScript::assignSymbol(SymbolAssignment *Cmd, bool InSec) {
|
||||
ExprValue V = Cmd->Expression();
|
||||
if (V.isAbsolute()) {
|
||||
Sym->Value = V.getValue();
|
||||
Sym->Section = nullptr;
|
||||
} else {
|
||||
Sym->Section = V.Sec;
|
||||
Sym->Value = V.getSectionOffset();
|
||||
|
||||
@@ -964,7 +964,7 @@ template <class ELFT> void Writer<ELFT>::setReservedSymbolSections() {
|
||||
|
||||
// Setup MIPS _gp_disp/__gnu_local_gp symbols which should
|
||||
// be equal to the _gp symbol's value.
|
||||
if (ElfSym::MipsGp && !ElfSym::MipsGp->Value) {
|
||||
if (ElfSym::MipsGp) {
|
||||
// Find GP-relative section with the lowest address
|
||||
// and use this address to calculate default _gp value.
|
||||
for (OutputSection *OS : OutputSections) {
|
||||
|
||||
@@ -10,6 +10,13 @@
|
||||
# RUN: ld.lld -shared -o %t.rel.so --script %t.rel.script %t.o
|
||||
# RUN: llvm-objdump -s -t %t.rel.so | FileCheck --check-prefix=REL %s
|
||||
|
||||
# RUN: echo "SECTIONS { \
|
||||
# RUN: .text : { *(.text) } \
|
||||
# RUN: _gp = 0x100 + ABSOLUTE(.); \
|
||||
# RUN: .got : { *(.got) } }" > %t.rel.script
|
||||
# RUN: ld.lld -shared -o %t.rel.so --script %t.rel.script %t.o
|
||||
# RUN: llvm-objdump -s -t %t.rel.so | FileCheck --check-prefix=REL %s
|
||||
|
||||
# RUN: echo "SECTIONS { \
|
||||
# RUN: .text : { *(.text) } \
|
||||
# RUN: _gp = 0x200; \
|
||||
|
||||
Reference in New Issue
Block a user