aya: only consider Text symbols as relocatable functions

perf-event
Alessandro Decina 3 years ago
parent d9fc0f484f
commit c56a6b16aa

@ -3,7 +3,7 @@ mod relocation;
use object::{ use object::{
read::{Object as ElfObject, ObjectSection, Section as ObjSection}, read::{Object as ElfObject, ObjectSection, Section as ObjSection},
Endianness, ObjectSymbol, ObjectSymbolTable, RelocationTarget, SectionIndex, Endianness, ObjectSymbol, ObjectSymbolTable, RelocationTarget, SectionIndex, SymbolKind,
}; };
use std::{ use std::{
collections::HashMap, collections::HashMap,
@ -181,6 +181,7 @@ impl Object {
address: symbol.address(), address: symbol.address(),
size: symbol.size(), size: symbol.size(),
is_definition: symbol.is_definition(), is_definition: symbol.is_definition(),
is_text: symbol.kind() == SymbolKind::Text,
}; };
bpf_obj bpf_obj
.symbols_by_index .symbols_by_index
@ -242,7 +243,7 @@ impl Object {
let mut symbols_by_address = HashMap::new(); let mut symbols_by_address = HashMap::new();
for sym in self.symbols_by_index.values() { for sym in self.symbols_by_index.values() {
if sym.is_definition && sym.section_index == Some(section.index) { if sym.is_definition && sym.is_text && sym.section_index == Some(section.index) {
if symbols_by_address.contains_key(&sym.address) { if symbols_by_address.contains_key(&sym.address) {
return Err(ParseError::SymbolTableConflict { return Err(ParseError::SymbolTableConflict {
section_index: section.index.0, section_index: section.index.0,
@ -381,10 +382,10 @@ pub enum ParseError {
#[error("error parsing map `{name}`")] #[error("error parsing map `{name}`")]
InvalidMapDefinition { name: String }, InvalidMapDefinition { name: String },
#[error("two or more symbols in section `{section_index}` have the same address {address:x}")] #[error("two or more symbols in section `{section_index}` have the same address {address:#X}")]
SymbolTableConflict { section_index: usize, address: u64 }, SymbolTableConflict { section_index: usize, address: u64 },
#[error("unknown symbol in section `{section_index}` at address {address:x}")] #[error("unknown symbol in section `{section_index}` at address {address:#X}")]
UnknownSymbol { section_index: usize, address: u64 }, UnknownSymbol { section_index: usize, address: u64 },
#[error("invalid symbol, index `{index}` name: {}", .name.as_ref().unwrap_or(&"[unknown]".into()))] #[error("invalid symbol, index `{index}` name: {}", .name.as_ref().unwrap_or(&"[unknown]".into()))]

@ -20,8 +20,8 @@ enum RelocationError {
#[error("unknown symbol, index `{index}`")] #[error("unknown symbol, index `{index}`")]
UnknownSymbol { index: usize }, UnknownSymbol { index: usize },
#[error("section `{section_index}` not found, referenced by symbol `{}`", #[error("section `{section_index}` not found, referenced by symbol `{}` #{symbol_index}",
.symbol_name.clone().unwrap_or_else(|| .symbol_index.to_string()))] .symbol_name.clone().unwrap_or_else(|| "".to_string()))]
SectionNotFound { SectionNotFound {
section_index: usize, section_index: usize,
symbol_index: usize, symbol_index: usize,
@ -57,6 +57,7 @@ pub(crate) struct Symbol {
pub(crate) address: u64, pub(crate) address: u64,
pub(crate) size: u64, pub(crate) size: u64,
pub(crate) is_definition: bool, pub(crate) is_definition: bool,
pub(crate) is_text: bool,
} }
impl Object { impl Object {

Loading…
Cancel
Save