@@ -17,6 +17,7 @@ import (
17
17
"errors"
18
18
"fmt"
19
19
"io"
20
+ "strconv"
20
21
"strings"
21
22
)
22
23
@@ -348,102 +349,65 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Read
348
349
return nil , fmt .Errorf ("relocation number %d symbol index idx=%d cannot be large then number of symbols %d" , j , r .SymbolTableIndex , len (f .COFFSymbols ))
349
350
}
350
351
pesym := & f .COFFSymbols [r .SymbolTableIndex ]
351
- _ , gosym , err := state .readpesym (pesym )
352
+ _ , rSym , err := state .readpesym (pesym )
352
353
if err != nil {
353
354
return nil , err
354
355
}
355
- if gosym == 0 {
356
+ if rSym == 0 {
356
357
name , err := pesym .FullName (f .StringTable )
357
358
if err != nil {
358
359
name = string (pesym .Name [:])
359
360
}
360
361
return nil , fmt .Errorf ("reloc of invalid sym %s idx=%d type=%d" , name , r .SymbolTableIndex , pesym .Type )
361
362
}
362
363
363
- rSym := gosym
364
364
rSize := uint8 (4 )
365
365
rOff := int32 (r .VirtualAddress )
366
- var rAdd int64
367
366
var rType objabi.RelocType
368
367
switch arch .Family {
369
368
default :
370
369
return nil , fmt .Errorf ("%s: unsupported arch %v" , pn , arch .Family )
371
- case sys .I386 , sys . AMD64 :
370
+ case sys .I386 :
372
371
switch r .Type {
373
- default :
374
- return nil , fmt .Errorf ("%s: %v: unknown relocation type %v" , pn , state .sectsyms [rsect ], r .Type )
375
-
376
- case IMAGE_REL_I386_REL32 , IMAGE_REL_AMD64_REL32 ,
377
- IMAGE_REL_AMD64_ADDR32 , // R_X86_64_PC32
378
- IMAGE_REL_AMD64_ADDR32NB :
379
- if r .Type == IMAGE_REL_AMD64_ADDR32NB {
380
- rType = objabi .R_PEIMAGEOFF
381
- } else {
382
- rType = objabi .R_PCREL
383
- }
384
-
385
- rAdd = int64 (int32 (binary .LittleEndian .Uint32 (state .sectdata [rsect ][rOff :])))
386
-
387
- case IMAGE_REL_I386_DIR32NB , IMAGE_REL_I386_DIR32 :
388
- if r .Type == IMAGE_REL_I386_DIR32NB {
389
- rType = objabi .R_PEIMAGEOFF
390
- } else {
391
- rType = objabi .R_ADDR
392
- }
393
-
394
- // load addend from image
395
- rAdd = int64 (int32 (binary .LittleEndian .Uint32 (state .sectdata [rsect ][rOff :])))
396
-
397
- case IMAGE_REL_AMD64_ADDR64 : // R_X86_64_64
398
- rSize = 8
399
-
372
+ case IMAGE_REL_I386_REL32 :
373
+ rType = objabi .R_PCREL
374
+ case IMAGE_REL_I386_DIR32 :
400
375
rType = objabi .R_ADDR
401
-
402
- // load addend from image
403
- rAdd = int64 (binary .LittleEndian .Uint64 (state .sectdata [rsect ][rOff :]))
376
+ case IMAGE_REL_I386_DIR32NB :
377
+ rType = objabi .R_PEIMAGEOFF
404
378
}
405
-
406
- case sys .ARM :
379
+ case sys .AMD64 :
407
380
switch r .Type {
408
- default :
409
- return nil , fmt .Errorf ("%s: %v: unknown ARM relocation type %v" , pn , state .sectsyms [rsect ], r .Type )
410
-
411
- case IMAGE_REL_ARM_SECREL :
381
+ case IMAGE_REL_AMD64_REL32 :
412
382
rType = objabi .R_PCREL
413
-
414
- rAdd = int64 (int32 (binary .LittleEndian .Uint32 (state .sectdata [rsect ][rOff :])))
415
-
416
- case IMAGE_REL_ARM_ADDR32 , IMAGE_REL_ARM_ADDR32NB :
417
- if r .Type == IMAGE_REL_ARM_ADDR32NB {
418
- rType = objabi .R_PEIMAGEOFF
419
- } else {
420
- rType = objabi .R_ADDR
421
- }
422
-
423
- rAdd = int64 (int32 (binary .LittleEndian .Uint32 (state .sectdata [rsect ][rOff :])))
424
-
425
- case IMAGE_REL_ARM_BRANCH24 :
426
- rType = objabi .R_CALLARM
427
-
428
- rAdd = int64 (int32 (binary .LittleEndian .Uint32 (state .sectdata [rsect ][rOff :])))
383
+ case IMAGE_REL_AMD64_ADDR32 :
384
+ rType = objabi .R_ADDR
385
+ case IMAGE_REL_AMD64_ADDR64 :
386
+ rType = objabi .R_ADDR
387
+ rSize = 8
388
+ case IMAGE_REL_AMD64_ADDR32NB :
389
+ rType = objabi .R_PEIMAGEOFF
429
390
}
430
-
431
391
case sys .ARM64 :
432
392
switch r .Type {
433
- default :
434
- return nil , fmt .Errorf ("%s: %v: unknown ARM64 relocation type %v" , pn , state .sectsyms [rsect ], r .Type )
435
-
436
- case IMAGE_REL_ARM64_ADDR32 , IMAGE_REL_ARM64_ADDR32NB :
437
- if r .Type == IMAGE_REL_ARM64_ADDR32NB {
438
- rType = objabi .R_PEIMAGEOFF
439
- } else {
440
- rType = objabi .R_ADDR
441
- }
442
-
443
- rAdd = int64 (int32 (binary .LittleEndian .Uint32 (state .sectdata [rsect ][rOff :])))
393
+ case IMAGE_REL_ARM64_ADDR32 :
394
+ rType = objabi .R_ADDR
395
+ case IMAGE_REL_ARM64_ADDR32NB :
396
+ rType = objabi .R_PEIMAGEOFF
444
397
}
445
398
}
446
-
399
+ if rType == 0 {
400
+ return nil , fmt .Errorf ("%s: %v: unknown relocation type %v" , pn , state .sectsyms [rsect ], r .Type )
401
+ }
402
+ var rAdd int64
403
+ switch rSize {
404
+ default :
405
+ panic ("unexpected relocation size " + strconv .Itoa (int (rSize )))
406
+ case 4 :
407
+ rAdd = int64 (int32 (binary .LittleEndian .Uint32 (state .sectdata [rsect ][rOff :])))
408
+ case 8 :
409
+ rAdd = int64 (binary .LittleEndian .Uint64 (state .sectdata [rsect ][rOff :]))
410
+ }
447
411
// ld -r could generate multiple section symbols for the
448
412
// same section but with different values, we have to take
449
413
// that into account, or in the case of split resources,
0 commit comments