[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