11//! Handles dynamic library loading for proc macro
22
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+ } ;
68
7- use goblin:: { mach:: Mach , Object } ;
89use libloading:: Library ;
910use memmap:: Mmap ;
11+ use object:: Object ;
1012use proc_macro_api:: ProcMacroKind ;
11- use std:: io;
13+
14+ use crate :: { proc_macro:: bridge, rustc_server:: TokenStream } ;
1215
1316const NEW_REGISTRAR_SYMBOL : & str = "_rustc_proc_macro_decls_" ;
1417
@@ -23,40 +26,26 @@ fn is_derive_registrar_symbol(symbol: &str) -> bool {
2326fn find_registrar_symbol ( file : & Path ) -> io:: Result < Option < String > > {
2427 let file = File :: open ( file) ?;
2528 let buffer = unsafe { Mmap :: map ( & file) ? } ;
26- let object = Object :: parse ( & buffer) . map_err ( invalid_data_err) ?;
2729
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+ } ) )
6049}
6150
6251/// Loads dynamic library in platform dependent manner.
0 commit comments