[PATCH] D120640: [ELF] Set the priority of STB_GNU_UNIQUE the same as STB_WEAK
Fangrui Song via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 14 12:00:22 PDT 2022
This revision was not accepted when it landed; it landed in state "Needs Review".
This revision was automatically updated to reflect the committed changes.
Closed by commit rGc7cf960d859b: [ELF] Set the priority of STB_GNU_UNIQUE the same as STB_WEAK (authored by MaskRay).
Herald added a project: All.
Changed prior to commit:
https://reviews.llvm.org/D120640?vs=411838&id=415179#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D120640/new/
https://reviews.llvm.org/D120640
Files:
lld/ELF/Symbols.cpp
lld/ELF/Symbols.h
lld/test/ELF/comdat-binding.s
Index: lld/test/ELF/comdat-binding.s
===================================================================
--- /dev/null
+++ lld/test/ELF/comdat-binding.s
@@ -0,0 +1,32 @@
+# REQUIRES: x86
+# RUN: rm -rf %t && split-file %s %t
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/g.s -o %t/g.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/w.s -o %t/w.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/u.s -o %t/u.o
+# RUN: ld.lld -e 0 %t/w.o %t/u.o -o %t/w
+# RUN: llvm-readelf -s %t/w | FileCheck %s --check-prefix=WEAK
+# RUN: ld.lld -e 0 %t/u.o %t/w.o -o %t/u
+# RUN: llvm-readelf -s %t/u | FileCheck %s --check-prefix=UNIQUE
+
+# RUN: ld.lld -e 0 %t/w.o %t/g.o -o %t/w
+# RUN: llvm-readelf -s %t/w | FileCheck %s --check-prefix=WEAK
+
+# WEAK: NOTYPE WEAK DEFAULT [[#]] _ZZ1fvE1x
+# UNIQUE: OBJECT UNIQUE DEFAULT [[#]] _ZZ1fvE1x
+
+#--- g.s
+movq _ZZ1fvE1x at gotpcrel(%rip), %rax
+
+.section .bss._ZZ1fvE1x,"awG", at nobits,_ZZ1fvE1x,comdat
+.globl _ZZ1fvE1x
+_ZZ1fvE1x:
+
+#--- w.s
+.section .bss._ZZ1fvE1x,"awG", at nobits,_ZZ1fvE1x,comdat
+.weak _ZZ1fvE1x
+_ZZ1fvE1x:
+
+#--- u.s
+.section .bss._ZZ1fvE1x,"awG", at nobits,_ZZ1fvE1x,comdat
+.type _ZZ1fvE1x, @gnu_unique_object
+_ZZ1fvE1x:
Index: lld/ELF/Symbols.h
===================================================================
--- lld/ELF/Symbols.h
+++ lld/ELF/Symbols.h
@@ -141,6 +141,7 @@
bool includeInDynsym() const;
uint8_t computeBinding() const;
+ bool isGlobal() const { return binding == llvm::ELF::STB_GLOBAL; }
bool isWeak() const { return binding == llvm::ELF::STB_WEAK; }
bool isUndefined() const { return symbolKind == UndefinedKind; }
Index: lld/ELF/Symbols.cpp
===================================================================
--- lld/ELF/Symbols.cpp
+++ lld/ELF/Symbols.cpp
@@ -528,7 +528,13 @@
return false;
}
- return isWeak() && !other.isWeak();
+ // Incoming STB_GLOBAL overrides STB_WEAK/STB_GNU_UNIQUE. -fgnu-unique changes
+ // some vague linkage data in COMDAT from STB_WEAK to STB_GNU_UNIQUE. Treat
+ // STB_GNU_UNIQUE like STB_WEAK so that we prefer the first among all
+ // STB_WEAK/STB_GNU_UNIQUE copies. If we prefer an incoming STB_GNU_UNIQUE to
+ // an existing STB_WEAK, there may be discarded section errors because the
+ // selected copy may be in a non-prevailing COMDAT.
+ return !isGlobal() && other.isGlobal();
}
void elf::reportDuplicate(const Symbol &sym, InputFile *newFile,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D120640.415179.patch
Type: text/x-patch
Size: 2410 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220314/f86eb2e6/attachment.bin>
More information about the llvm-commits
mailing list