Strategies for finding binary dependencies
1use comfy_table::{Cell, Table};
2use elf::ElfStream;
3use elf::endian::AnyEndian;
4use std::fs::File;
5
6/*
7From https://github.com/cole14/rust-readelf/blob/419f78ac79d2e5b538ffe28777b54a487d953840/src/rust-readelf.rs
8SPDX-SnippetBegin
9SPDX-License-Identifier: MIT
10SPDX-SnippetCopyrightText: Christopher Cole
11*/
12#[allow(dead_code)]
13pub fn print_dynamic_symbol_table(elf_file: &mut ElfStream<AnyEndian, File>) {
14 // Get the .dynsym table. If this file doesn't have one, then we're done
15 let (dynsyms, dynstrs) = match elf_file
16 .dynamic_symbol_table()
17 .expect("failed to get .dynsym and string table")
18 {
19 Some(tables) => tables,
20 None => {
21 return;
22 }
23 };
24
25 // Parse out all the symbols so that we can look up versions for them if needed.
26 let symbols: Vec<(String, elf::symbol::Symbol)> = dynsyms
27 .iter()
28 .map(|sym| {
29 (
30 dynstrs
31 .get(sym.st_name as usize)
32 .expect("failed to get symbol name")
33 .to_string(),
34 sym,
35 )
36 })
37 .collect();
38
39 let vertab = elf_file
40 .symbol_version_table()
41 .expect("failed to parse GNU symbol versions");
42
43 let mut table = Table::new();
44 table.set_header([
45 "ndx",
46 "value",
47 "size",
48 "type",
49 "bind",
50 "visibility",
51 "shndx",
52 "needs version",
53 "name",
54 ]);
55 for (sym_idx, (sym_name, sym)) in symbols.iter().enumerate() {
56 let needs_name = match &vertab {
57 Some(vertab) => {
58 if sym.is_undefined() {
59 match vertab
60 .get_requirement(sym_idx)
61 .expect("failed to parse symbol requirement")
62 {
63 Some(req) => req.name,
64 None => "None",
65 }
66 } else {
67 "None"
68 }
69 }
70 None => "None",
71 };
72 let cells: Vec<Cell> = vec![
73 sym_idx.into(),
74 format!("{:#x}", sym.st_value).into(),
75 sym.st_size.into(),
76 elf::to_str::st_symtype_to_string(sym.st_symtype()).into(),
77 elf::to_str::st_bind_to_string(sym.st_bind()).into(),
78 elf::to_str::st_vis_to_string(sym.st_vis()).into(),
79 sym.st_shndx.into(),
80 needs_name.into(),
81 sym_name.into(),
82 ];
83 table.add_row(cells);
84 }
85 println!("{table}");
86}
87/* SPDX-SnippetEnd */