[PATCH] D127562: [lld-macho] Add support for exporting no symbols
Keith Smiley via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 10 23:51:28 PDT 2022
keith created this revision.
Herald added projects: lld-macho, All.
Herald added a reviewer: lld-macho.
keith requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
As an optimization for ld64 sometimes it can be useful to not export any
symbols for top level binaries that don't need any exports, to do this
you can pass `-exported_symbols_list /dev/null`, or new with Xcode 14
(ld64 816) there is a `-no_exported_symbols` flag for the same behavior.
This reproduces this behavior where previously an empty exported symbols
list file would have been ignored.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D127562
Files:
lld/MachO/Driver.cpp
lld/MachO/Options.td
lld/test/MachO/export-options.s
Index: lld/test/MachO/export-options.s
===================================================================
--- lld/test/MachO/export-options.s
+++ lld/test/MachO/export-options.s
@@ -9,6 +9,14 @@
# RUN: not %lld -dylib %t/default.o -o /dev/null \
# RUN: -exported_symbol a -unexported_symbol b 2>&1 | \
# RUN: FileCheck --check-prefix=CONFLICT %s
+#
+# RUN: not %lld -dylib %t/default.o -o /dev/null \
+# RUN: -exported_symbols_list /dev/null -unexported_symbol b 2>&1 | \
+# RUN: FileCheck --check-prefix=CONFLICT %s
+#
+# RUN: not %lld -dylib %t/default.o -o /dev/null \
+# RUN: -no_exported_symbols -unexported_symbol b 2>&1 | \
+# RUN: FileCheck --check-prefix=CONFLICT %s
# CONFLICT: error: cannot use both -exported_symbol* and -unexported_symbol* options
# CONFLICT-NEXT: >>> ignoring unexports
@@ -162,6 +170,17 @@
# AUTOHIDE-PRIVATE: error: cannot export hidden symbol _foo
# AUTOHIDE-PRIVATE-DEAD-STRIP: (__TEXT,__text) non-external (was a private external) _foo
+## Test not exporting any symbols
+# RUN: %lld -dylib %t/symdefs.o -o %t/noexports -exported_symbols_list /dev/null
+# RUN: llvm-objdump --macho --exports-trie %t/noexports | FileCheck --check-prefix=NOEXPORTS %s
+# RUN: %lld -dylib %t/symdefs.o -o %t/noexports -no_exported_symbols
+# RUN: llvm-objdump --macho --exports-trie %t/noexports | FileCheck --check-prefix=NOEXPORTS %s
+
+# NOEXPORTS-NOT: globby_also
+# NOEXPORTS-NOT: globby_only
+# NOEXPORTS-NOT: literal_also
+# NOEXPORTS-NOT: literal_only
+
#--- default.s
.globl _keep_globl, _hide_globl
Index: lld/MachO/Options.td
===================================================================
--- lld/MachO/Options.td
+++ lld/MachO/Options.td
@@ -483,6 +483,9 @@
MetaVarName<"<file>">,
HelpText<"Symbols specified in <file> remain global, while others become private externs">,
Group<grp_resolve>;
+def no_exported_symbols : Flag<["-"], "no_exported_symbols">,
+ HelpText<"Don't export any symbols from the binary, useful for main executables that don't have plugins">,
+ Group<grp_resolve>;
def unexported_symbol : Separate<["-"], "unexported_symbol">,
MetaVarName<"<symbol>">,
HelpText<"Global <symbol> becomes private extern">,
Index: lld/MachO/Driver.cpp
===================================================================
--- lld/MachO/Driver.cpp
+++ lld/MachO/Driver.cpp
@@ -1405,7 +1405,12 @@
OPT_exported_symbols_list);
handleSymbolPatterns(args, config->unexportedSymbols, OPT_unexported_symbol,
OPT_unexported_symbols_list);
- if (!config->exportedSymbols.empty() && !config->unexportedSymbols.empty()) {
+ bool emptyExportedSymbolsList =
+ args.hasArg(OPT_exported_symbols_list) && config->exportedSymbols.empty();
+ bool exportNoSymbols =
+ emptyExportedSymbolsList || args.hasArg(OPT_no_exported_symbols);
+ if ((!config->exportedSymbols.empty() || exportNoSymbols) &&
+ !config->unexportedSymbols.empty()) {
error("cannot use both -exported_symbol* and -unexported_symbol* options\n"
">>> ignoring unexports");
config->unexportedSymbols.clear();
@@ -1553,7 +1558,7 @@
createSyntheticSections();
createSyntheticSymbols();
- if (!config->exportedSymbols.empty()) {
+ if (!config->exportedSymbols.empty() || exportNoSymbols) {
parallelForEach(symtab->getSymbols(), [](Symbol *sym) {
if (auto *defined = dyn_cast<Defined>(sym)) {
StringRef symbolName = defined->getName();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D127562.436114.patch
Type: text/x-patch
Size: 3532 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220611/b6941a19/attachment.bin>
More information about the llvm-commits
mailing list