[llvm-lipo] Implement -replace

Replaces specified architecture in universal binary input file with
slice from the file_name argument passed into the replace command.

Differential Revision: https://reviews.llvm.org/D65247

llvm-svn: 367248
This commit is contained in:
Anusha Basana 2019-07-29 18:46:34 +00:00
parent fce596160a
commit c94e951180
7 changed files with 1683 additions and 1 deletions

View File

@ -0,0 +1,934 @@
--- !mach-o
FileHeader:
magic: 0xFEEDFACE
cputype: 0x0000000C
cpusubtype: 0x00000009
filetype: 0x00000002
ncmds: 27
sizeofcmds: 2176
flags: 0x00200085
LoadCommands:
- cmd: LC_SEGMENT
cmdsize: 56
segname: __PAGEZERO
vmaddr: 0
vmsize: 16384
fileoff: 0
filesize: 0
maxprot: 0
initprot: 0
nsects: 0
flags: 0
- cmd: LC_SEGMENT
cmdsize: 260
segname: __TEXT
vmaddr: 16384
vmsize: 32768
fileoff: 0
filesize: 32768
maxprot: 5
initprot: 5
nsects: 3
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x000000000000BBA0
size: 804
offset: 0x00007BA0
align: 2
reloff: 0x00000000
nreloc: 0
flags: 0x80000400
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __picsymbolstub4
segname: __TEXT
addr: 0x000000000000BEC4
size: 160
offset: 0x00007EC4
align: 2
reloff: 0x00000000
nreloc: 0
flags: 0x80000408
reserved1: 0x00000000
reserved2: 0x00000010
reserved3: 0x00000000
- sectname: __stub_helper
segname: __TEXT
addr: 0x000000000000BF64
size: 156
offset: 0x00007F64
align: 2
reloff: 0x00000000
nreloc: 0
flags: 0x80000400
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- cmd: LC_SEGMENT
cmdsize: 600
segname: __DATA
vmaddr: 49152
vmsize: 16384
fileoff: 32768
filesize: 16384
maxprot: 3
initprot: 3
nsects: 8
flags: 0
Sections:
- sectname: __nl_symbol_ptr
segname: __DATA
addr: 0x000000000000C000
size: 12
offset: 0x00008000
align: 2
reloff: 0x00000000
nreloc: 0
flags: 0x00000006
reserved1: 0x0000000A
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __la_symbol_ptr
segname: __DATA
addr: 0x000000000000C00C
size: 40
offset: 0x0000800C
align: 2
reloff: 0x00000000
nreloc: 0
flags: 0x00000007
reserved1: 0x0000000D
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __mod_init_func
segname: __DATA
addr: 0x000000000000C034
size: 4
offset: 0x00008034
align: 2
reloff: 0x00000000
nreloc: 0
flags: 0x00000009
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __const
segname: __DATA
addr: 0x000000000000C038
size: 36
offset: 0x00008038
align: 2
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __cfstring
segname: __DATA
addr: 0x000000000000C05C
size: 160
offset: 0x0000805C
align: 2
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __objc_imageinfo
segname: __DATA
addr: 0x000000000000C0FC
size: 8
offset: 0x000080FC
align: 2
reloff: 0x00000000
nreloc: 0
flags: 0x00000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __objc_selrefs
segname: __DATA
addr: 0x000000000000C104
size: 44
offset: 0x00008104
align: 2
reloff: 0x00000000
nreloc: 0
flags: 0x10000005
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __objc_classrefs
segname: __DATA
addr: 0x000000000000C130
size: 20
offset: 0x00008130
align: 2
reloff: 0x00000000
nreloc: 0
flags: 0x10000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- cmd: LC_SEGMENT
cmdsize: 192
segname: __RODATA
vmaddr: 65536
vmsize: 16384
fileoff: 49152
filesize: 16384
maxprot: 1
initprot: 1
nsects: 2
flags: 0
Sections:
- sectname: __cstring
segname: __RODATA
addr: 0x0000000000010000
size: 191
offset: 0x0000C000
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000002
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __objc_methname
segname: __RODATA
addr: 0x00000000000100BF
size: 243
offset: 0x0000C0BF
align: 0
reloff: 0x00000000
nreloc: 0
flags: 0x00000002
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- cmd: LC_SEGMENT
cmdsize: 56
segname: __LINKEDIT
vmaddr: 81920
vmsize: 32768
fileoff: 65536
filesize: 22592
maxprot: 1
initprot: 1
nsects: 0
flags: 0
- cmd: LC_DYLD_INFO_ONLY
cmdsize: 48
rebase_off: 65536
rebase_size: 16
bind_off: 65552
bind_size: 316
weak_bind_off: 0
weak_bind_size: 0
lazy_bind_off: 65868
lazy_bind_size: 260
export_off: 66128
export_size: 60
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 66220
nsyms: 29
stroff: 66660
strsize: 708
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 7
iextdefsym: 7
nextdefsym: 3
iundefsym: 10
nundefsym: 19
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 66568
nindirectsyms: 23
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
- cmd: LC_LOAD_DYLINKER
cmdsize: 28
name: 12
PayloadString: '/usr/lib/dyld'
ZeroPadBytes: 3
- cmd: LC_UUID
cmdsize: 24
uuid: D36E4B66-CF78-37EC-B274-9DDADEECE4C1
- cmd: LC_VERSION_MIN_IPHONEOS
cmdsize: 16
version: 589824
sdk: 786944
- cmd: LC_SOURCE_VERSION
cmdsize: 16
version: 0
- cmd: LC_MAIN
cmdsize: 24
entryoff: 31913
stacksize: 0
- cmd: LC_ENCRYPTION_INFO
cmdsize: 20
cryptoff: 16384
cryptsize: 16384
cryptid: 0
- cmd: LC_LOAD_DYLIB
cmdsize: 48
dylib:
name: 24
timestamp: 2
current_version: 26216708
compatibility_version: 65536
PayloadString: '/usr/lib/libc++.1.dylib'
ZeroPadBytes: 1
- cmd: LC_LOAD_DYLIB
cmdsize: 68
dylib:
name: 24
timestamp: 2
current_version: 0
compatibility_version: 0
PayloadString: '@rpath/MobileConfig.framework/MobileConfig'
ZeroPadBytes: 2
- cmd: LC_LOAD_DYLIB
cmdsize: 84
dylib:
name: 24
timestamp: 2
current_version: 102895360
compatibility_version: 19660800
PayloadString: '/System/Library/Frameworks/Foundation.framework/Foundation'
ZeroPadBytes: 2
- cmd: LC_LOAD_DYLIB
cmdsize: 76
dylib:
name: 24
timestamp: 2
current_version: 917504
compatibility_version: 65536
PayloadString: '/System/Library/Frameworks/MapKit.framework/MapKit'
ZeroPadBytes: 2
- cmd: LC_LOAD_DYLIB
cmdsize: 84
dylib:
name: 24
timestamp: 2
current_version: 68352
compatibility_version: 66048
PayloadString: '/System/Library/Frameworks/QuartzCore.framework/QuartzCore'
ZeroPadBytes: 2
- cmd: LC_LOAD_DYLIB
cmdsize: 76
dylib:
name: 24
timestamp: 2
current_version: 3997696000
compatibility_version: 65536
PayloadString: '/System/Library/Frameworks/UIKit.framework/UIKit'
ZeroPadBytes: 4
- cmd: LC_LOAD_DYLIB
cmdsize: 52
dylib:
name: 24
timestamp: 2
current_version: 14942208
compatibility_version: 65536
PayloadString: '/usr/lib/libobjc.A.dylib'
ZeroPadBytes: 4
- cmd: LC_LOAD_DYLIB
cmdsize: 52
dylib:
name: 24
timestamp: 2
current_version: 82115073
compatibility_version: 65536
PayloadString: '/usr/lib/libSystem.B.dylib'
ZeroPadBytes: 2
- cmd: LC_LOAD_DYLIB
cmdsize: 92
dylib:
name: 24
timestamp: 2
current_version: 102895360
compatibility_version: 9830400
PayloadString: '/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation'
ZeroPadBytes: 2
- cmd: LC_RPATH
cmdsize: 28
path: 12
PayloadString: '/usr/lib/swift'
ZeroPadBytes: 2
- cmd: LC_RPATH
cmdsize: 40
path: 12
PayloadString: '@executable_path/Frameworks'
ZeroPadBytes: 1
- cmd: LC_DATA_IN_CODE
cmdsize: 16
dataoff: 66188
datasize: 32
- cmd: LC_CODE_SIGNATURE
cmdsize: 16
dataoff: 67376
datasize: 20752
LinkEditData:
RebaseOpcodes:
- Opcode: REBASE_OPCODE_SET_TYPE_IMM
Imm: 1
- Opcode: REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
Imm: 2
ExtraData:
- 0x000000000000000C
- Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
Imm: 11
- Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
Imm: 2
- Opcode: REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB
Imm: 0
ExtraData:
- 0x0000000000000010
- Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
Imm: 2
- Opcode: REBASE_OPCODE_ADD_ADDR_IMM_SCALED
Imm: 2
- Opcode: REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB
Imm: 0
ExtraData:
- 0x000000000000000A
- 0x000000000000000C
- Opcode: REBASE_OPCODE_DO_REBASE_IMM_TIMES
Imm: 11
- Opcode: REBASE_OPCODE_DONE
Imm: 0
BindOpcodes:
- Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
Imm: 3
Symbol: ''
- Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
Imm: 0
Symbol: '_OBJC_CLASS_$_NSBundle'
- Opcode: BIND_OPCODE_SET_TYPE_IMM
Imm: 1
Symbol: ''
- Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
Imm: 2
ULEBExtraData:
- 0x0000000000000140
Symbol: ''
- Opcode: BIND_OPCODE_DO_BIND
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
Imm: 0
Symbol: '_OBJC_CLASS_$_NSJSONSerialization'
- Opcode: BIND_OPCODE_ADD_ADDR_ULEB
Imm: 0
ULEBExtraData:
- 0xFFFFFFFFFFFFFFF0
Symbol: ''
- Opcode: BIND_OPCODE_DO_BIND
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
Imm: 7
Symbol: ''
- Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
Imm: 0
Symbol: _objc_release
- Opcode: BIND_OPCODE_ADD_ADDR_ULEB
Imm: 0
ULEBExtraData:
- 0xFFFFFFFFFFFFFED0
Symbol: ''
- Opcode: BIND_OPCODE_DO_BIND
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
Imm: 8
Symbol: ''
- Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
Imm: 0
Symbol: __NSConcreteGlobalBlock
- Opcode: BIND_OPCODE_ADD_ADDR_ULEB
Imm: 0
ULEBExtraData:
- 0x000000000000003C
Symbol: ''
- Opcode: BIND_OPCODE_DO_BIND
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
Imm: 0
Symbol: dyld_stub_binder
- Opcode: BIND_OPCODE_ADD_ADDR_ULEB
Imm: 0
ULEBExtraData:
- 0xFFFFFFFFFFFFFFB4
Symbol: ''
- Opcode: BIND_OPCODE_DO_BIND
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
Imm: 9
Symbol: ''
- Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
Imm: 0
Symbol: '_OBJC_CLASS_$_NSData'
- Opcode: BIND_OPCODE_ADD_ADDR_ULEB
Imm: 0
ULEBExtraData:
- 0x000000000000012C
Symbol: ''
- Opcode: BIND_OPCODE_DO_BIND
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
Imm: 0
Symbol: '_OBJC_CLASS_$_NSMutableArray'
- Opcode: BIND_OPCODE_ADD_ADDR_ULEB
Imm: 0
ULEBExtraData:
- 0x0000000000000008
Symbol: ''
- Opcode: BIND_OPCODE_DO_BIND
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
Imm: 0
Symbol: '_OBJC_CLASS_$_NSUserDefaults'
- Opcode: BIND_OPCODE_ADD_ADDR_ULEB
Imm: 0
ULEBExtraData:
- 0xFFFFFFFFFFFFFFF8
Symbol: ''
- Opcode: BIND_OPCODE_DO_BIND
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
Imm: 0
Symbol: ___CFConstantStringClassReference
- Opcode: BIND_OPCODE_ADD_ADDR_ULEB
Imm: 0
ULEBExtraData:
- 0xFFFFFFFFFFFFFF20
Symbol: ''
- Opcode: BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB
Imm: 0
ULEBExtraData:
- 0x0000000000000009
- 0x000000000000000C
Symbol: ''
- Opcode: BIND_OPCODE_DO_BIND
Imm: 0
Symbol: ''
LazyBindOpcodes:
- Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
Imm: 2
ULEBExtraData:
- 0x000000000000000C
Symbol: ''
- Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
Imm: 3
Symbol: ''
- Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
Imm: 0
Symbol: _NSClassFromString
- Opcode: BIND_OPCODE_DO_BIND
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_DONE
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
Imm: 2
ULEBExtraData:
- 0x0000000000000010
Symbol: ''
- Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
Imm: 6
Symbol: ''
- Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
Imm: 0
Symbol: _UIApplicationMain
- Opcode: BIND_OPCODE_DO_BIND
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_DONE
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
Imm: 2
ULEBExtraData:
- 0x0000000000000014
Symbol: ''
- Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
Imm: 7
Symbol: ''
- Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
Imm: 0
Symbol: _objc_autoreleasePoolPop
- Opcode: BIND_OPCODE_DO_BIND
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_DONE
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
Imm: 2
ULEBExtraData:
- 0x0000000000000018
Symbol: ''
- Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
Imm: 7
Symbol: ''
- Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
Imm: 0
Symbol: _objc_autoreleasePoolPush
- Opcode: BIND_OPCODE_DO_BIND
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_DONE
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
Imm: 2
ULEBExtraData:
- 0x000000000000001C
Symbol: ''
- Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
Imm: 7
Symbol: ''
- Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
Imm: 0
Symbol: _objc_autoreleaseReturnValue
- Opcode: BIND_OPCODE_DO_BIND
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_DONE
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
Imm: 2
ULEBExtraData:
- 0x0000000000000020
Symbol: ''
- Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
Imm: 7
Symbol: ''
- Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
Imm: 0
Symbol: _objc_msgSend
- Opcode: BIND_OPCODE_DO_BIND
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_DONE
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
Imm: 2
ULEBExtraData:
- 0x0000000000000024
Symbol: ''
- Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
Imm: 7
Symbol: ''
- Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
Imm: 0
Symbol: _objc_release
- Opcode: BIND_OPCODE_DO_BIND
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_DONE
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
Imm: 2
ULEBExtraData:
- 0x0000000000000028
Symbol: ''
- Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
Imm: 7
Symbol: ''
- Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
Imm: 0
Symbol: _objc_retainAutoreleasedReturnValue
- Opcode: BIND_OPCODE_DO_BIND
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_DONE
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
Imm: 2
ULEBExtraData:
- 0x000000000000002C
Symbol: ''
- Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
Imm: 8
Symbol: ''
- Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
Imm: 0
Symbol: _strcmp
- Opcode: BIND_OPCODE_DO_BIND
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_DONE
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
Imm: 2
ULEBExtraData:
- 0x0000000000000030
Symbol: ''
- Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
Imm: 8
Symbol: ''
- Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
Imm: 0
Symbol: _strlen
- Opcode: BIND_OPCODE_DO_BIND
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_DONE
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_DONE
Imm: 0
Symbol: ''
- Opcode: BIND_OPCODE_DONE
Imm: 0
Symbol: ''
ExportTrie:
TerminalSize: 0
NodeOffset: 0
Name: ''
Flags: 0x0000000000000000
Address: 0x0000000000000000
Other: 0x0000000000000000
ImportName: ''
Children:
- TerminalSize: 0
NodeOffset: 5
Name: _
Flags: 0x0000000000000000
Address: 0x0000000000000000
Other: 0x0000000000000000
ImportName: ''
Children:
- TerminalSize: 2
NodeOffset: 41
Name: _mh_execute_header
Flags: 0x0000000000000000
Address: 0x0000000000000000
Other: 0x0000000000000000
ImportName: ''
- TerminalSize: 4
NodeOffset: 45
Name: main
Flags: 0x0000000000000000
Address: 0x0000000000007CA9
Other: 0x0000000000000000
ImportName: ''
- TerminalSize: 4
NodeOffset: 51
Name: MNMain
Flags: 0x0000000000000000
Address: 0x0000000000007E45
Other: 0x0000000000000000
ImportName: ''
NameList:
- n_strx: 461
n_type: 0x0E
n_sect: 1
n_desc: 8
n_value: 48032
- n_strx: 487
n_type: 0x0E
n_sect: 1
n_desc: 8
n_value: 48776
- n_strx: 540
n_type: 0x1E
n_sect: 1
n_desc: 8
n_value: 48812
- n_strx: 559
n_type: 0x1E
n_sect: 1
n_desc: 8
n_value: 48824
- n_strx: 593
n_type: 0x1E
n_sect: 3
n_desc: 0
n_value: 48996
- n_strx: 607
n_type: 0x0E
n_sect: 7
n_desc: 0
n_value: 49208
- n_strx: 656
n_type: 0x0E
n_sect: 7
n_desc: 0
n_value: 49224
- n_strx: 4
n_type: 0x0F
n_sect: 1
n_desc: 8
n_value: 48708
- n_strx: 12
n_type: 0x0F
n_sect: 1
n_desc: 16
n_value: 16384
- n_strx: 32
n_type: 0x0F
n_sect: 1
n_desc: 8
n_value: 48296
- n_strx: 38
n_type: 0x01
n_sect: 0
n_desc: 768
n_value: 0
- n_strx: 57
n_type: 0x01
n_sect: 0
n_desc: 768
n_value: 0
- n_strx: 80
n_type: 0x01
n_sect: 0
n_desc: 2304
n_value: 0
- n_strx: 101
n_type: 0x01
n_sect: 0
n_desc: 768
n_value: 0
- n_strx: 135
n_type: 0x01
n_sect: 0
n_desc: 2304
n_value: 0
- n_strx: 164
n_type: 0x01
n_sect: 0
n_desc: 2304
n_value: 0
- n_strx: 193
n_type: 0x01
n_sect: 0
n_desc: 1536
n_value: 0
- n_strx: 212
n_type: 0x01
n_sect: 0
n_desc: 2048
n_value: 0
- n_strx: 236
n_type: 0x01
n_sect: 0
n_desc: 2304
n_value: 0
- n_strx: 270
n_type: 0x01
n_sect: 0
n_desc: 2048
n_value: 0
- n_strx: 284
n_type: 0x01
n_sect: 0
n_desc: 1792
n_value: 0
- n_strx: 309
n_type: 0x01
n_sect: 0
n_desc: 1792
n_value: 0
- n_strx: 335
n_type: 0x01
n_sect: 0
n_desc: 1792
n_value: 0
- n_strx: 364
n_type: 0x01
n_sect: 0
n_desc: 1792
n_value: 0
- n_strx: 378
n_type: 0x01
n_sect: 0
n_desc: 1792
n_value: 0
- n_strx: 392
n_type: 0x01
n_sect: 0
n_desc: 1792
n_value: 0
- n_strx: 428
n_type: 0x01
n_sect: 0
n_desc: 2048
n_value: 0
- n_strx: 436
n_type: 0x01
n_sect: 0
n_desc: 2048
n_value: 0
- n_strx: 444
n_type: 0x01
n_sect: 0
n_desc: 2048
n_value: 0
StringTable:
- ''
- ''
- ''
- ''
- _MNMain
- __mh_execute_header
- _main
- _NSClassFromString
- '_OBJC_CLASS_$_NSBundle'
- '_OBJC_CLASS_$_NSData'
- '_OBJC_CLASS_$_NSJSONSerialization'
- '_OBJC_CLASS_$_NSMutableArray'
- '_OBJC_CLASS_$_NSUserDefaults'
- _UIApplicationMain
- __NSConcreteGlobalBlock
- ___CFConstantStringClassReference
- ___truncdfhf2
- _objc_autoreleasePoolPop
- _objc_autoreleasePoolPush
- _objc_autoreleaseReturnValue
- _objc_msgSend
- _objc_release
- _objc_retainAutoreleasedReturnValue
- _strcmp
- _strlen
- dyld_stub_binder
- _FBParseCommandLineParams
- ___MNMain_block_invoke_7636.llvm.6232502296855065941
- '_objc_release$shim'
- '_objc_autoreleaseReturnValue$shim'
- ' stub helpers'
- ___block_descriptor_tmp.llvm.6232502296855065941
- ___block_literal_global.llvm.6232502296855065941
- ''
- ''
- ''
...

