@@ -2,28 +2,44 @@ use std::path::Path;
2
2
3
3
use object:: { self , Object , ObjectSymbol , SymbolIterator } ;
4
4
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 distinguish between which section the symbols appear
7
+ /// in.
8
+ #[ track_caller]
9
+ pub fn exported_dynamic_symbol_names < ' file > ( file : & ' file object:: File < ' file > ) -> Vec < & ' file str > {
10
+ file. exports ( )
11
+ . unwrap ( )
12
+ . into_iter ( )
13
+ . filter_map ( |sym| std:: str:: from_utf8 ( sym. name ( ) ) . ok ( ) )
14
+ . collect ( )
15
+ }
16
+
17
+ /// Iterate through the symbols in an object file. See [`object::Object::symbols`].
8
18
///
9
- /// Panics if `path` is not a valid object file readable by the current user.
19
+ /// Panics if `path` is not a valid object file readable by the current user or if `path` cannot be
20
+ /// parsed as a recognized object file.
21
+ #[ track_caller]
10
22
pub fn with_symbol_iter < P , F , R > ( path : P , func : F ) -> R
11
23
where
12
24
P : AsRef < Path > ,
13
25
F : FnOnce ( & mut SymbolIterator < ' _ , ' _ > ) -> R ,
14
26
{
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( ) ) ) ;
17
31
let mut iter = f. symbols ( ) ;
18
32
func ( & mut iter)
19
33
}
20
34
21
35
/// Check an object file's symbols for substrings.
22
36
///
23
- /// Returns `true` if any of the symbols found in the object file at
24
- /// `path` contain a substring listed in `substrings`.
37
+ /// Returns `true` if any of the symbols found in the object file at `path` contain a substring
38
+ /// listed in `substrings`.
25
39
///
26
- /// Panics if `path` is not a valid object file readable by the current user.
40
+ /// Panics if `path` is not a valid object file readable by the current user or if `path` cannot be
41
+ /// parsed as a recognized object file.
42
+ #[ track_caller]
27
43
pub fn any_symbol_contains ( path : impl AsRef < Path > , substrings : & [ & str ] ) -> bool {
28
44
with_symbol_iter ( path, |syms| {
29
45
for sym in syms {
0 commit comments