@@ -992,7 +992,11 @@ fn resolve_link_order(obj: &ObjInfo) -> Result<Vec<ObjUnit>> {
992992
993993/// Split an object into multiple relocatable objects.
994994#[ instrument( level = "debug" , skip( obj) ) ]
995- pub fn split_obj ( obj : & ObjInfo , module_name : Option < & str > ) -> Result < Vec < ObjInfo > > {
995+ pub fn split_obj (
996+ obj : & ObjInfo ,
997+ module_name : Option < & str > ,
998+ globalize_symbols : bool ,
999+ ) -> Result < Vec < ObjInfo > > {
9961000 let mut objects: Vec < ObjInfo > = vec ! [ ] ;
9971001 let mut object_symbols: Vec < Vec < Option < SymbolIndex > > > = vec ! [ ] ;
9981002 let mut name_to_obj: HashMap < String , usize > = HashMap :: new ( ) ;
@@ -1215,7 +1219,7 @@ pub fn split_obj(obj: &ObjInfo, module_name: Option<&str>) -> Result<Vec<ObjInfo
12151219 }
12161220
12171221 // Update relocations
1218- let mut globalize_symbols = vec ! [ ] ;
1222+ let mut symbols_to_globalize = vec ! [ ] ;
12191223 for ( obj_idx, out_obj) in objects. iter_mut ( ) . enumerate ( ) {
12201224 let symbol_idxs = & mut object_symbols[ obj_idx] ;
12211225 for ( _section_index, section) in out_obj. sections . iter_mut ( ) {
@@ -1231,7 +1235,7 @@ pub fn split_obj(obj: &ObjInfo, module_name: Option<&str>) -> Result<Vec<ObjInfo
12311235
12321236 // If the symbol is local, we'll upgrade the scope to global
12331237 // and rename it to avoid conflicts
1234- if target_sym. flags . is_local ( ) {
1238+ if globalize_symbols && target_sym. flags . is_local ( ) {
12351239 let address_str = if obj. module_id == 0 {
12361240 format ! ( "{:08X}" , target_sym. address)
12371241 } else if let Some ( section_index) = target_sym. section {
@@ -1250,7 +1254,7 @@ pub fn split_obj(obj: &ObjInfo, module_name: Option<&str>) -> Result<Vec<ObjInfo
12501254 } else {
12511255 format ! ( "{}_{}" , target_sym. name, address_str)
12521256 } ;
1253- globalize_symbols . push ( ( reloc. target_symbol , new_name) ) ;
1257+ symbols_to_globalize . push ( ( reloc. target_symbol , new_name) ) ;
12541258 }
12551259
12561260 symbol_idxs[ reloc. target_symbol as usize ] = Some ( out_sym_idx) ;
@@ -1295,16 +1299,18 @@ pub fn split_obj(obj: &ObjInfo, module_name: Option<&str>) -> Result<Vec<ObjInfo
12951299 }
12961300
12971301 // Upgrade local symbols to global if necessary
1298- for ( obj, symbol_map) in objects. iter_mut ( ) . zip ( & object_symbols) {
1299- for ( globalize_idx, new_name) in & globalize_symbols {
1300- if let Some ( symbol_idx) = symbol_map[ * globalize_idx as usize ] {
1301- let mut symbol = obj. symbols [ symbol_idx] . clone ( ) ;
1302- symbol. name . clone_from ( new_name) ;
1303- if symbol. flags . is_local ( ) {
1304- log:: debug!( "Globalizing {} in {}" , symbol. name, obj. name) ;
1305- symbol. flags . set_scope ( ObjSymbolScope :: Global ) ;
1302+ if globalize_symbols {
1303+ for ( obj, symbol_map) in objects. iter_mut ( ) . zip ( & object_symbols) {
1304+ for ( globalize_idx, new_name) in & symbols_to_globalize {
1305+ if let Some ( symbol_idx) = symbol_map[ * globalize_idx as usize ] {
1306+ let mut symbol = obj. symbols [ symbol_idx] . clone ( ) ;
1307+ symbol. name . clone_from ( new_name) ;
1308+ if symbol. flags . is_local ( ) {
1309+ log:: debug!( "Globalizing {} in {}" , symbol. name, obj. name) ;
1310+ symbol. flags . set_scope ( ObjSymbolScope :: Global ) ;
1311+ }
1312+ obj. symbols . replace ( symbol_idx, symbol) ?;
13061313 }
1307- obj. symbols . replace ( symbol_idx, symbol) ?;
13081314 }
13091315 }
13101316 }
0 commit comments