View File

@ -0,0 +1,191 @@
--- !fat-mach-o
FatHeader:
magic: 0xCAFEBABE
nfat_arch: 2
FatArchs:
- cputype: 0x0000000C
cpusubtype: 0x00000009
offset: 0x0000000000000030
size: 432
align: 4
- cputype: 0x00000007
cpusubtype: 0x00000003
offset: 0x0000000000001000
size: 432
align: 12
Slices:
- !mach-o
FileHeader:
magic: 0xFEEDFACE
cputype: 0x0000000C
cpusubtype: 0x00000009
filetype: 0x00000001
ncmds: 4
sizeofcmds: 312
flags: 0x00002000
LoadCommands:
- cmd: LC_SEGMENT
cmdsize: 192
segname: ''
vmaddr: 0
vmsize: 72
fileoff: 340
filesize: 72
maxprot: 7
initprot: 7
nsects: 2
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x0000000000000000
size: 18
offset: 0x00000154
align: 4
reloff: 0x00000000
nreloc: 0
flags: 0x80000400
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __eh_frame
segname: __TEXT
addr: 0x0000000000000014
size: 52
offset: 0x00000168
align: 2
reloff: 0x00000000
nreloc: 0
flags: 0x6800000B
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- cmd: LC_VERSION_MIN_MACOSX
cmdsize: 16
version: 656384
sdk: 0
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 412
nsyms: 1
stroff: 424
strsize: 8
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 0
iextdefsym: 0
nextdefsym: 1
iundefsym: 1
nundefsym: 0
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 0
nindirectsyms: 0
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
LinkEditData:
NameList:
- n_strx: 1
n_type: 0x0F
n_sect: 1
n_desc: 0
n_value: 0
StringTable:
- ''
- _main
- ''
- !mach-o
FileHeader:
magic: 0xFEEDFACE
cputype: 0x00000007
cpusubtype: 0x00000003
filetype: 0x00000001
ncmds: 4
sizeofcmds: 312
flags: 0x00002000
LoadCommands:
- cmd: LC_SEGMENT
cmdsize: 192
segname: ''
vmaddr: 0
vmsize: 72
fileoff: 340
filesize: 72
maxprot: 7
initprot: 7
nsects: 2
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x0000000000000000
size: 18
offset: 0x00000154
align: 4
reloff: 0x00000000
nreloc: 0
flags: 0x80000400
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __eh_frame
segname: __TEXT
addr: 0x0000000000000014
size: 52
offset: 0x00000168
align: 2
reloff: 0x00000000
nreloc: 0
flags: 0x6800000B
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- cmd: LC_VERSION_MIN_MACOSX
cmdsize: 16
version: 656384
sdk: 0
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 412
nsyms: 1
stroff: 424
strsize: 8
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 0
iextdefsym: 0
nextdefsym: 1
iundefsym: 1
nundefsym: 0
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 0
nindirectsyms: 0
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
LinkEditData:
NameList:
- n_strx: 1
n_type: 0x0F
n_sect: 1
n_desc: 0
n_value: 0
StringTable:
- ''
- _main
- ''
...

