From 718ea90f6793148c4d268a4f6d905b5ce820807e Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Thu, 29 Sep 2022 10:03:34 -0700 Subject: [PATCH] Don't export `main` on WebAssembly. On `default_hidden_visibility = true` platforms, which is currently just WebAssembly, don't automatically export `main`. On such platforms, `main` in C defaults to being hidden, and therefore not automatically exported. --- .../src/back/symbol_export.rs | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/compiler/rustc_codegen_ssa/src/back/symbol_export.rs b/compiler/rustc_codegen_ssa/src/back/symbol_export.rs index 8d7e2c5cf3939..090e4aca7c263 100644 --- a/compiler/rustc_codegen_ssa/src/back/symbol_export.rs +++ b/compiler/rustc_codegen_ssa/src/back/symbol_export.rs @@ -179,17 +179,22 @@ fn exported_symbols_provider_local<'tcx>( .map(|(&def_id, &info)| (ExportedSymbol::NonGeneric(def_id), info)) .collect(); - if tcx.entry_fn(()).is_some() { - let exported_symbol = ExportedSymbol::NoDefId(SymbolName::new(tcx, "main")); + // Export `main`, on platforms where it has "default" visibility. On platforms + // where C functions are "hidden", `main` is "hidden" too, which means we aren't + // expected to export it. + if !tcx.sess.target.default_hidden_visibility { + if tcx.entry_fn(()).is_some() { + let exported_symbol = ExportedSymbol::NoDefId(SymbolName::new(tcx, "main")); - symbols.push(( - exported_symbol, - SymbolExportInfo { - level: SymbolExportLevel::C, - kind: SymbolExportKind::Text, - used: false, - }, - )); + symbols.push(( + exported_symbol, + SymbolExportInfo { + level: SymbolExportLevel::C, + kind: SymbolExportKind::Text, + used: false, + }, + )); + } } if tcx.allocator_kind(()).is_some() {