Skip to content

Commit 72f939c

Browse files
run-make-support: add object-based symbol helpers
- `dynamic_symbol_names` - `text_section_global_dynamic_symbol_names` - `global_undefined_dynamic_symbol_names` Also add some missing `#[track_caller]` attributes. Co-authored-by: binarycat <[email protected]>
1 parent dfb06f1 commit 72f939c

File tree

1 file changed

+20
-5
lines changed

1 file changed

+20
-5
lines changed

src/tools/run-make-support/src/symbols.rs

+20-5
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,32 @@ use std::path::Path;
22

33
use 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]
1022
pub fn with_symbol_iter<P, F, R>(path: P, func: F) -> R
1123
where
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
}
@@ -24,6 +38,7 @@ where
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]
2742
pub 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

Comments
 (0)