View File

@ -0,0 +1,377 @@
--- !fat-mach-o
FatHeader:
magic: 0xCAFEBABE
nfat_arch: 4
FatArchs:
- cputype: 0x00000007
cpusubtype: 0x00000003
offset: 0x0000000000001000
size: 432
align: 12
- cputype: 0x01000007
cpusubtype: 0x00000003
offset: 0x0000000000002000
size: 488
align: 12
- cputype: 0x0000000C
cpusubtype: 0x00000009
offset: 0x0000000000004000
size: 304
align: 14
- cputype: 0x0100000C
cpusubtype: 0x00000000
offset: 0x0000000000008000
size: 516
align: 14
Slices:
- !mach-o
FileHeader:
magic: 0xFEEDFACE
cputype: 0x00000007
cpusubtype: 0x00000003
filetype: 0x00000001
ncmds: 4
sizeofcmds: 312
flags: 0x00002000
LoadCommands:
- cmd: LC_SEGMENT
cmdsize: 192
segname: ''
vmaddr: 0
vmsize: 72
fileoff: 340
filesize: 72
maxprot: 7
initprot: 7
nsects: 2
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x0000000000000000
size: 18
offset: 0x00000154
align: 4
reloff: 0x00000000
nreloc: 0
flags: 0x80000400
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __eh_frame
segname: __TEXT
addr: 0x0000000000000014
size: 52
offset: 0x00000168
align: 2
reloff: 0x00000000
nreloc: 0
flags: 0x6800000B
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- cmd: LC_VERSION_MIN_MACOSX
cmdsize: 16
version: 656384
sdk: 0
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 412
nsyms: 1
stroff: 424
strsize: 8
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 0
iextdefsym: 0
nextdefsym: 1
iundefsym: 1
nundefsym: 0
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 0
nindirectsyms: 0
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
LinkEditData:
NameList:
- n_strx: 1
n_type: 0x0F
n_sect: 1
n_desc: 0
n_value: 0
StringTable:
- ''
- _main
- ''
- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x01000007
cpusubtype: 0x00000003
filetype: 0x00000001
ncmds: 4
sizeofcmds: 352
flags: 0x00002000
reserved: 0x00000000
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 232
segname: ''
vmaddr: 0
vmsize: 80
fileoff: 384
filesize: 80
maxprot: 7
initprot: 7
nsects: 2
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x0000000000000000
size: 15
offset: 0x00000180
align: 4
reloff: 0x00000000
nreloc: 0
flags: 0x80000400
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __eh_frame
segname: __TEXT
addr: 0x0000000000000010
size: 64
offset: 0x00000190
align: 3
reloff: 0x00000000
nreloc: 0
flags: 0x6800000B
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- cmd: LC_VERSION_MIN_MACOSX
cmdsize: 16
version: 656384
sdk: 0
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 464
nsyms: 1
stroff: 480
strsize: 8
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 0
iextdefsym: 0
nextdefsym: 1
iundefsym: 1
nundefsym: 0
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 0
nindirectsyms: 0
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
LinkEditData:
NameList:
- n_strx: 1
n_type: 0x0F
n_sect: 1
n_desc: 0
n_value: 0
StringTable:
- ''
- _main
- ''
- !mach-o
FileHeader:
magic: 0xFEEDFACE
cputype: 0x0000000C
cpusubtype: 0x00000009
filetype: 0x00000001
ncmds: 4
sizeofcmds: 244
flags: 0x00002000
LoadCommands:
- cmd: LC_SEGMENT
cmdsize: 124
segname: ''
vmaddr: 0
vmsize: 10
fileoff: 272
filesize: 10
maxprot: 7
initprot: 7
nsects: 1
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x0000000000000000
size: 10
offset: 0x00000110
align: 1
reloff: 0x00000000
nreloc: 0
flags: 0x80000400
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- cmd: LC_VERSION_MIN_IPHONEOS
cmdsize: 16
version: 327680
sdk: 0
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 284
nsyms: 1
stroff: 296
strsize: 8
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 0
iextdefsym: 0
nextdefsym: 1
iundefsym: 1
nundefsym: 0
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 0
nindirectsyms: 0
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
LinkEditData:
NameList:
- n_strx: 1
n_type: 0x0F
n_sect: 1
n_desc: 8
n_value: 0
StringTable:
- ''
- _main
- ''
- !mach-o
FileHeader:
magic: 0xFEEDFACF
cputype: 0x0100000C
cpusubtype: 0x00000000
filetype: 0x00000001
ncmds: 4
sizeofcmds: 352
flags: 0x00002000
reserved: 0x00000000
LoadCommands:
- cmd: LC_SEGMENT_64
cmdsize: 232
segname: ''
vmaddr: 0
vmsize: 56
fileoff: 384
filesize: 56
maxprot: 7
initprot: 7
nsects: 2
flags: 0
Sections:
- sectname: __text
segname: __TEXT
addr: 0x0000000000000000
size: 20
offset: 0x00000180
align: 2
reloff: 0x00000000
nreloc: 0
flags: 0x80000400
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- sectname: __compact_unwind
segname: __LD
addr: 0x0000000000000018
size: 32
offset: 0x00000198
align: 3
reloff: 0x000001B8
nreloc: 1
flags: 0x02000000
reserved1: 0x00000000
reserved2: 0x00000000
reserved3: 0x00000000
- cmd: LC_VERSION_MIN_IPHONEOS
cmdsize: 16
version: 327680
sdk: 0
- cmd: LC_SYMTAB
cmdsize: 24
symoff: 448
nsyms: 3
stroff: 496
strsize: 20
- cmd: LC_DYSYMTAB
cmdsize: 80
ilocalsym: 0
nlocalsym: 2
iextdefsym: 2
nextdefsym: 1
iundefsym: 3
nundefsym: 0
tocoff: 0
ntoc: 0
modtaboff: 0
nmodtab: 0
extrefsymoff: 0
nextrefsyms: 0
indirectsymoff: 0
nindirectsyms: 0
extreloff: 0
nextrel: 0
locreloff: 0
nlocrel: 0
LinkEditData:
NameList:
- n_strx: 13
n_type: 0x0E
n_sect: 1
n_desc: 0
n_value: 0
- n_strx: 7
n_type: 0x0E
n_sect: 2
n_desc: 0
n_value: 24
- n_strx: 1
n_type: 0x0F
n_sect: 1
n_desc: 0
n_value: 0
StringTable:
- ''
- _main
- ltmp1
- ltmp0
- ''
...

