[PATCH] D136381: [ELF] Suppress "duplicate symbol" when resolving STB_WEAK and STB_GNU_UNIQUE in different COMDATs

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 20 14:23:38 PDT 2022


MaskRay created this revision.
MaskRay added reviewers: peter.smith, Romain-Geissler-1A.
Herald added subscribers: StephenFan, arichardson, emaste.
Herald added a project: All.
MaskRay requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

  template <typename T> struct A {
    A() {}
    int value = 0;
  };
  
  template <typename Value> struct B {
    static A<int> a;
  };
  
  template <typename Value> A<int> B<Value>::a;
  
  inline int foo() {
    return B<int>::a.value;
  }



  clang++ -fno-pic a.cc -o weak.o
  g++ -fno-pic a.cc -o unique.o
  
  # Duplicate symbol error. In postParse, we do not check `sym.binding`
  ld.lld -e 0 weak.o unique.o

While mixing GCC and Clang object files in this case is error-prone since there
are different COMDATs, the linker should suppress the "duplicate symbol" error
using the weak symbol semantics.

Close https://github.com/llvm/llvm-project/issues/58232


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D136381

Files:
  lld/ELF/InputFiles.cpp
  lld/test/ELF/comdat-binding2.s


Index: lld/test/ELF/comdat-binding2.s
===================================================================
--- /dev/null
+++ lld/test/ELF/comdat-binding2.s
@@ -0,0 +1,42 @@
+# REQUIRES: x86
+## Test we don't report duplicate definition errors when mixing Clang STB_WEAK
+## and GCC STB_GNU_UNIQUE symbols.
+
+# RUN: rm -rf %t && split-file %s %t && cd %t
+# RUN: llvm-mc -filetype=obj -triple=x86_64 weak.s -o weak.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64 unique.s -o unique.o
+# RUN: ld.lld weak.o unique.o -o weak
+# RUN: llvm-readelf -s weak | FileCheck %s --check-prefix=WEAK
+# RUN: ld.lld unique.o weak.o -o unique
+# RUN: llvm-readelf -s unique | FileCheck %s --check-prefix=UNIQUE
+
+# WEAK:   OBJECT  WEAK   DEFAULT [[#]] _ZN1BIiE1aE
+# UNIQUE: OBJECT  UNIQUE DEFAULT [[#]] _ZN1BIiE1aE
+
+#--- weak.s
+## Clang
+	.type	_ZN1BIiE1aE, at object
+	.section	.bss._ZN1BIiE1aE,"aGwR", at nobits,_ZN1BIiE1aE,comdat
+	.weak	_ZN1BIiE1aE
+_ZN1BIiE1aE:
+	.zero	4
+
+	.type	_ZGVN1BIiE1aE, at object
+	.section	.bss._ZGVN1BIiE1aE,"aGw", at nobits,_ZN1BIiE1aE,comdat
+	.weak	_ZGVN1BIiE1aE
+_ZGVN1BIiE1aE:
+	.quad	0
+
+#--- unique.s
+## GCC with the default --enable-gnu-unique-object configuration
+	.weak	_ZN1BIiE1aE
+	.section	.bss._ZN1BIiE1aE,"awG", at nobits,_ZN1BIiE1aE,comdat
+	.type	_ZN1BIiE1aE, @gnu_unique_object
+_ZN1BIiE1aE:
+	.zero	4
+
+	.weak	_ZGVN1BIiE1aE
+	.section	.bss._ZGVN1BIiE1aE,"awG", at nobits,_ZGVN1BIiE1aE,comdat
+	.type	_ZGVN1BIiE1aE, @gnu_unique_object
+_ZGVN1BIiE1aE:
+	.zero	8
Index: lld/ELF/InputFiles.cpp
===================================================================
--- lld/ELF/InputFiles.cpp
+++ lld/ELF/InputFiles.cpp
@@ -1190,7 +1190,7 @@
       continue;
     }
 
-    if (binding == STB_WEAK)
+    if (sym.binding == STB_WEAK || binding == STB_WEAK)
       continue;
     std::lock_guard<std::mutex> lock(mu);
     ctx.duplicates.push_back({&sym, this, sec, eSym.st_value});


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D136381.469361.patch
Type: text/x-patch
Size: 1899 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221020/77d9d975/attachment.bin>


More information about the llvm-commits mailing list