Alexander Shaposhnikov 0db3a5a93e [llvm-objcopy][MachO] Handle relocation entries where r_extern is zero
Fix handling of relocations with r_extern == 0.
If r_extern == 0 then r_symbolnum is an index of a section rather than a symbol index.

Patch by Seiya Nuta and Alexander Shaposhnikov.

Test plan: make check-all

Differential revision: https://reviews.llvm.org/D78946
2020-04-27 17:59:07 -07:00

96 lines
3.0 KiB
Plaintext

# RUN: yaml2obj %s -o %t
## Show that llvm-objcopy copies relocation entries where r_extern = 0.
# RUN: llvm-objcopy %t %t2
# RUN: cmp %t %t2
## Show that llvm-objcopy updates section indices properly.
# RUN: llvm-objcopy --remove-section=__DATA,__foo %t %t3
# RUN: llvm-objdump --macho --reloc %t3 | FileCheck %s
# CHECK: Relocation information (__DATA,__bar) 2 entries
# CHECK-NEXT: address pcrel length extern type scattered symbolnum/value
# CHECK-NEXT: 00000000 False quad False SUB False 2 (__DATA,__bar)
# CHECK-NEXT: 00000000 False quad False UNSIGND False 1 (__TEXT,__text)
--- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x01000007
cpusubtype: 0x00000003
filetype: 0x00000001
ncmds: 1
sizeofcmds: 312
flags: 0x00000000
reserved: 0x00000000
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 312
segname: ''
vmaddr: 0
vmsize: 24
fileoff: 344
filesize: 24
maxprot: 7
initprot: 7
nsects: 3
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x0000000000000000
size: 8
offset: 0x00000158
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x80000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
content: '0000000000000000'
- sectname: __foo
segname: __DATA
addr: 0x0000000000000008
size: 8
offset: 0x00000160
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
content: '0000000000000000'
- sectname: __bar
segname: __DATA
addr: 0x0000000000000010
size: 8
offset: 0x00000168
align: 0
reloff: 0x00000170
nreloc: 2
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
content: F0FFFFFFFFFFFFFF
relocations:
- address: 0x00000000
symbolnum: 3
pcrel: false
length: 3
extern: false
type: 5
scattered: false
value: 0
- address: 0x00000000
symbolnum: 1
pcrel: false
length: 3
extern: false
type: 0
scattered: false
value: 0
...