View File

@ -0,0 +1,30 @@
# RUN: yaml2obj %p/Inputs/i386-slice.yaml > %t-32.o
# RUN: yaml2obj %p/Inputs/arm64-slice.yaml > %t-arm64.o
# RUN: yaml2obj %p/Inputs/i386-x86_64-universal.yaml > %t-universal.o
# RUN: not llvm-lipo %t-universal.o -replace %t-32.o 2>&1 | FileCheck --check-prefix=MISSING_ARG %s
# MISSING_ARG: error: replace is missing an argument: expects -replace arch_type file_name
# RUN: not llvm-lipo %t-universal.o -replace %t-32.o i386 2>&1 | FileCheck --check-prefix=OUTPUT_FILE %s
# OUTPUT_FILE: error: replace expects a single output file to be specified
# RUN: not llvm-lipo %t-universal.o %t-universal.o -replace %t-32.o i386 -o %t.o 2>&1 | FileCheck --check-prefix=INPUT_ARGS %s
# INPUT_ARGS: error: replace expects a single input file
# RUN: not llvm-lipo %t-universal.o -replace %t-32.o i386 -o %t.o 2>&1 | FileCheck --check-prefix=INVALID_FILE %s
# INVALID_FILE: error: 'i386': No such file or directory
# RUN: not llvm-lipo %t-universal.o -replace i3866 %t-32.o -o %t.o 2>&1 | FileCheck --check-prefix=INVALID_ARCH %s
# INVALID_ARCH: error: Invalid architecture: i3866
# RUN: not llvm-lipo %t-universal.o -replace arm64 %t-32.o -o %t.o 2>&1 | FileCheck --check-prefix=ARCH_NOT_MATCHED %s
# ARCH_NOT_MATCHED: error: specified architecture: arm64 for replacement file: {{.*}} does not match the file's architecture
# RUN: not llvm-lipo %t-universal.o -replace arm64 %t-arm64.o -o %t.o 2>&1 | FileCheck --check-prefix=ARCH_NOT_IN_INPUT %s
# ARCH_NOT_IN_INPUT: error: -replace arm64 <file_name> specified but fat file: {{.*}} does not contain that architecture
# RUN: not llvm-lipo %t-universal.o -replace i386 %t-32.o -replace arm64 %t-universal.o -o %t.o 2>&1 | FileCheck --check-prefix=REPLACE_UNIVERSAL %s
# REPLACE_UNIVERSAL: replacement file: {{.*}} is a fat file (must be a thin file)
# RUN: not llvm-lipo %t-universal.o -replace i386 %t-32.o -replace i386 %t-32.o -o %t.o 2>&1 | FileCheck --check-prefix=ARCH_DUPLICATE %s
# ARCH_DUPLICATE: error: -replace i386 <file_name> specified multiple times:

