[PATCH] D108016: [lld-macho] Ignore LLVM segments to prevent duplicate syms

Vincent Lee via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 12 23:20:01 PDT 2021


thevinster created this revision.
Herald added a reviewer: gkm.
Herald added a project: lld-macho.
Herald added a reviewer: lld-macho.
thevinster edited the summary of this revision.
thevinster updated this revision to Diff 366197.
thevinster added a comment.
thevinster published this revision for review.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Cleanup wording


There was an instance of a third-party archive containing multiple _llvm symbols from 
different files that clashed with each other producing duplicate symbols. Symbols under 
the LLVM segment don't seem to be producing any meaningful value, so just ignore them.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D108016

Files:
  lld/MachO/InputFiles.cpp
  lld/test/MachO/ignore-symbols.s


Index: lld/test/MachO/ignore-symbols.s
===================================================================
--- /dev/null
+++ lld/test/MachO/ignore-symbols.s
@@ -0,0 +1,20 @@
+# REQUIRES: x86
+# RUN: rm -rf %t; split-file %s %t
+# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/foo.s -o %t/foo.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/bar.s -o %t/bar.o
+
+## _llvm. symbols are not special. LLD would produce duplicate symbol errors
+## if they were not within the LLVM segment.
+# RUN: %lld -dylib %t/foo.o %t/bar.o -o %t/libDuplicate.dylib
+
+#--- foo.s
+.globl _llvm.foo
+.section __LLVM,__bitcode
+_llvm.foo:
+.asciz "test"
+
+#--- bar.s
+.globl _llvm.foo
+.section __LLVM,__bitcode
+_llvm.foo:
+.asciz "test"
Index: lld/MachO/InputFiles.cpp
===================================================================
--- lld/MachO/InputFiles.cpp
+++ lld/MachO/InputFiles.cpp
@@ -282,16 +282,20 @@
     } else {
       auto *isec =
           make<ConcatInputSection>(segname, name, this, data, align, flags);
-      if (!(isDebugSection(isec->getFlags()) &&
-            isec->getSegName() == segment_names::dwarf)) {
-        subsections.push_back({{0, isec}});
-      } else {
+      if (isDebugSection(isec->getFlags()) &&
+            isec->getSegName() == segment_names::dwarf) {
         // Instead of emitting DWARF sections, we emit STABS symbols to the
         // object files that contain them. We filter them out early to avoid
         // parsing their relocations unnecessarily. But we must still push an
         // empty map to ensure the indices line up for the remaining sections.
         subsections.push_back({});
         debugSections.push_back(isec);
+      } else if (isec->getSegName() == segment_names::llvm) {
+        // Sections within the llvm segment aren't known to induce symbols errors.
+        // Push an empty map to ensure indices line up for the remaining sections.
+        subsections.push_back({});
+      } else {
+        subsections.push_back({{0, isec}});
       }
     }
   }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D108016.366197.patch
Type: text/x-patch
Size: 2053 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210813/90a89bbe/attachment.bin>


More information about the llvm-commits mailing list