@@ -337,7 +337,12 @@ pub(crate) trait Linker {
337337 fn debuginfo ( & mut self , strip : Strip , natvis_debugger_visualizers : & [ PathBuf ] ) ;
338338 fn no_crt_objects ( & mut self ) ;
339339 fn no_default_libraries ( & mut self ) ;
340- fn export_symbols ( & mut self , tmpdir : & Path , crate_type : CrateType , symbols : & [ String ] ) ;
340+ fn export_symbols (
341+ & mut self ,
342+ tmpdir : & Path ,
343+ crate_type : CrateType ,
344+ symbols : & [ ( String , SymbolExportKind ) ] ,
345+ ) ;
341346 fn subsystem ( & mut self , subsystem : & str ) ;
342347 fn linker_plugin_lto ( & mut self ) ;
343348 fn add_eh_frame_header ( & mut self ) { }
@@ -770,7 +775,12 @@ impl<'a> Linker for GccLinker<'a> {
770775 }
771776 }
772777
773- fn export_symbols ( & mut self , tmpdir : & Path , crate_type : CrateType , symbols : & [ String ] ) {
778+ fn export_symbols (
779+ & mut self ,
780+ tmpdir : & Path ,
781+ crate_type : CrateType ,
782+ symbols : & [ ( String , SymbolExportKind ) ] ,
783+ ) {
774784 // Symbol visibility in object files typically takes care of this.
775785 if crate_type == CrateType :: Executable {
776786 let should_export_executable_symbols =
@@ -799,7 +809,7 @@ impl<'a> Linker for GccLinker<'a> {
799809 // Write a plain, newline-separated list of symbols
800810 let res: io:: Result < ( ) > = try {
801811 let mut f = File :: create_buffered ( & path) ?;
802- for sym in symbols {
812+ for ( sym, _ ) in symbols {
803813 debug ! ( " _{sym}" ) ;
804814 writeln ! ( f, "_{sym}" ) ?;
805815 }
@@ -814,9 +824,10 @@ impl<'a> Linker for GccLinker<'a> {
814824 // .def file similar to MSVC one but without LIBRARY section
815825 // because LD doesn't like when it's empty
816826 writeln ! ( f, "EXPORTS" ) ?;
817- for symbol in symbols {
827+ for ( symbol, kind) in symbols {
828+ let kind_marker = if * kind == SymbolExportKind :: Data { " DATA" } else { "" } ;
818829 debug ! ( " _{symbol}" ) ;
819- writeln ! ( f, " {symbol}" ) ?;
830+ writeln ! ( f, " {symbol}{kind_marker} " ) ?;
820831 }
821832 } ;
822833 if let Err ( error) = res {
@@ -829,7 +840,7 @@ impl<'a> Linker for GccLinker<'a> {
829840 writeln ! ( f, "{{" ) ?;
830841 if !symbols. is_empty ( ) {
831842 writeln ! ( f, " global:" ) ?;
832- for sym in symbols {
843+ for ( sym, _ ) in symbols {
833844 debug ! ( " {sym};" ) ;
834845 writeln ! ( f, " {sym};" ) ?;
835846 }
@@ -1096,7 +1107,12 @@ impl<'a> Linker for MsvcLinker<'a> {
10961107 // crates. Upstream rlibs may be linked statically to this dynamic library,
10971108 // in which case they may continue to transitively be used and hence need
10981109 // their symbols exported.
1099- fn export_symbols ( & mut self , tmpdir : & Path , crate_type : CrateType , symbols : & [ String ] ) {
1110+ fn export_symbols (
1111+ & mut self ,
1112+ tmpdir : & Path ,
1113+ crate_type : CrateType ,
1114+ symbols : & [ ( String , SymbolExportKind ) ] ,
1115+ ) {
11001116 // Symbol visibility takes care of this typically
11011117 if crate_type == CrateType :: Executable {
11021118 let should_export_executable_symbols =
@@ -1114,9 +1130,10 @@ impl<'a> Linker for MsvcLinker<'a> {
11141130 // straight to exports.
11151131 writeln ! ( f, "LIBRARY" ) ?;
11161132 writeln ! ( f, "EXPORTS" ) ?;
1117- for symbol in symbols {
1133+ for ( symbol, kind) in symbols {
1134+ let kind_marker = if * kind == SymbolExportKind :: Data { " DATA" } else { "" } ;
11181135 debug ! ( " _{symbol}" ) ;
1119- writeln ! ( f, " {symbol}" ) ?;
1136+ writeln ! ( f, " {symbol}{kind_marker} " ) ?;
11201137 }
11211138 } ;
11221139 if let Err ( error) = res {
@@ -1257,14 +1274,19 @@ impl<'a> Linker for EmLinker<'a> {
12571274 self . cc_arg ( "-nodefaultlibs" ) ;
12581275 }
12591276
1260- fn export_symbols ( & mut self , _tmpdir : & Path , _crate_type : CrateType , symbols : & [ String ] ) {
1277+ fn export_symbols (
1278+ & mut self ,
1279+ _tmpdir : & Path ,
1280+ _crate_type : CrateType ,
1281+ symbols : & [ ( String , SymbolExportKind ) ] ,
1282+ ) {
12611283 debug ! ( "EXPORTED SYMBOLS:" ) ;
12621284
12631285 self . cc_arg ( "-s" ) ;
12641286
12651287 let mut arg = OsString :: from ( "EXPORTED_FUNCTIONS=" ) ;
12661288 let encoded = serde_json:: to_string (
1267- & symbols. iter ( ) . map ( |sym| "_" . to_owned ( ) + sym) . collect :: < Vec < _ > > ( ) ,
1289+ & symbols. iter ( ) . map ( |( sym, _ ) | "_" . to_owned ( ) + sym) . collect :: < Vec < _ > > ( ) ,
12681290 )
12691291 . unwrap ( ) ;
12701292 debug ! ( "{encoded}" ) ;
@@ -1426,8 +1448,13 @@ impl<'a> Linker for WasmLd<'a> {
14261448
14271449 fn no_default_libraries ( & mut self ) { }
14281450
1429- fn export_symbols ( & mut self , _tmpdir : & Path , _crate_type : CrateType , symbols : & [ String ] ) {
1430- for sym in symbols {
1451+ fn export_symbols (
1452+ & mut self ,
1453+ _tmpdir : & Path ,
1454+ _crate_type : CrateType ,
1455+ symbols : & [ ( String , SymbolExportKind ) ] ,
1456+ ) {
1457+ for ( sym, _) in symbols {
14311458 self . link_args ( & [ "--export" , sym] ) ;
14321459 }
14331460
@@ -1561,7 +1588,7 @@ impl<'a> Linker for L4Bender<'a> {
15611588 self . cc_arg ( "-nostdlib" ) ;
15621589 }
15631590
1564- fn export_symbols ( & mut self , _: & Path , _: CrateType , _: & [ String ] ) {
1591+ fn export_symbols ( & mut self , _: & Path , _: CrateType , _: & [ ( String , SymbolExportKind ) ] ) {
15651592 // ToDo, not implemented, copy from GCC
15661593 self . sess . dcx ( ) . emit_warn ( errors:: L4BenderExportingSymbolsUnimplemented ) ;
15671594 }
@@ -1718,12 +1745,17 @@ impl<'a> Linker for AixLinker<'a> {
17181745
17191746 fn no_default_libraries ( & mut self ) { }
17201747
1721- fn export_symbols ( & mut self , tmpdir : & Path , _crate_type : CrateType , symbols : & [ String ] ) {
1748+ fn export_symbols (
1749+ & mut self ,
1750+ tmpdir : & Path ,
1751+ _crate_type : CrateType ,
1752+ symbols : & [ ( String , SymbolExportKind ) ] ,
1753+ ) {
17221754 let path = tmpdir. join ( "list.exp" ) ;
17231755 let res: io:: Result < ( ) > = try {
17241756 let mut f = File :: create_buffered ( & path) ?;
17251757 // FIXME: use llvm-nm to generate export list.
1726- for symbol in symbols {
1758+ for ( symbol, _ ) in symbols {
17271759 debug ! ( " _{symbol}" ) ;
17281760 writeln ! ( f, " {symbol}" ) ?;
17291761 }
@@ -1767,9 +1799,12 @@ fn for_each_exported_symbols_include_dep<'tcx>(
17671799 }
17681800}
17691801
1770- pub ( crate ) fn exported_symbols ( tcx : TyCtxt < ' _ > , crate_type : CrateType ) -> Vec < String > {
1802+ pub ( crate ) fn exported_symbols (
1803+ tcx : TyCtxt < ' _ > ,
1804+ crate_type : CrateType ,
1805+ ) -> Vec < ( String , SymbolExportKind ) > {
17711806 if let Some ( ref exports) = tcx. sess . target . override_export_symbols {
1772- return exports. iter ( ) . map ( ToString :: to_string ) . collect ( ) ;
1807+ return exports. iter ( ) . map ( |name| ( name . to_string ( ) , SymbolExportKind :: Text ) ) . collect ( ) ;
17731808 }
17741809
17751810 if let CrateType :: ProcMacro = crate_type {
@@ -1779,25 +1814,29 @@ pub(crate) fn exported_symbols(tcx: TyCtxt<'_>, crate_type: CrateType) -> Vec<St
17791814 }
17801815}
17811816
1782- fn exported_symbols_for_non_proc_macro ( tcx : TyCtxt < ' _ > , crate_type : CrateType ) -> Vec < String > {
1817+ fn exported_symbols_for_non_proc_macro (
1818+ tcx : TyCtxt < ' _ > ,
1819+ crate_type : CrateType ,
1820+ ) -> Vec < ( String , SymbolExportKind ) > {
17831821 let mut symbols = Vec :: new ( ) ;
17841822 let export_threshold = symbol_export:: crates_export_threshold ( & [ crate_type] ) ;
17851823 for_each_exported_symbols_include_dep ( tcx, crate_type, |symbol, info, cnum| {
17861824 // Do not export mangled symbols from cdylibs and don't attempt to export compiler-builtins
17871825 // from any cdylib. The latter doesn't work anyway as we use hidden visibility for
17881826 // compiler-builtins. Most linkers silently ignore it, but ld64 gives a warning.
17891827 if info. level . is_below_threshold ( export_threshold) && !tcx. is_compiler_builtins ( cnum) {
1790- symbols. push ( symbol_export:: exporting_symbol_name_for_instance_in_crate (
1791- tcx, symbol, cnum,
1828+ symbols. push ( (
1829+ symbol_export:: exporting_symbol_name_for_instance_in_crate ( tcx, symbol, cnum) ,
1830+ info. kind ,
17921831 ) ) ;
1793- symbol_export:: extend_exported_symbols ( & mut symbols, tcx, symbol, cnum) ;
1832+ symbol_export:: extend_exported_symbols ( & mut symbols, tcx, symbol, info , cnum) ;
17941833 }
17951834 } ) ;
17961835
17971836 symbols
17981837}
17991838
1800- fn exported_symbols_for_proc_macro_crate ( tcx : TyCtxt < ' _ > ) -> Vec < String > {
1839+ fn exported_symbols_for_proc_macro_crate ( tcx : TyCtxt < ' _ > ) -> Vec < ( String , SymbolExportKind ) > {
18011840 // `exported_symbols` will be empty when !should_codegen.
18021841 if !tcx. sess . opts . output_types . should_codegen ( ) {
18031842 return Vec :: new ( ) ;
@@ -1807,7 +1846,10 @@ fn exported_symbols_for_proc_macro_crate(tcx: TyCtxt<'_>) -> Vec<String> {
18071846 let proc_macro_decls_name = tcx. sess . generate_proc_macro_decls_symbol ( stable_crate_id) ;
18081847 let metadata_symbol_name = exported_symbols:: metadata_symbol_name ( tcx) ;
18091848
1810- vec ! [ proc_macro_decls_name, metadata_symbol_name]
1849+ vec ! [
1850+ ( proc_macro_decls_name, SymbolExportKind :: Text ) ,
1851+ ( metadata_symbol_name, SymbolExportKind :: Text ) ,
1852+ ]
18111853}
18121854
18131855pub ( crate ) fn linked_symbols (
@@ -1829,7 +1871,9 @@ pub(crate) fn linked_symbols(
18291871 || info. used
18301872 {
18311873 symbols. push ( (
1832- symbol_export:: linking_symbol_name_for_instance_in_crate ( tcx, symbol, cnum) ,
1874+ symbol_export:: linking_symbol_name_for_instance_in_crate (
1875+ tcx, symbol, info. kind , cnum,
1876+ ) ,
18331877 info. kind ,
18341878 ) ) ;
18351879 }
@@ -1904,7 +1948,13 @@ impl<'a> Linker for PtxLinker<'a> {
19041948
19051949 fn ehcont_guard ( & mut self ) { }
19061950
1907- fn export_symbols ( & mut self , _tmpdir : & Path , _crate_type : CrateType , _symbols : & [ String ] ) { }
1951+ fn export_symbols (
1952+ & mut self ,
1953+ _tmpdir : & Path ,
1954+ _crate_type : CrateType ,
1955+ _symbols : & [ ( String , SymbolExportKind ) ] ,
1956+ ) {
1957+ }
19081958
19091959 fn subsystem ( & mut self , _subsystem : & str ) { }
19101960
@@ -1973,10 +2023,15 @@ impl<'a> Linker for LlbcLinker<'a> {
19732023
19742024 fn ehcont_guard ( & mut self ) { }
19752025
1976- fn export_symbols ( & mut self , _tmpdir : & Path , _crate_type : CrateType , symbols : & [ String ] ) {
2026+ fn export_symbols (
2027+ & mut self ,
2028+ _tmpdir : & Path ,
2029+ _crate_type : CrateType ,
2030+ symbols : & [ ( String , SymbolExportKind ) ] ,
2031+ ) {
19772032 match _crate_type {
19782033 CrateType :: Cdylib => {
1979- for sym in symbols {
2034+ for ( sym, _ ) in symbols {
19802035 self . link_args ( & [ "--export-symbol" , sym] ) ;
19812036 }
19822037 }
@@ -2050,11 +2105,16 @@ impl<'a> Linker for BpfLinker<'a> {
20502105
20512106 fn ehcont_guard ( & mut self ) { }
20522107
2053- fn export_symbols ( & mut self , tmpdir : & Path , _crate_type : CrateType , symbols : & [ String ] ) {
2108+ fn export_symbols (
2109+ & mut self ,
2110+ tmpdir : & Path ,
2111+ _crate_type : CrateType ,
2112+ symbols : & [ ( String , SymbolExportKind ) ] ,
2113+ ) {
20542114 let path = tmpdir. join ( "symbols" ) ;
20552115 let res: io:: Result < ( ) > = try {
20562116 let mut f = File :: create_buffered ( & path) ?;
2057- for sym in symbols {
2117+ for ( sym, _ ) in symbols {
20582118 writeln ! ( f, "{sym}" ) ?;
20592119 }
20602120 } ;
0 commit comments