Skip to content

Commit 903ea3a

Browse files
author
Kai Luo
committed
Address comments
1 parent 8614e48 commit 903ea3a

File tree

4 files changed

+41
-33
lines changed

4 files changed

+41
-33
lines changed

src/symbolize/gimli.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,8 +278,8 @@ struct Cache {
278278
struct Library {
279279
name: OsString,
280280
#[cfg(target_os = "aix")]
281-
/// On AIX, the library mmapped can be a member of an big-archive file.
282-
/// For example, an big-archive named libfoo.a contains libbar.so,
281+
/// On AIX, the library mmapped can be a member of a big-archive file.
282+
/// For example, with a big-archive named libfoo.a containing libbar.so,
283283
/// one can use `dlopen("libfoo.a(libbar.so)", RTLD_MEMBER | RTLD_LAZY)`
284284
/// to use the `libbar.so` library. In this case, only `libbar.so` is
285285
/// mmapped, not the whole `libfoo.a`.

src/symbolize/gimli/libs_aix.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,19 @@ pub(super) fn native_libraries() -> Vec<Library> {
2626
{
2727
break;
2828
} else {
29-
if Error::last_os_error().raw_os_error().unwrap() != libc::ENOMEM {
30-
return Vec::new();
29+
match Error::last_os_error().raw_os_error() {
30+
Some(libc::ENOMEM) => {
31+
buffer.resize(buffer.len() * 2, mem::zeroed::<libc::ld_info>());
32+
}
33+
Some(_) => {
34+
// If other error occurs, return empty libraries.
35+
return Vec::new();
36+
}
37+
_ => unreachable!(),
3138
}
32-
buffer.resize(buffer.len() * 2, mem::zeroed::<libc::ld_info>());
3339
}
3440
}
35-
let mut current = buffer.as_ptr() as *mut libc::ld_info;
41+
let mut current = buffer.as_mut_ptr();
3642
loop {
3743
let text_base = (*current).ldinfo_textorg as usize;
3844
let filename_ptr: *const libc::c_char = &(*current).ldinfo_filename[0];

src/symbolize/gimli/xcoff.rs

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,14 @@ impl Mapping {
2424
Context::new(stash, Object::parse(data)?, None, None)
2525
} else {
2626
let archive = ArchiveFile::parse(data).ok()?;
27-
for member in archive.members() {
28-
if let Ok(member) = member {
29-
let name = OsStr::from_bytes(member.name());
30-
if name == member_name {
31-
let member_data = member.data(data).ok()?;
32-
if let Some(obj) = Object::parse(member_data) {
33-
return Context::new(stash, obj, None, None);
34-
}
35-
}
27+
for member in archive
28+
.members()
29+
.filter_map(|m| m.ok())
30+
.filter(|m| OsStr::from_bytes(m.name()) == member_name)
31+
{
32+
let member_data = member.data(data).ok()?;
33+
if let Some(obj) = Object::parse(member_data) {
34+
return Context::new(stash, obj, None, None);
3635
}
3736
}
3837
None
@@ -64,16 +63,20 @@ pub fn parse_xcoff(data: &[u8]) -> Option<Image> {
6463
let _ = header.aux_header(data, &mut offset).ok()?;
6564
let sections = header.sections(data, &mut offset).ok()?;
6665
if let Some(section) = sections.iter().find(|s| {
67-
let name = str::from_utf8(&s.s_name()[0..5]).unwrap();
68-
return name == ".text";
66+
if let Ok(name) = str::from_utf8(&s.s_name()[0..5]) {
67+
name == ".text"
68+
} else {
69+
false
70+
}
6971
}) {
70-
return Some(Image {
72+
Some(Image {
7173
offset: section.s_scnptr() as usize,
7274
base: section.s_paddr() as u64,
7375
size: section.s_size() as usize,
74-
});
76+
})
77+
} else {
78+
None
7579
}
76-
return None;
7780
}
7881

7982
pub fn parse_image(path: &Path, member_name: &OsString) -> Option<Image> {
@@ -83,18 +86,17 @@ pub fn parse_image(path: &Path, member_name: &OsString) -> Option<Image> {
8386
return parse_xcoff(data);
8487
} else {
8588
let archive = ArchiveFile::parse(data).ok()?;
86-
for member in archive.members() {
87-
if let Ok(member) = member {
88-
let name = OsStr::from_bytes(member.name());
89-
if name == member_name {
90-
let member_data = member.data(data).ok()?;
91-
if let Some(image) = parse_xcoff(member_data) {
92-
return Some(image);
93-
}
94-
}
89+
for member in archive
90+
.members()
91+
.filter_map(|m| m.ok())
92+
.filter(|m| OsStr::from_bytes(m.name()) == member_name)
93+
{
94+
let member_data = member.data(data).ok()?;
95+
if let Some(image) = parse_xcoff(member_data) {
96+
return Some(image);
9597
}
9698
}
97-
return None;
99+
None
98100
}
99101
}
100102

@@ -108,7 +110,7 @@ impl<'a> Object<'a> {
108110
containing_csect: Some(index),
109111
} => {
110112
if let Ok(tgt_sym) = file.symbol_by_index(index) {
111-
return Self::get_concrete_size(file, &tgt_sym);
113+
Self::get_concrete_size(file, &tgt_sym)
112114
} else {
113115
0
114116
}
@@ -141,7 +143,7 @@ impl<'a> Object<'a> {
141143
})
142144
.collect::<Vec<_>>();
143145
syms.sort_by_key(|s| s.address);
144-
return Some(Object { syms, file });
146+
Some(Object { syms, file })
145147
}
146148

147149
pub fn section(&self, _: &Stash, name: &str) -> Option<&'a [u8]> {

tests/smoke.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ fn get_actual_fn_pointer(fp: usize) -> usize {
1111
// entry point in text section.
1212
//
1313
// For TOC, one can find more information in
14-
// https://www.ibm.com/docs/en/aix/7.2?topic=program-understanding-programming-toc.
14+
// https://www.ibm.com/docs/en/aix/7.2?topic=program-understanding-programming-toc
1515
if cfg!(target_os = "aix") {
1616
unsafe {
1717
let actual_fn_entry = *(fp as *const usize);

0 commit comments

Comments
 (0)