diff options
-rw-r--r-- | lld/ELF/Symbols.cpp | 8 | ||||
-rw-r--r-- | lld/test/ELF/Inputs/protected-shared.s | 4 | ||||
-rw-r--r-- | lld/test/ELF/protected-shared.s | 11 |
3 files changed, 20 insertions, 3 deletions
diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp index e699640f448..9def17c6dbb 100644 --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -218,9 +218,11 @@ int SymbolBody::compare(SymbolBody *Other) { if (L > R) return -Other->compare(this); - uint8_t V = getMinVisibility(getVisibility(), Other->getVisibility()); - setVisibility(V); - Other->setVisibility(V); + if (!isShared() && !Other->isShared()) { + uint8_t V = getMinVisibility(getVisibility(), Other->getVisibility()); + setVisibility(V); + Other->setVisibility(V); + } if (IsUsedInRegularObj || Other->IsUsedInRegularObj) IsUsedInRegularObj = Other->IsUsedInRegularObj = true; diff --git a/lld/test/ELF/Inputs/protected-shared.s b/lld/test/ELF/Inputs/protected-shared.s index a4c16df7ab4..342c37950a8 100644 --- a/lld/test/ELF/Inputs/protected-shared.s +++ b/lld/test/ELF/Inputs/protected-shared.s @@ -1,3 +1,7 @@ .global foo .protected foo foo: + + .global bar + .protected bar +bar: diff --git a/lld/test/ELF/protected-shared.s b/lld/test/ELF/protected-shared.s index 64c187edae3..ee931831b30 100644 --- a/lld/test/ELF/protected-shared.s +++ b/lld/test/ELF/protected-shared.s @@ -9,6 +9,17 @@ _start: .quad foo + .global bar +bar: + +// CHECK: Name: bar +// CHECK-NEXT: Value: +// CHECK-NEXT: Size: 0 +// CHECK-NEXT: Binding: Global +// CHECK-NEXT: Type: None +// CHECK-NEXT: Other: 0 +// CHECK-NEXT: Section: .text + // CHECK: Name: foo // CHECK-NEXT: Value: 0x0 // CHECK-NEXT: Size: 0 |