1
1
//! Handles dynamic library loading for proc macro
2
2
3
- use crate :: { proc_macro:: bridge, rustc_server:: TokenStream } ;
4
- use std:: fs:: File ;
5
- use std:: path:: { Path , PathBuf } ;
3
+ use std:: {
4
+ fs:: File ,
5
+ io,
6
+ path:: { Path , PathBuf } ,
7
+ } ;
6
8
7
- use goblin:: { mach:: Mach , Object } ;
8
9
use libloading:: Library ;
9
10
use memmap:: Mmap ;
11
+ use object:: Object ;
10
12
use proc_macro_api:: ProcMacroKind ;
11
- use std:: io;
13
+
14
+ use crate :: { proc_macro:: bridge, rustc_server:: TokenStream } ;
12
15
13
16
const NEW_REGISTRAR_SYMBOL : & str = "_rustc_proc_macro_decls_" ;
14
17
@@ -23,40 +26,26 @@ fn is_derive_registrar_symbol(symbol: &str) -> bool {
23
26
fn find_registrar_symbol ( file : & Path ) -> io:: Result < Option < String > > {
24
27
let file = File :: open ( file) ?;
25
28
let buffer = unsafe { Mmap :: map ( & file) ? } ;
26
- let object = Object :: parse ( & buffer) . map_err ( invalid_data_err) ?;
27
29
28
- let name = match object {
29
- Object :: Elf ( elf) => {
30
- let symbols = elf. dynstrtab . to_vec ( ) . map_err ( invalid_data_err) ?;
31
- symbols. into_iter ( ) . find ( |s| is_derive_registrar_symbol ( s) ) . map ( & str:: to_owned)
32
- }
33
- Object :: PE ( pe) => pe
34
- . exports
35
- . iter ( )
36
- . flat_map ( |s| s. name )
37
- . find ( |s| is_derive_registrar_symbol ( s) )
38
- . map ( & str:: to_owned) ,
39
- Object :: Mach ( Mach :: Binary ( binary) ) => {
40
- let exports = binary. exports ( ) . map_err ( invalid_data_err) ?;
41
- exports
42
- . iter ( )
43
- . map ( |s| {
44
- // In macos doc:
45
- // https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/dlsym.3.html
46
- // Unlike other dyld API's, the symbol name passed to dlsym() must NOT be
47
- // prepended with an underscore.
48
- if s. name . starts_with ( '_' ) {
49
- & s. name [ 1 ..]
50
- } else {
51
- & s. name
52
- }
53
- } )
54
- . find ( |s| is_derive_registrar_symbol ( s) )
55
- . map ( & str:: to_owned)
56
- }
57
- _ => return Ok ( None ) ,
58
- } ;
59
- return Ok ( name) ;
30
+ Ok ( object:: File :: parse ( & buffer)
31
+ . map_err ( invalid_data_err) ?
32
+ . exports ( )
33
+ . map_err ( invalid_data_err) ?
34
+ . into_iter ( )
35
+ . map ( |export| export. name ( ) )
36
+ . filter_map ( |sym| String :: from_utf8 ( sym. into ( ) ) . ok ( ) )
37
+ . find ( |sym| is_derive_registrar_symbol ( sym) )
38
+ . map ( |sym| {
39
+ // From MacOS docs:
40
+ // https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/dlsym.3.html
41
+ // Unlike other dyld API's, the symbol name passed to dlsym() must NOT be
42
+ // prepended with an underscore.
43
+ if cfg ! ( target_os = "macos" ) && sym. starts_with ( '_' ) {
44
+ sym[ 1 ..] . to_owned ( )
45
+ } else {
46
+ sym
47
+ }
48
+ } ) )
60
49
}
61
50
62
51
/// Loads dynamic library in platform dependent manner.
0 commit comments