[PATCH] D22739: [ELF] Fix the semantic of PROVIDE in Linker scripts

Davide Italiano via llvm-commits llvm-commits at lists.llvm.org
Sun Jul 24 17:17:52 PDT 2016


davide created this revision.
davide added a reviewer: ruiu.
davide added a subscriber: llvm-commits.

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Using_ld_the_GNU_Linker/assignments.html says that  a symbol needs to be defined 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.

https://reviews.llvm.org/D22739

Files:
  ELF/LinkerScript.cpp
  test/ELF/linkerscript/linkerscript-symbolreferenced.s
  test/ELF/linkerscript/linkerscript-symbols.s

Index: test/ELF/linkerscript/linkerscript-symbols.s
===================================================================
--- test/ELF/linkerscript/linkerscript-symbols.s
+++ test/ELF/linkerscript/linkerscript-symbols.s
@@ -9,17 +9,17 @@
 # RUN: llvm-objdump -t %t1 | FileCheck --check-prefix=SIMPLE %s
 # 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: ld.lld -o %t1 --script %t.script %t
 # 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: ld.lld -o %t1 --script %t.script %t
 # 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 
 # have value of 1 in PROVIDE()
Index: test/ELF/linkerscript/linkerscript-symbolreferenced.s
===================================================================
--- /dev/null
+++ test/ELF/linkerscript/linkerscript-symbolreferenced.s
@@ -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
Index: ELF/LinkerScript.cpp
===================================================================
--- ELF/LinkerScript.cpp
+++ ELF/LinkerScript.cpp
@@ -351,7 +351,10 @@
       continue;
 
     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,
                                    Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT);
     else


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D22739.65282.patch
Type: text/x-patch
Size: 2921 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160725/1da18b69/attachment.bin>


More information about the llvm-commits mailing list