mirror of https://github.com/aya-rs/aya
				
				
				
			wip: bpftool but with aya
Signed-off-by: Dave Tucker <dave@dtucker.co.uk>pull/902/head
							parent
							
								
									d6dfd678f0
								
							
						
					
					
						commit
						1d752136b9
					
				| @ -0,0 +1,119 @@ | |||||||
|  | use aya_obj::btf::{Btf, BtfType, IntEncoding, VarLinkage}; | ||||||
|  | use object::Endianness; | ||||||
|  | 
 | ||||||
|  | use std::{fmt::Write, path::Path}; | ||||||
|  | 
 | ||||||
|  | pub fn print_btf<P: AsRef<Path>>(path: P) -> anyhow::Result<()> { | ||||||
|  |     let btf = Btf::parse_elf_file(path, Endianness::default())?; | ||||||
|  |     for (i, t) in btf.types().enumerate().skip(1) { | ||||||
|  |         let kind = t.kind(); | ||||||
|  |         let name = if t.name_offset() > 0 { | ||||||
|  |             format!( | ||||||
|  |                 "'{}'", | ||||||
|  |                 btf.string_at(t.name_offset()) | ||||||
|  |                     .unwrap_or(std::borrow::Cow::Borrowed("")) | ||||||
|  |             ) | ||||||
|  |         } else { | ||||||
|  |             "''".to_owned() | ||||||
|  |         }; | ||||||
|  |         let info = match t { | ||||||
|  |             BtfType::Unknown => "".to_string(), | ||||||
|  |             BtfType::Fwd(_) => "type_id=0".to_string(), | ||||||
|  |             BtfType::Const(ty) => format!("type_id={}", ty.btf_type()), | ||||||
|  |             BtfType::Volatile(ty) => format!("type_id={}", ty.btf_type()), | ||||||
|  |             BtfType::Restrict(ty) => format!("type_id={}", ty.btf_type()), | ||||||
|  |             BtfType::Ptr(ty) => format!("type_id={}", ty.btf_type()), | ||||||
|  |             BtfType::Typedef(ty) => format!("type_id={}", ty.btf_type()), | ||||||
|  |             BtfType::Func(ty) => format!("type_id={}", ty.btf_type()), | ||||||
|  |             BtfType::Int(i) => { | ||||||
|  |                 let encoding = match i.encoding() { | ||||||
|  |                     IntEncoding::Signed => "(signed)", | ||||||
|  |                     IntEncoding::Char => "(char)", | ||||||
|  |                     IntEncoding::Bool => "(bool)", | ||||||
|  |                     IntEncoding::None => "(none)", | ||||||
|  |                     IntEncoding::Unknown => "(unknown)", | ||||||
|  |                 }; | ||||||
|  |                 format!( | ||||||
|  |                     "size={} bits_offset={} nr_bits={} encoding={}", | ||||||
|  |                     i.size(), | ||||||
|  |                     i.offset(), | ||||||
|  |                     i.bits(), | ||||||
|  |                     encoding, | ||||||
|  |                 ) | ||||||
|  |             } | ||||||
|  |             BtfType::Float(_) => todo!(), | ||||||
|  |             BtfType::Enum(_) => todo!(), | ||||||
|  |             BtfType::Array(ty) => { | ||||||
|  |                 format!( | ||||||
|  |                     "type_id=0 index_type_id={} nr_elems={}", | ||||||
|  |                     ty.index_type(), | ||||||
|  |                     ty.len() | ||||||
|  |                 ) | ||||||
|  |             } | ||||||
|  |             BtfType::Struct(ty) => { | ||||||
|  |                 let size = ty.size(); | ||||||
|  |                 let vlen = ty.vlen(); | ||||||
|  |                 let mut out = format!("size={} vlen={}", size, vlen,); | ||||||
|  |                 for m in ty.members() { | ||||||
|  |                     let name = btf | ||||||
|  |                         .string_at(m.name_offset()) | ||||||
|  |                         .unwrap_or(std::borrow::Cow::Borrowed("")); | ||||||
|  |                     let type_id = m.btf_type(); | ||||||
|  |                     let offset = ty.member_bit_offset(m); | ||||||
|  |                     write!(out, "\n\t'{name}' type_id={type_id} bits_offset={offset}")?; | ||||||
|  |                 } | ||||||
|  |                 out | ||||||
|  |             } | ||||||
|  |             BtfType::Union(_) => todo!(), | ||||||
|  |             BtfType::FuncProto(ty) => { | ||||||
|  |                 let ret_type_id = ty.return_type(); | ||||||
|  |                 let vlen = ty.vlen(); | ||||||
|  |                 let mut out = format!("ret_type_id={ret_type_id} vlen={vlen}"); | ||||||
|  |                 for p in ty.params() { | ||||||
|  |                     let name = btf | ||||||
|  |                         .string_at(p.name_offset()) | ||||||
|  |                         .unwrap_or(std::borrow::Cow::Borrowed("")); | ||||||
|  |                     let type_id = p.btf_type(); | ||||||
|  |                     write!(out, "\n\t'{name}' type_id={type_id}")?; | ||||||
|  |                 } | ||||||
|  |                 out | ||||||
|  |             } | ||||||
|  |             BtfType::Var(ty) => { | ||||||
|  |                 let type_id = ty.btf_type(); | ||||||
|  |                 let linkage = match ty.linkage() { | ||||||
|  |                     VarLinkage::Static => "static".to_owned(), | ||||||
|  |                     VarLinkage::Global => "global".to_owned(), | ||||||
|  |                     VarLinkage::Extern => "extern".to_owned(), | ||||||
|  |                     VarLinkage::Unknown => "unknown".to_owned(), | ||||||
|  |                 }; | ||||||
|  |                 format!("type_id={type_id} linkage={linkage}") | ||||||
|  |             } | ||||||
|  |             BtfType::DataSec(ty) => { | ||||||
|  |                 let size = ty.size(); | ||||||
|  |                 let vlen = ty.vlen(); | ||||||
|  |                 let mut out = format!("size={size} vlen={vlen}"); | ||||||
|  |                 for entry in ty.entries() { | ||||||
|  |                     let points_to = btf.type_by_id(entry.btf_type()).unwrap(); | ||||||
|  |                     let name = btf | ||||||
|  |                         .string_at(points_to.name_offset()) | ||||||
|  |                         .unwrap_or(std::borrow::Cow::Borrowed("")); | ||||||
|  |                     write!( | ||||||
|  |                         out, | ||||||
|  |                         "\n\ttype_id={} offset={} size={} ({} '{}')", | ||||||
|  |                         entry.btf_type(), | ||||||
|  |                         entry.offset(), | ||||||
|  |                         entry.size(), | ||||||
|  |                         points_to.kind(), | ||||||
|  |                         name | ||||||
|  |                     )?; | ||||||
|  |                 } | ||||||
|  |                 out | ||||||
|  |             } | ||||||
|  |             BtfType::DeclTag(_) => unimplemented!("decl tag formatting not implemented"), | ||||||
|  |             BtfType::TypeTag(_) => unimplemented!("type tag formatting not implemented"), | ||||||
|  |             BtfType::Enum64(_) => unimplemented!("enum64 formatting not implemented"), | ||||||
|  |         }; | ||||||
|  |         println!("[{i}] {kind} {name} {info}"); | ||||||
|  |     } | ||||||
|  |     Ok(()) | ||||||
|  | } | ||||||
					Loading…
					
					
				
		Reference in New Issue