Skip to content

Commit c7a5f02

Browse files
author
Kai Luo
committed
Calculate concret symbol size
1 parent 6c2d910 commit c7a5f02

File tree

1 file changed

+22
-5
lines changed

1 file changed

+22
-5
lines changed

src/symbolize/gimli/xcoff.rs

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@ use super::mystd::str;
44
use super::{Context, Mapping, Path, Stash, Vec};
55
use core::ops::Deref;
66
use object::read::archive::ArchiveFile;
7-
use object::read::xcoff::FileHeader;
8-
use object::read::xcoff::SectionHeader;
9-
use object::read::xcoff::XcoffFile;
7+
use object::read::xcoff::{FileHeader, SectionHeader, XcoffFile, XcoffSymbol};
108
use object::Object as _;
119
use object::ObjectSection as _;
1210
use object::ObjectSymbol as _;
11+
use object::SymbolFlags;
1312

1413
#[cfg(target_pointer_width = "32")]
1514
type Xcoff = object::xcoff::FileHeader32;
@@ -99,14 +98,32 @@ pub fn parse_image(path: &Path, member_name: &OsString) -> Option<Image> {
9998
}
10099

101100
impl<'a> Object<'a> {
101+
fn get_concret_size(file: &XcoffFile<'a, Xcoff>, sym: &XcoffSymbol<'a, '_, Xcoff>) -> u64 {
102+
match sym.flags() {
103+
SymbolFlags::Xcoff {
104+
n_sclass: _,
105+
x_smtyp: _,
106+
x_smclas: _,
107+
containing_csect: Some(index),
108+
} => {
109+
if let Ok(tgt_sym) = file.symbol_by_index(index) {
110+
return Self::get_concret_size(file, &tgt_sym);
111+
} else {
112+
0
113+
}
114+
}
115+
_ => sym.size(),
116+
}
117+
}
118+
102119
fn parse(data: &'a [u8]) -> Option<Object<'a>> {
103120
let file = XcoffFile::parse(data).ok()?;
104121
let mut syms = file
105122
.symbols()
106123
.filter_map(|sym| {
107-
let address = sym.address();
108-
let size = sym.size();
109124
let name = sym.name().map_or("", |v| v);
125+
let address = sym.address();
126+
let size = Self::get_concret_size(&file, &sym);
110127
if name == ".text" || name == ".data" {
111128
None
112129
} else {

0 commit comments

Comments
 (0)