Strategies for finding binary dependencies
at main 87 lines 2.6 kB view raw
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 */