summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2017-10-13 18:07:11 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2017-10-13 18:07:11 +0000
commit8bf95e467860eb9f0070311e2d54ddd0708bbcc1 (patch)
treef7e99b10bd69f05259d302ca6630d74e2c8d8220
parenta2516bef9f17d0d635ed7588fe62553b4604002a (diff)
downloadbcm5719-llvm-8bf95e467860eb9f0070311e2d54ddd0708bbcc1.tar.gz
bcm5719-llvm-8bf95e467860eb9f0070311e2d54ddd0708bbcc1.zip
Handle shared and lazy symbol in the gnu hash construction.
We were not considering those symbols undefined and they could end up in the end of the dynamic symbol table. llvm-svn: 315721
-rw-r--r--lld/ELF/SyntheticSections.cpp2
-rw-r--r--lld/test/ELF/gc-sections-shared.s10
-rw-r--r--lld/test/ELF/gnu-hash-table.s69
3 files changed, 66 insertions, 15 deletions
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index ec614d6e236..6020c0de375 100644
--- a/lld/ELF/SyntheticSections.cpp
+++ b/lld/ELF/SyntheticSections.cpp
@@ -1608,7 +1608,7 @@ void GnuHashTableSection::addSymbols(std::vector<SymbolTableEntry> &V) {
// its type correctly.
std::vector<SymbolTableEntry>::iterator Mid =
std::stable_partition(V.begin(), V.end(), [](const SymbolTableEntry &S) {
- return S.Symbol->isUndefined();
+ return !S.Symbol->isInCurrentDSO();
});
if (Mid == V.end())
return;
diff --git a/lld/test/ELF/gc-sections-shared.s b/lld/test/ELF/gc-sections-shared.s
index 21738e42d86..3bb8ff12fc2 100644
--- a/lld/test/ELF/gc-sections-shared.s
+++ b/lld/test/ELF/gc-sections-shared.s
@@ -19,16 +19,16 @@
# CHECK-NEXT: Section: Undefined (0x0)
# CHECK-NEXT: }
# CHECK-NEXT: Symbol {
-# CHECK-NEXT: Name: bar
+# CHECK-NEXT: Name: bar2
# CHECK-NEXT: Value:
# CHECK-NEXT: Size:
# CHECK-NEXT: Binding: Global
# CHECK-NEXT: Type:
# CHECK-NEXT: Other:
-# CHECK-NEXT: Section: .text
+# CHECK-NEXT: Section: Undefined
# CHECK-NEXT: }
# CHECK-NEXT: Symbol {
-# CHECK-NEXT: Name: foo
+# CHECK-NEXT: Name: bar
# CHECK-NEXT: Value:
# CHECK-NEXT: Size:
# CHECK-NEXT: Binding: Global
@@ -37,13 +37,13 @@
# CHECK-NEXT: Section: .text
# CHECK-NEXT: }
# CHECK-NEXT: Symbol {
-# CHECK-NEXT: Name: bar2
+# CHECK-NEXT: Name: foo
# CHECK-NEXT: Value:
# CHECK-NEXT: Size:
# CHECK-NEXT: Binding: Global
# CHECK-NEXT: Type:
# CHECK-NEXT: Other:
-# CHECK-NEXT: Section: Undefined
+# CHECK-NEXT: Section: .text
# CHECK-NEXT: }
# CHECK-NEXT: ]
diff --git a/lld/test/ELF/gnu-hash-table.s b/lld/test/ELF/gnu-hash-table.s
index 759ee0a53a3..7df8dfc8df1 100644
--- a/lld/test/ELF/gnu-hash-table.s
+++ b/lld/test/ELF/gnu-hash-table.s
@@ -6,10 +6,29 @@
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t-x86_64.o
# RUN: llvm-mc -filetype=obj -triple=powerpc64-pc-linux %s -o %t-ppc64.o
+# RUN: echo ".global zed; zed:" > %t2.s
+# RUN: llvm-mc -filetype=obj -triple=i386-pc-linux %t2.s -o %t2-i386.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %t2.s -o %t2-x86_64.o
+# RUN: llvm-mc -filetype=obj -triple=powerpc64-pc-linux %t2.s -o %t2-ppc64.o
+
+# RUN: rm -f %t2-i386.a %t2-x86_64.a %t2-ppc64.a
+# RUN: llvm-ar rc %t2-i386.a %t2-i386.o
+# RUN: llvm-ar rc %t2-x86_64.a %t2-x86_64.o
+# RUN: llvm-ar rc %t2-ppc64.a %t2-ppc64.o
+
+# RUN: echo ".global xyz; xyz:" > %t3.s
+# RUN: llvm-mc -filetype=obj -triple=i386-pc-linux %t3.s -o %t3-i386.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %t3.s -o %t3-x86_64.o
+# RUN: llvm-mc -filetype=obj -triple=powerpc64-pc-linux %t3.s -o %t3-ppc64.o
+
+# RUN: ld.lld -shared %t3-i386.o -o %t3-i386.so
+# RUN: ld.lld -shared %t3-x86_64.o -o %t3-x86_64.so
+# RUN: ld.lld -shared %t3-ppc64.o -o %t3-ppc64.so
+
# RUN: ld.lld -shared --hash-style=gnu -o %te-i386.so %te-i386.o
-# RUN: ld.lld -shared -hash-style=gnu -o %t-i386.so %t-i386.o
-# RUN: ld.lld -shared -hash-style=gnu -o %t-x86_64.so %t-x86_64.o
-# RUN: ld.lld -shared --hash-style both -o %t-ppc64.so %t-ppc64.o
+# RUN: ld.lld -shared -hash-style=gnu -o %t-i386.so %t-i386.o %t2-i386.a %t3-i386.so
+# RUN: ld.lld -shared -hash-style=gnu -o %t-x86_64.so %t-x86_64.o %t2-x86_64.a %t3-x86_64.so
+# RUN: ld.lld -shared --hash-style both -o %t-ppc64.so %t-ppc64.o %t2-ppc64.a %t3-ppc64.so
# RUN: llvm-readobj -dyn-symbols -gnu-hash-table %te-i386.so \
# RUN: | FileCheck %s -check-prefix=EMPTY
@@ -70,6 +89,16 @@
# I386: Section: Undefined
# I386: }
# I386: Symbol {
+# I386: Name: xyz@
+# I386: Binding: Global
+# I386: Section: Undefined
+# I386: }
+# I386: Symbol {
+# I386: Name: zed@
+# I386: Binding: Weak
+# I386: Section: Undefined
+# I386: }
+# I386: Symbol {
# I386: Name: bar@
# I386: Binding: Global
# I386: Section: .text
@@ -82,11 +111,11 @@
# I386: ]
# I386: GnuHashTable {
# I386-NEXT: Num Buckets: 1
-# I386-NEXT: First Hashed Symbol Index: 2
+# I386-NEXT: First Hashed Symbol Index: 4
# I386-NEXT: Num Mask Words: 1
# I386-NEXT: Shift Count: 5
# I386-NEXT: Bloom Filter: [0x14000220]
-# I386-NEXT: Buckets: [2]
+# I386-NEXT: Buckets: [4]
# I386-NEXT: Values: [0xB8860BA, 0xB887389]
# I386-NEXT: }
@@ -120,6 +149,16 @@
# X86_64: Section: Undefined
# X86_64: }
# X86_64: Symbol {
+# X86_64: Name: xyz@
+# X86_64: Binding: Global
+# X86_64: Section: Undefined
+# X86_64: }
+# X86_64: Symbol {
+# X86_64: Name: zed@
+# X86_64: Binding: Weak
+# X86_64: Section: Undefined
+# X86_64: }
+# X86_64: Symbol {
# X86_64: Name: bar@
# X86_64: Binding: Global
# X86_64: Section: .text
@@ -132,11 +171,11 @@
# X86_64: ]
# X86_64: GnuHashTable {
# X86_64-NEXT: Num Buckets: 1
-# X86_64-NEXT: First Hashed Symbol Index: 2
+# X86_64-NEXT: First Hashed Symbol Index: 4
# X86_64-NEXT: Num Mask Words: 1
# X86_64-NEXT: Shift Count: 6
# X86_64-NEXT: Bloom Filter: [0x400000000004204]
-# X86_64-NEXT: Buckets: [2]
+# X86_64-NEXT: Buckets: [4]
# X86_64-NEXT: Values: [0xB8860BA, 0xB887389]
# X86_64-NEXT: }
@@ -170,6 +209,16 @@
# PPC64: Section: Undefined
# PPC64: }
# PPC64: Symbol {
+# PPC64: Name: xyz@
+# PPC64: Binding: Global
+# PPC64: Section: Undefined
+# PPC64: }
+# PPC64: Symbol {
+# PPC64: Name: zed@
+# PPC64: Binding: Weak
+# PPC64: Section: Undefined
+# PPC64: }
+# PPC64: Symbol {
# PPC64: Name: bar@
# PPC64: Binding: Global
# PPC64: Section: .text
@@ -182,14 +231,16 @@
# PPC64: ]
# PPC64: GnuHashTable {
# PPC64-NEXT: Num Buckets: 1
-# PPC64-NEXT: First Hashed Symbol Index: 2
+# PPC64-NEXT: First Hashed Symbol Index: 4
# PPC64-NEXT: Num Mask Words: 1
# PPC64-NEXT: Shift Count: 6
# PPC64-NEXT: Bloom Filter: [0x400000000004204]
-# PPC64-NEXT: Buckets: [2]
+# PPC64-NEXT: Buckets: [4]
# PPC64-NEXT: Values: [0xB8860BA, 0xB887389]
# PPC64-NEXT: }
.globl foo,bar,baz
foo:
bar:
+.weak zed
+.global xyz
OpenPOWER on IntegriCloud