@@ -9,7 +9,7 @@ use std::process::{Command, Stdio};
99
1010use object:: read:: archive:: { ArchiveFile , ArchiveMember } ;
1111use object:: {
12- File as ObjFile , Object , ObjectSymbol , Symbol , SymbolKind , SymbolScope , SymbolSection ,
12+ File as ObjFile , Object , ObjectSection , ObjectSymbol , Symbol , SymbolKind , SymbolScope ,
1313} ;
1414use serde_json:: Value ;
1515
@@ -154,7 +154,7 @@ struct SymInfo {
154154 name : String ,
155155 kind : SymbolKind ,
156156 scope : SymbolScope ,
157- section : SymbolSection ,
157+ section : String ,
158158 is_undefined : bool ,
159159 is_global : bool ,
160160 is_local : bool ,
@@ -165,12 +165,22 @@ struct SymInfo {
165165}
166166
167167impl SymInfo {
168- fn new ( sym : & Symbol , member : & ArchiveMember ) -> Self {
168+ fn new ( sym : & Symbol , obj : & ObjFile , member : & ArchiveMember ) -> Self {
169+ // Include the section name if possible. Fall back to the `Section` debug impl if not.
170+ let section = sym. section ( ) ;
171+ let section_name = sym
172+ . section ( )
173+ . index ( )
174+ . and_then ( |idx| obj. section_by_index ( idx) . ok ( ) )
175+ . and_then ( |sec| sec. name ( ) . ok ( ) )
176+ . map ( ToString :: to_string)
177+ . unwrap_or_else ( || format ! ( "{section:?}" ) ) ;
178+
169179 Self {
170180 name : sym. name ( ) . expect ( "missing name" ) . to_owned ( ) ,
171181 kind : sym. kind ( ) ,
172182 scope : sym. scope ( ) ,
173- section : sym . section ( ) ,
183+ section : section_name ,
174184 is_undefined : sym. is_undefined ( ) ,
175185 is_global : sym. is_global ( ) ,
176186 is_local : sym. is_local ( ) ,
@@ -192,13 +202,13 @@ fn verify_no_duplicates(archive: &Archive) {
192202 let mut dups = Vec :: new ( ) ;
193203 let mut found_any = false ;
194204
195- archive. for_each_symbol ( |symbol, member| {
205+ archive. for_each_symbol ( |symbol, obj , member| {
196206 // Only check defined globals
197207 if !symbol. is_global ( ) || symbol. is_undefined ( ) {
198208 return ;
199209 }
200210
201- let sym = SymInfo :: new ( & symbol, member) ;
211+ let sym = SymInfo :: new ( & symbol, obj , member) ;
202212
203213 // x86-32 includes multiple copies of thunk symbols
204214 if sym. name . starts_with ( "__x86.get_pc_thunk" ) {
@@ -244,15 +254,15 @@ fn verify_core_symbols(archive: &Archive) {
244254 let mut undefined = Vec :: new ( ) ;
245255 let mut has_symbols = false ;
246256
247- archive. for_each_symbol ( |symbol, member| {
257+ archive. for_each_symbol ( |symbol, obj , member| {
248258 has_symbols = true ;
249259
250260 // Find only symbols from `core`
251261 if !symbol. name ( ) . unwrap ( ) . contains ( "_ZN4core" ) {
252262 return ;
253263 }
254264
255- let sym = SymInfo :: new ( & symbol, member) ;
265+ let sym = SymInfo :: new ( & symbol, obj , member) ;
256266 if sym. is_undefined {
257267 undefined. push ( sym) ;
258268 } else {
@@ -304,9 +314,9 @@ impl Archive {
304314 }
305315
306316 /// For a given archive, do something with each symbol.
307- fn for_each_symbol ( & self , mut f : impl FnMut ( Symbol , & ArchiveMember ) ) {
317+ fn for_each_symbol ( & self , mut f : impl FnMut ( Symbol , & ObjFile , & ArchiveMember ) ) {
308318 self . for_each_object ( |obj, member| {
309- obj. symbols ( ) . for_each ( |sym| f ( sym, member) ) ;
319+ obj. symbols ( ) . for_each ( |sym| f ( sym, & obj , member) ) ;
310320 } ) ;
311321 }
312322}
0 commit comments