View File

@ -0,0 +1,35 @@
# RUN: yaml2obj %p/Inputs/armv7-slice-big.yaml > %t-armv7big.o
# RUN: yaml2obj %p/Inputs/i386-x86_64-armv7-arm64-universal.yaml > %t-universal.o
# RUN: llvm-lipo %t-universal.o -replace armv7 %t-armv7big.o -o %t.o
# RUN: llvm-objdump %t.o -m --universal-headers | FileCheck --check-prefix=ARMV7_BIG %s
# RUN: llvm-lipo %t.o -thin armv7 -o %t-armv7-out.o
# RUN: cmp %t-armv7big.o %t-armv7-out.o
# ARMV7_BIG: architecture i386
# ARMV7_BIG: offset 4096
# ARMV7_BIG: align 2^12 (4096)
# ARMV7_BIG-NEXT: architecture x86_64
# ARMV7_BIG: offset 8192
# ARMV7_BIG: align 2^12 (4096)
# ARMV7_BIG-NEXT: architecture armv7
# ARMV7_BIG: offset 16384
# ARMV7_BIG: size 88128
# ARMV7_BIG: align 2^14 (16384)
# ARMV7_BIG-NEXT: architecture arm64
# ARMV7_BIG: offset 114688
# ARMV7_BIG: size 516
# ARMV7_BIG: align 2^14 (16384)
# RUN: yaml2obj %p/Inputs/armv7-slice.yaml > %t-armv7.o
# RUN: yaml2obj %p/Inputs/armv7_i386_non_default_alignment.yaml > %t-universal-align.o
# RUN: llvm-lipo %t-universal-align.o -replace armv7 %t-armv7.o -o %t2.o
# RUN: llvm-objdump %t2.o -m --universal-headers | FileCheck --check-prefix=ARMV7_ALIGN_SWAP %s
# RUN: llvm-lipo %t2.o -thin armv7 -o %t-armv7-out2.o
# RUN: cmp %t-armv7.o %t-armv7-out2.o
# ARMV7_ALIGN_SWAP: architecture i386
# ARMV7_ALIGN_SWAP: offset 4096
# ARMV7_ALIGN_SWAP: align 2^12 (4096)
# ARMV7_ALIGN_SWAP-NEXT: architecture armv7
# ARMV7_ALIGN_SWAP: offset 16384
# ARMV7_ALIGN_SWAP: align 2^14 (16384)

