@@ -2,18 +2,32 @@ use std::path::Path;
22
33use object:: { self , Object , ObjectSymbol , SymbolIterator } ;
44
5- /// Iterate through the symbols in an object file.
6- ///
7- /// Uses a callback because `SymbolIterator` does not own its data.
5+ /// Given an [`object::File`], find the exported dynamic symbol names via
6+ /// [`object::Object::exports`]. This does **not** impose any filters on the specific dynamic
7+ /// symbols, e.g. if they are global or local, if they are defined or not, and in which section the
8+ /// dynamic symbols reside in.
9+ #[ track_caller]
10+ pub fn exported_dynamic_symbol_names < ' file > ( file : & ' file object:: File < ' file > ) -> Vec < & ' file str > {
11+ file. exports ( )
12+ . unwrap ( )
13+ . into_iter ( )
14+ . filter_map ( |sym| std:: str:: from_utf8 ( sym. name ( ) ) . ok ( ) )
15+ . collect ( )
16+ }
17+
18+ /// Iterate through the symbols in an object file. See [`object::Object::symbols`].
819///
920/// Panics if `path` is not a valid object file readable by the current user.
21+ #[ track_caller]
1022pub fn with_symbol_iter < P , F , R > ( path : P , func : F ) -> R
1123where
1224 P : AsRef < Path > ,
1325 F : FnOnce ( & mut SymbolIterator < ' _ , ' _ > ) -> R ,
1426{
15- let raw_bytes = crate :: fs:: read ( path) ;
16- let f = object:: File :: parse ( raw_bytes. as_slice ( ) ) . expect ( "unable to parse file" ) ;
27+ let path = path. as_ref ( ) ;
28+ let blob = crate :: fs:: read ( path) ;
29+ let f = object:: File :: parse ( & * blob)
30+ . unwrap_or_else ( |e| panic ! ( "failed to parse `{}`: {e}" , path. display( ) ) ) ;
1731 let mut iter = f. symbols ( ) ;
1832 func ( & mut iter)
1933}
2438/// `path` contain a substring listed in `substrings`.
2539///
2640/// Panics if `path` is not a valid object file readable by the current user.
41+ #[ track_caller]
2742pub fn any_symbol_contains ( path : impl AsRef < Path > , substrings : & [ & str ] ) -> bool {
2843 with_symbol_iter ( path, |syms| {
2944 for sym in syms {
0 commit comments