@@ -4,12 +4,11 @@ use super::mystd::str;
4
4
use super :: { Context , Mapping , Path , Stash , Vec } ;
5
5
use core:: ops:: Deref ;
6
6
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 } ;
10
8
use object:: Object as _;
11
9
use object:: ObjectSection as _;
12
10
use object:: ObjectSymbol as _;
11
+ use object:: SymbolFlags ;
13
12
14
13
#[ cfg( target_pointer_width = "32" ) ]
15
14
type Xcoff = object:: xcoff:: FileHeader32 ;
@@ -99,14 +98,32 @@ pub fn parse_image(path: &Path, member_name: &OsString) -> Option<Image> {
99
98
}
100
99
101
100
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
+
102
119
fn parse ( data : & ' a [ u8 ] ) -> Option < Object < ' a > > {
103
120
let file = XcoffFile :: parse ( data) . ok ( ) ?;
104
121
let mut syms = file
105
122
. symbols ( )
106
123
. filter_map ( |sym| {
107
- let address = sym. address ( ) ;
108
- let size = sym. size ( ) ;
109
124
let name = sym. name ( ) . map_or ( "" , |v| v) ;
125
+ let address = sym. address ( ) ;
126
+ let size = Self :: get_concret_size ( & file, & sym) ;
110
127
if name == ".text" || name == ".data" {
111
128
None
112
129
} else {
0 commit comments