[ELF] Fix the semantic of PROVIDE in linker scripts.

PROVIDE request us to define a symbol only if it is referenced and is
not defined by any object included in the link. We created the
symbol in the symbol table no matter what.

Differential Revision:  https://reviews.llvm.org/D22739

llvm-svn: 276592
This commit is contained in:
Davide Italiano 2016-07-25 00:25:18 +00:00
parent 249b03effb
commit 373a533a0a
3 changed files with 29 additions and 5 deletions

View File

@ -350,7 +350,9 @@ template <class ELFT> void LinkerScript<ELFT>::addScriptedSymbols() {
continue; continue;
SymbolBody *B = Symtab<ELFT>::X->find(Cmd->Name); SymbolBody *B = Symtab<ELFT>::X->find(Cmd->Name);
if (!B || B->isUndefined()) // The semantic of PROVIDE is that of introducing a symbol only if
// it's not defined and there's at least a reference to it.
if ((!B && !Cmd->Provide) || (B && B->isUndefined()))
Symtab<ELFT>::X->addAbsolute(Cmd->Name, Symtab<ELFT>::X->addAbsolute(Cmd->Name,
Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT); Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT);
else else

View File

@ -0,0 +1,22 @@
# REQUIRES: x86
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
# Provide new symbol. The value should be 1, like set in PROVIDE()
# RUN: echo "SECTIONS { PROVIDE(newsym = 1);}" > %t.script
# RUN: ld.lld -o %t1 --script %t.script %t
# RUN: llvm-objdump -t %t1 | FileCheck --check-prefix=PROVIDE1 %s
# PROVIDE1: 0000000000000001 *ABS* 00000000 newsym
# Provide new symbol (hidden). The value should be 1
# RUN: echo "SECTIONS { PROVIDE_HIDDEN(newsym = 1);}" > %t.script
# RUN: ld.lld -o %t1 --script %t.script %t
# RUN: llvm-objdump -t %t1 | FileCheck --check-prefix=HIDDEN1 %s
# HIDDEN1: 0000000000000001 *ABS* 00000000 .hidden newsym
.global _start
_start:
nop
.globl patatino
patatino:
movl newsym, %eax

View File

@ -9,17 +9,17 @@
# RUN: llvm-objdump -t %t1 | FileCheck --check-prefix=SIMPLE %s # RUN: llvm-objdump -t %t1 | FileCheck --check-prefix=SIMPLE %s
# SIMPLE: 0000000000000121 *ABS* 00000000 text_end # SIMPLE: 0000000000000121 *ABS* 00000000 text_end
# Provide new symbol. The value should be 1, like set in PROVIDE() # The symbol is not referenced. Don't provide it.
# RUN: echo "SECTIONS { PROVIDE(newsym = 1);}" > %t.script # RUN: echo "SECTIONS { PROVIDE(newsym = 1);}" > %t.script
# RUN: ld.lld -o %t1 --script %t.script %t # RUN: ld.lld -o %t1 --script %t.script %t
# RUN: llvm-objdump -t %t1 | FileCheck --check-prefix=PROVIDE1 %s # RUN: llvm-objdump -t %t1 | FileCheck --check-prefix=PROVIDE1 %s
# PROVIDE1: 0000000000000001 *ABS* 00000000 newsym # PROVIDE1-NOT: 0000000000000001 *ABS* 00000000 newsym
# Provide new symbol (hidden). The value should be 1 # The symbol is not referenced. Don't provide it.
# RUN: echo "SECTIONS { PROVIDE_HIDDEN(newsym = 1);}" > %t.script # RUN: echo "SECTIONS { PROVIDE_HIDDEN(newsym = 1);}" > %t.script
# RUN: ld.lld -o %t1 --script %t.script %t # RUN: ld.lld -o %t1 --script %t.script %t
# RUN: llvm-objdump -t %t1 | FileCheck --check-prefix=HIDDEN1 %s # RUN: llvm-objdump -t %t1 | FileCheck --check-prefix=HIDDEN1 %s
# HIDDEN1: 0000000000000001 *ABS* 00000000 .hidden newsym # HIDDEN1-NOT: 0000000000000001 *ABS* 00000000 .hidden newsym
# Provide existing symbol. The value should be 0, even though we # Provide existing symbol. The value should be 0, even though we
# have value of 1 in PROVIDE() # have value of 1 in PROVIDE()