View File

@ -34,6 +34,12 @@ def create : Option<["-", "--"], "create", KIND_FLAG>,
HelpText<"Create a universal binary output file from the input "
"files. Requires -output option">;
def replace
: MultiArg<["-", "--"], "replace", 2>,
Group<action_group>,
HelpText<"Replace the specified arch type with the contents of the "
"input_file in a universal binary. Requires -output option">;
def output : Option<["-", "--"], "output", KIND_SEPARATE>,
HelpText<"Create output file with specified name">;
def o : JoinedOrSeparate<["-"], "o">, Alias<output>;

View File

@ -82,11 +82,18 @@ enum class LipoAction {
VerifyArch,
ThinArch,
CreateUniversal,
ReplaceArch,
};
struct Replacement {
StringRef ArchType;
StringRef FileName;
};
struct Config {
SmallVector<std::string, 1> InputFiles;
SmallVector<std::string, 1> VerifyArchList;
SmallVector<Replacement, 1> Replacements;
std::string ThinArchType;
std::string OutputFile;
LipoAction ActionToPerform;
@ -158,7 +165,14 @@ static Config parseLipoOptions(ArrayRef<const char *> ArgsArr) {
SmallVector<opt::Arg *, 1> ActionArgs(InputArgs.filtered(LIPO_action_group));
if (ActionArgs.empty())
reportError("at least one action should be specified");
if (ActionArgs.size() > 1) {
// errors if multiple actions specified other than replace
// multiple replace flags may be specified, as long as they are not mixed with
// other action flags
auto ReplacementArgsRange = InputArgs.filtered(LIPO_replace);
if (ActionArgs.size() > 1 &&
ActionArgs.size() !=
static_cast<size_t>(std::distance(ReplacementArgsRange.begin(),
ReplacementArgsRange.end()))) {
std::string Buf;
raw_string_ostream OS(Buf);
OS << "only one of the following actions can be specified:";
@ -206,6 +220,23 @@ static Config parseLipoOptions(ArrayRef<const char *> ArgsArr) {
C.ActionToPerform = LipoAction::CreateUniversal;
return C;
case LIPO_replace:
for (auto Action : ActionArgs) {
if (!Action->getValue(1))
reportError(
"replace is missing an argument: expects -replace arch_type "
"file_name");
C.Replacements.push_back(
Replacement{Action->getValue(0), Action->getValue(1)});
}
if (C.OutputFile.empty())
reportError("replace expects a single output file to be specified");
if (C.InputFiles.size() > 1)
reportError("replace expects a single input file");
C.ActionToPerform = LipoAction::ReplaceArch;
return C;
default:
reportError("llvm-lipo action unspecified");
}
@ -557,6 +588,81 @@ static void createUniversalBinary(ArrayRef<OwningBinary<Binary>> InputBinaries,
exit(EXIT_SUCCESS);
}
static StringMap<Slice>
buildReplacementSlices(ArrayRef<OwningBinary<Binary>> ReplacementBinaries,
ArrayRef<Replacement> Replacements) {
assert(ReplacementBinaries.size() == Replacements.size() &&
"Number of replacment binaries does not match the number of "
"replacements");
StringMap<Slice> Slices;
// populates StringMap of slices to replace with; error checks for mismatched
// replace flag args, fat files, and duplicate arch_types
for (size_t Index = 0, Size = Replacements.size(); Index < Size; ++Index) {
StringRef ReplacementArch = Replacements[Index].ArchType;
const Binary *ReplacementBinary = ReplacementBinaries[Index].getBinary();
validateArchitectureName(ReplacementArch);
auto O = dyn_cast<MachOObjectFile>(ReplacementBinary);
if (!O)
reportError("replacement file: " + ReplacementBinary->getFileName() +
" is a fat file (must be a thin file)");
if (O->getArch() != Triple(ReplacementArch).getArch())
reportError("specified architecture: " + ReplacementArch +
" for replacement file: " + ReplacementBinary->getFileName() +
" does not match the file's architecture");
auto Entry =
Slices.try_emplace(ReplacementArch, Slice{O, calculateAlignment(O)});
if (!Entry.second)
reportError("-replace " + ReplacementArch +
" <file_name> specified multiple times: " +
Entry.first->second.ObjectFile->getFileName() + ", " +
O->getFileName());
}
return Slices;
}
LLVM_ATTRIBUTE_NORETURN
static void replaceSlices(ArrayRef<OwningBinary<Binary>> InputBinaries,
StringRef OutputFileName,
ArrayRef<Replacement> Replacements) {
assert(InputBinaries.size() == 1 && "Incorrect number of input binaries");
assert(!OutputFileName.empty() && "Replace expects a single output file");
if (InputBinaries.front().getBinary()->isMachO())
reportError("input file " +
InputBinaries.front().getBinary()->getFileName() +
" must be a fat file when the -replace option is specified");
SmallVector<std::string, 1> ReplacementFiles;
for (const auto &R : Replacements)
ReplacementFiles.push_back(R.FileName);
SmallVector<OwningBinary<Binary>, 1> ReplacementBinaries =
readInputBinaries(ReplacementFiles);
StringMap<Slice> ReplacementSlices =
buildReplacementSlices(ReplacementBinaries, Replacements);
SmallVector<std::unique_ptr<MachOObjectFile>, 2> ExtractedObjects;
SmallVector<Slice, 2> Slices = buildSlices(InputBinaries, ExtractedObjects);
for (auto &Slice : Slices) {
auto It = ReplacementSlices.find(getArchString(*Slice.ObjectFile));
if (It != ReplacementSlices.end()) {
Slice = It->second;
ReplacementSlices.erase(It); // only keep remaining replacing arch_types
}
}
if (!ReplacementSlices.empty())
reportError("-replace " + ReplacementSlices.begin()->first() +
" <file_name> specified but fat file: " +
InputBinaries.front().getBinary()->getFileName() +
" does not contain that architecture");
createUniversalBinary(Slices, OutputFileName);
exit(EXIT_SUCCESS);
}
int main(int argc, char **argv) {
InitLLVM X(argc, argv);
Config C = parseLipoOptions(makeArrayRef(argv + 1, argc));
@ -579,6 +685,9 @@ int main(int argc, char **argv) {
case LipoAction::CreateUniversal:
createUniversalBinary(InputBinaries, C.OutputFile);
break;
case LipoAction::ReplaceArch:
replaceSlices(InputBinaries, C.OutputFile, C.Replacements);
break;
}
return EXIT_SUCCESS;
}