diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2017-10-13 18:07:11 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2017-10-13 18:07:11 +0000 |
| commit | 8bf95e467860eb9f0070311e2d54ddd0708bbcc1 (patch) | |
| tree | f7e99b10bd69f05259d302ca6630d74e2c8d8220 | |
| parent | a2516bef9f17d0d635ed7588fe62553b4604002a (diff) | |
| download | bcm5719-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.cpp | 2 | ||||
| -rw-r--r-- | lld/test/ELF/gc-sections-shared.s | 10 | ||||
| -rw-r--r-- | lld/test/ELF/gnu-hash-table.s | 69 |
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 |

