File tree Expand file tree Collapse file tree 2 files changed +47
-0
lines changed
compiler/rustc_codegen_ssa/src/back Expand file tree Collapse file tree 2 files changed +47
-0
lines changed Original file line number Diff line number Diff line change @@ -835,6 +835,22 @@ impl<'a> Linker for GccLinker<'a> {
835
835
if let Err ( error) = res {
836
836
self . sess . dcx ( ) . emit_fatal ( errors:: LibDefWriteFailure { error } ) ;
837
837
}
838
+ } else if crate_type == CrateType :: Executable {
839
+ // Write an LD version script
840
+ let res: io:: Result < ( ) > = try {
841
+ let mut f = File :: create_buffered ( & path) ?;
842
+ writeln ! ( f, "{{" ) ?;
843
+ if !symbols. is_empty ( ) {
844
+ for ( sym, _) in symbols {
845
+ debug ! ( " {sym};" ) ;
846
+ writeln ! ( f, " {sym};" ) ?;
847
+ }
848
+ }
849
+ writeln ! ( f, "}};" ) ?;
850
+ } ;
851
+ if let Err ( error) = res {
852
+ self . sess . dcx ( ) . emit_fatal ( errors:: VersionScriptWriteFailure { error } ) ;
853
+ }
838
854
} else {
839
855
// Write an LD version script
840
856
let res: io:: Result < ( ) > = try {
@@ -860,6 +876,8 @@ impl<'a> Linker for GccLinker<'a> {
860
876
self . link_arg ( "-M" ) . link_arg ( path) ;
861
877
} else if is_windows {
862
878
self . link_arg ( path) ;
879
+ } else if crate_type == CrateType :: Executable {
880
+ self . link_arg ( "--dynamic-list" ) . link_arg ( path) ;
863
881
} else {
864
882
let mut arg = OsString :: from ( "--version-script=" ) ;
865
883
arg. push ( path) ;
Original file line number Diff line number Diff line change
1
+ //@ run-pass
2
+ //@ only-linux
3
+ //@ compile-flags: -Zexport-executable-symbols
4
+ //@ edition: 2024
5
+
6
+ // Regression test for <https://github.com/rust-lang/rust/issues/101610>.
7
+
8
+ #![ feature( rustc_private) ]
9
+
10
+ extern crate libc;
11
+
12
+ #[ unsafe( no_mangle) ]
13
+ fn hack ( ) -> u64 {
14
+ 998244353
15
+ }
16
+
17
+ fn main ( ) {
18
+ unsafe {
19
+ let handle = libc:: dlopen ( std:: ptr:: null ( ) , libc:: RTLD_NOW ) ;
20
+ let ptr = libc:: dlsym ( handle, c"hack" . as_ptr ( ) ) ;
21
+ let ptr: Option < unsafe fn ( ) -> u64 > = std:: mem:: transmute ( ptr) ;
22
+ if let Some ( f) = ptr {
23
+ assert ! ( f( ) == 998244353 ) ;
24
+ println ! ( "symbol `hack` is found successfully" ) ;
25
+ } else {
26
+ panic ! ( "symbol `hack` is not found" ) ;
27
+ }
28
+ }
29
+ }
You can’t perform that action at this time.
0 commit comments