1
1
use std:: io:: { Error , ErrorKind , Seek , Write } ;
2
2
3
3
use object:: pe:: * ;
4
- use object:: write:: { Object , Relocation , Symbol , SymbolId , SymbolSection } ;
4
+ use object:: write:: { Mangling , Object , Relocation , Symbol , SymbolId , SymbolSection } ;
5
5
use object:: {
6
6
BinaryFormat , Endianness , SectionFlags , SectionKind , SymbolFlags , SymbolKind , SymbolScope ,
7
7
} ;
@@ -179,9 +179,8 @@ impl<'a> ObjectFactory<'a> {
179
179
180
180
let import_name = self . import_name . replace ( '.' , "_" ) ;
181
181
182
- let head_sym_name = format ! ( "_head_{}" , import_name) ;
183
182
let head_sym = Symbol {
184
- name : head_sym_name . as_bytes ( ) . to_vec ( ) ,
183
+ name : format ! ( "_head_{}" , import_name ) . into_bytes ( ) ,
185
184
value : 0 ,
186
185
size : 0 ,
187
186
kind : SymbolKind :: Data ,
@@ -190,7 +189,8 @@ impl<'a> ObjectFactory<'a> {
190
189
section : SymbolSection :: Section ( id2) ,
191
190
flags : SymbolFlags :: None ,
192
191
} ;
193
- obj. add_symbol ( head_sym) ;
192
+ let head_sym_id = obj. add_symbol ( head_sym) ;
193
+ let head_sym_name = obj. symbol ( head_sym_id) . name . clone ( ) ;
194
194
195
195
let iname_sym = Symbol {
196
196
name : format ! ( "{}_iname" , import_name) . into_bytes ( ) ,
@@ -212,7 +212,7 @@ impl<'a> ObjectFactory<'a> {
212
212
data : obj
213
213
. write ( )
214
214
. map_err ( |e| Error :: new ( ErrorKind :: Other , e. to_string ( ) ) ) ?,
215
- symbols : vec ! [ head_sym_name] ,
215
+ symbols : vec ! [ String :: from_utf8 ( head_sym_name) . unwrap ( ) ] ,
216
216
} )
217
217
}
218
218
@@ -271,9 +271,8 @@ impl<'a> ObjectFactory<'a> {
271
271
obj. add_file_symbol ( b"fake" . to_vec ( ) ) ;
272
272
273
273
let import_name = self . import_name . replace ( '.' , "_" ) ;
274
- let iname_sym_name = format ! ( "{}_iname" , import_name) ;
275
274
let iname_sym = Symbol {
276
- name : iname_sym_name . as_bytes ( ) . to_vec ( ) ,
275
+ name : format ! ( "{}_iname" , import_name ) . into_bytes ( ) ,
277
276
value : 0 ,
278
277
size : 0 ,
279
278
kind : SymbolKind :: Data ,
@@ -282,7 +281,8 @@ impl<'a> ObjectFactory<'a> {
282
281
section : SymbolSection :: Section ( id7) ,
283
282
flags : SymbolFlags :: None ,
284
283
} ;
285
- obj. add_symbol ( iname_sym) ;
284
+ let iname_sym_id = obj. add_symbol ( iname_sym) ;
285
+ let iname_sym_name = obj. symbol ( iname_sym_id) . name . clone ( ) ;
286
286
287
287
obj. append_section_data ( id4, & [ 0 ; 8 ] , 4 ) ;
288
288
obj. append_section_data ( id5, & [ 0 ; 8 ] , 4 ) ;
@@ -296,7 +296,7 @@ impl<'a> ObjectFactory<'a> {
296
296
data : obj
297
297
. write ( )
298
298
. map_err ( |e| Error :: new ( ErrorKind :: Other , e. to_string ( ) ) ) ?,
299
- symbols : vec ! [ iname_sym_name] ,
299
+ symbols : vec ! [ String :: from_utf8 ( iname_sym_name) . unwrap ( ) ] ,
300
300
} )
301
301
}
302
302
@@ -368,6 +368,9 @@ impl<'a> ObjectFactory<'a> {
368
368
} ;
369
369
let head_sym = obj. add_symbol ( head_sym) ;
370
370
371
+ // All subsequent symbols should be added unmangled.
372
+ obj. mangling = Mangling :: None ;
373
+
371
374
let mut archive_symbols = Vec :: new ( ) ;
372
375
if !export. data {
373
376
let exp_sym = Symbol {
@@ -455,12 +458,17 @@ impl<'a> ObjectFactory<'a> {
455
458
obj. append_section_data ( id4, & id4_data, 4 ) ;
456
459
457
460
if !export. no_name {
458
- let len = 2 + export. name . len ( ) + 1 ;
461
+ // Remove i386 mangling added by the def parser.
462
+ let export_name = match self . machine {
463
+ MachineType :: I386 => export. name . strip_prefix ( "_" ) . unwrap ( ) ,
464
+ _ => & export. name ,
465
+ } ;
466
+ let len = 2 + export_name. len ( ) + 1 ;
459
467
let mut id6_data = vec ! [ 0 ; len] ;
460
468
let ord = export. ordinal ;
461
469
id6_data[ 0 ] = ord as u8 ;
462
470
id6_data[ 1 ] = ( ord >> 8 ) as u8 ;
463
- id6_data[ 2 ..len - 1 ] . copy_from_slice ( export . name . as_bytes ( ) ) ;
471
+ id6_data[ 2 ..len - 1 ] . copy_from_slice ( export_name . as_bytes ( ) ) ;
464
472
obj. append_section_data ( id6, & id6_data, 2 ) ;
465
473
}
466
474
0 commit comments