[llvm] r369234 - Revert r369230 and r369231
Seiya Nuta via llvm-commits
llvm-commits at lists.llvm.org
Sun Aug 18 23:45:48 PDT 2019
Author: seiya
Date: Sun Aug 18 23:45:48 2019
New Revision: 369234
URL: http://llvm.org/viewvc/llvm-project?rev=369234&view=rev
Log:
Revert r369230 and r369231
Looks these commits break CI builds:
- http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-gn/builds/4159
This commit reverts r369230 and r369231 (git coommit: 4a198a7 and dee9546).
Removed:
llvm/trunk/test/tools/llvm-objcopy/MachO/basic-executable-copy.test
llvm/trunk/tools/llvm-objcopy/MachO/MachOLayoutBuilder.cpp
llvm/trunk/tools/llvm-objcopy/MachO/MachOLayoutBuilder.h
Modified:
llvm/trunk/tools/llvm-objcopy/CMakeLists.txt
llvm/trunk/tools/llvm-objcopy/MachO/MachOObjcopy.cpp
llvm/trunk/tools/llvm-objcopy/MachO/MachOReader.cpp
llvm/trunk/tools/llvm-objcopy/MachO/MachOReader.h
llvm/trunk/tools/llvm-objcopy/MachO/MachOWriter.cpp
llvm/trunk/tools/llvm-objcopy/MachO/MachOWriter.h
llvm/trunk/tools/llvm-objcopy/MachO/Object.h
Removed: llvm/trunk/test/tools/llvm-objcopy/MachO/basic-executable-copy.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/MachO/basic-executable-copy.test?rev=369233&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/MachO/basic-executable-copy.test (original)
+++ llvm/trunk/test/tools/llvm-objcopy/MachO/basic-executable-copy.test (removed)
@@ -1,291 +0,0 @@
-## This test verifies that llvm-objcopy copies an executable properly. It
-## uses llvm-readobj instead of cmp because some parts of the object
-## (e.g., the string table) are not identical; the output file is correct but
-## some offsets differ from the input file.
-# RUN: yaml2obj %s > %t
-# RUN: llvm-objcopy %t %t2
-# RUN: llvm-readobj --file-headers --sections %t2 | FileCheck %s
-
---- !mach-o
-FileHeader:
- magic: 0xFEEDFACF
- cputype: 0x01000007
- cpusubtype: 0x80000003
- filetype: 0x00000002
- ncmds: 15
- sizeofcmds: 976
- flags: 0x00200085
- reserved: 0x00000000
-LoadCommands:
- - cmd: LC_SEGMENT_64
- cmdsize: 72
- segname: __PAGEZERO
- vmaddr: 0
- vmsize: 4294967296
- fileoff: 0
- filesize: 0
- maxprot: 0
- initprot: 0
- nsects: 0
- flags: 0
- - cmd: LC_SEGMENT_64
- cmdsize: 232
- segname: __TEXT
- vmaddr: 4294967296
- vmsize: 4096
- fileoff: 0
- filesize: 4096
- maxprot: 7
- initprot: 5
- nsects: 2
- flags: 0
- Sections:
- - sectname: __text
- segname: __TEXT
- addr: 0x0000000100000F70
- size: 58
- offset: 0x00000F70
- align: 4
- reloff: 0x00000000
- nreloc: 0
- flags: 0x80000400
- reserved1: 0x00000000
- reserved2: 0x00000000
- reserved3: 0x00000000
- - sectname: __unwind_info
- segname: __TEXT
- addr: 0x0000000100000FAC
- size: 72
- offset: 0x00000FAC
- align: 2
- reloff: 0x00000000
- nreloc: 0
- flags: 0x00000000
- reserved1: 0x00000000
- reserved2: 0x00000000
- reserved3: 0x00000000
- - cmd: LC_SEGMENT_64
- cmdsize: 232
- segname: __DATA
- vmaddr: 4294971392
- vmsize: 4096
- fileoff: 4096
- filesize: 4096
- maxprot: 7
- initprot: 3
- nsects: 2
- flags: 0
- Sections:
- - sectname: __data
- segname: __DATA
- addr: 0x0000000100001000
- size: 4
- offset: 0x00001000
- align: 2
- reloff: 0x00000000
- nreloc: 0
- flags: 0x00000000
- reserved1: 0x00000000
- reserved2: 0x00000000
- reserved3: 0x00000000
- - sectname: __common
- segname: __DATA
- addr: 0x0000000100001004
- size: 4
- offset: 0x00000000
- align: 2
- reloff: 0x00000000
- nreloc: 0
- flags: 0x00000001
- reserved1: 0x00000000
- reserved2: 0x00000000
- reserved3: 0x00000000
- - cmd: LC_SEGMENT_64
- cmdsize: 72
- segname: __LINKEDIT
- vmaddr: 4294975488
- vmsize: 4096
- fileoff: 8192
- filesize: 232
- maxprot: 7
- initprot: 1
- nsects: 0
- flags: 0
- - cmd: LC_DYLD_INFO_ONLY
- cmdsize: 48
- rebase_off: 0
- rebase_size: 0
- bind_off: 0
- bind_size: 0
- weak_bind_off: 0
- weak_bind_size: 0
- lazy_bind_off: 0
- lazy_bind_size: 0
- export_off: 8192
- export_size: 72
- - cmd: LC_SYMTAB
- cmdsize: 24
- symoff: 8272
- nsyms: 6
- stroff: 8368
- strsize: 56
- - cmd: LC_DYSYMTAB
- cmdsize: 80
- ilocalsym: 0
- nlocalsym: 0
- iextdefsym: 0
- nextdefsym: 5
- iundefsym: 5
- nundefsym: 1
- tocoff: 0
- ntoc: 0
- modtaboff: 0
- nmodtab: 0
- extrefsymoff: 0
- nextrefsyms: 0
- indirectsymoff: 0
- nindirectsyms: 0
- extreloff: 0
- nextrel: 0
- locreloff: 0
- nlocrel: 0
- - cmd: LC_LOAD_DYLINKER
- cmdsize: 32
- name: 12
- PayloadString: '/usr/lib/dyld'
- ZeroPadBytes: 7
- - cmd: LC_UUID
- cmdsize: 24
- uuid: B6EE4FB7-4E1E-3C7A-80D3-CFBD89DBC0FE
- - cmd: LC_BUILD_VERSION
- cmdsize: 32
- platform: 1
- minos: 658944
- sdk: 658944
- ntools: 1
- Tools:
- - tool: 3
- version: 29491968
- - cmd: LC_SOURCE_VERSION
- cmdsize: 16
- version: 0
- - cmd: LC_MAIN
- cmdsize: 24
- entryoff: 3984
- stacksize: 0
- - cmd: LC_LOAD_DYLIB
- cmdsize: 56
- dylib:
- name: 24
- timestamp: 2
- current_version: 82115073
- compatibility_version: 65536
- PayloadString: '/usr/lib/libSystem.B.dylib'
- ZeroPadBytes: 6
- - cmd: LC_FUNCTION_STARTS
- cmdsize: 16
- dataoff: 8264
- datasize: 8
- - cmd: LC_DATA_IN_CODE
- cmdsize: 16
- dataoff: 8272
- datasize: 0
-LinkEditData:
- 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: 44
- Name: _mh_execute_header
- Flags: 0x0000000000000000
- Address: 0x0000000000000000
- Other: 0x0000000000000000
- ImportName: ''
- - TerminalSize: 3
- NodeOffset: 48
- Name: foo
- Flags: 0x0000000000000000
- Address: 0x0000000000000F70
- Other: 0x0000000000000000
- ImportName: ''
- - TerminalSize: 3
- NodeOffset: 53
- Name: main
- Flags: 0x0000000000000000
- Address: 0x0000000000000F90
- Other: 0x0000000000000000
- ImportName: ''
- - TerminalSize: 3
- NodeOffset: 58
- Name: b
- Flags: 0x0000000000000000
- Address: 0x0000000000001000
- Other: 0x0000000000000000
- ImportName: ''
- - TerminalSize: 3
- NodeOffset: 63
- Name: a
- Flags: 0x0000000000000000
- Address: 0x0000000000001004
- Other: 0x0000000000000000
- ImportName: ''
- NameList:
- - n_strx: 2
- n_type: 0x0F
- n_sect: 1
- n_desc: 16
- n_value: 4294967296
- - n_strx: 22
- n_type: 0x0F
- n_sect: 4
- n_desc: 0
- n_value: 4294971396
- - n_strx: 25
- n_type: 0x0F
- n_sect: 3
- n_desc: 0
- n_value: 4294971392
- - n_strx: 28
- n_type: 0x0F
- n_sect: 1
- n_desc: 0
- n_value: 4294971248
- - n_strx: 33
- n_type: 0x0F
- n_sect: 1
- n_desc: 0
- n_value: 4294971280
- - n_strx: 39
- n_type: 0x01
- n_sect: 0
- n_desc: 256
- n_value: 0
- StringTable:
- - ' '
- - __mh_execute_header
- - _a
- - _b
- - _foo
- - _main
- - dyld_stub_binder
-...
-
-# CHECK: FileType: Executable (0x2)
-# CHECK: Name: __text
-# CHECK: Name: __unwind_info
-# CHECK: Name: __data
-# CHECK: Name: __common
Modified: llvm/trunk/tools/llvm-objcopy/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/CMakeLists.txt?rev=369234&r1=369233&r2=369234&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/CMakeLists.txt (original)
+++ llvm/trunk/tools/llvm-objcopy/CMakeLists.txt Sun Aug 18 23:45:48 2019
@@ -26,7 +26,6 @@ add_llvm_tool(llvm-objcopy
MachO/MachOObjcopy.cpp
MachO/MachOReader.cpp
MachO/MachOWriter.cpp
- MachO/MachOLayoutBuilder.cpp
MachO/Object.cpp
DEPENDS
ObjcopyOptsTableGen
Removed: llvm/trunk/tools/llvm-objcopy/MachO/MachOLayoutBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/MachO/MachOLayoutBuilder.cpp?rev=369233&view=auto
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/MachO/MachOLayoutBuilder.cpp (original)
+++ llvm/trunk/tools/llvm-objcopy/MachO/MachOLayoutBuilder.cpp (removed)
@@ -1,348 +0,0 @@
-//===- MachOLayoutBuilder.cpp -----------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "MachOLayoutBuilder.h"
-#include "llvm/Support/Errc.h"
-#include "llvm/Support/ErrorHandling.h"
-
-namespace llvm {
-namespace objcopy {
-namespace macho {
-
-uint32_t MachOLayoutBuilder::computeSizeOfCmds() const {
- uint32_t Size = 0;
- for (const auto &LC : O.LoadCommands) {
- const MachO::macho_load_command &MLC = LC.MachOLoadCommand;
- auto cmd = MLC.load_command_data.cmd;
- switch (cmd) {
- case MachO::LC_SEGMENT:
- Size += sizeof(MachO::segment_command) +
- sizeof(MachO::section) * LC.Sections.size();
- continue;
- case MachO::LC_SEGMENT_64:
- Size += sizeof(MachO::segment_command_64) +
- sizeof(MachO::section_64) * LC.Sections.size();
- continue;
- }
-
- switch (cmd) {
-#define HANDLE_LOAD_COMMAND(LCName, LCValue, LCStruct) \
- case MachO::LCName: \
- Size += sizeof(MachO::LCStruct) + LC.Payload.size(); \
- break;
-#include "llvm/BinaryFormat/MachO.def"
-#undef HANDLE_LOAD_COMMAND
- }
- }
-
- return Size;
-}
-
-void MachOLayoutBuilder::constructStringTable() {
- for (std::unique_ptr<SymbolEntry> &Sym : O.SymTable.Symbols)
- StrTableBuilder.add(Sym->Name);
- StrTableBuilder.finalize();
-}
-
-void MachOLayoutBuilder::updateSymbolIndexes() {
- uint32_t Index = 0;
- for (auto &Symbol : O.SymTable.Symbols)
- Symbol->Index = Index++;
-}
-
-// Updates the index and the number of local/external/undefined symbols.
-void MachOLayoutBuilder::updateDySymTab(MachO::macho_load_command &MLC) {
- assert(MLC.load_command_data.cmd == MachO::LC_DYSYMTAB);
- // Make sure that nlist entries in the symbol table are sorted by the those
- // types. The order is: local < defined external < undefined external.
- assert(std::is_sorted(O.SymTable.Symbols.begin(), O.SymTable.Symbols.end(),
- [](const std::unique_ptr<SymbolEntry> &A,
- const std::unique_ptr<SymbolEntry> &B) {
- return (A->isLocalSymbol() && !B->isLocalSymbol()) ||
- (!A->isUndefinedSymbol() &&
- B->isUndefinedSymbol());
- }) &&
- "Symbols are not sorted by their types.");
-
- uint32_t NumLocalSymbols = 0;
- auto Iter = O.SymTable.Symbols.begin();
- auto End = O.SymTable.Symbols.end();
- for (; Iter != End; ++Iter) {
- if ((*Iter)->isExternalSymbol())
- break;
-
- ++NumLocalSymbols;
- }
-
- uint32_t NumExtDefSymbols = 0;
- for (; Iter != End; ++Iter) {
- if ((*Iter)->isUndefinedSymbol())
- break;
-
- ++NumExtDefSymbols;
- }
-
- MLC.dysymtab_command_data.ilocalsym = 0;
- MLC.dysymtab_command_data.nlocalsym = NumLocalSymbols;
- MLC.dysymtab_command_data.iextdefsym = NumLocalSymbols;
- MLC.dysymtab_command_data.nextdefsym = NumExtDefSymbols;
- MLC.dysymtab_command_data.iundefsym = NumLocalSymbols + NumExtDefSymbols;
- MLC.dysymtab_command_data.nundefsym =
- O.SymTable.Symbols.size() - (NumLocalSymbols + NumExtDefSymbols);
-}
-
-// Recomputes and updates offset and size fields in load commands and sections
-// since they could be modified.
-uint64_t MachOLayoutBuilder::layoutSegments() {
- auto HeaderSize =
- Is64Bit ? sizeof(MachO::mach_header_64) : sizeof(MachO::mach_header);
- const bool IsObjectFile =
- O.Header.FileType == MachO::HeaderFileType::MH_OBJECT;
- uint64_t Offset = IsObjectFile ? (HeaderSize + O.Header.SizeOfCmds) : 0;
- for (auto &LC : O.LoadCommands) {
- auto &MLC = LC.MachOLoadCommand;
- StringRef Segname;
- uint64_t SegmentVmAddr;
- uint64_t SegmentVmSize;
- switch (MLC.load_command_data.cmd) {
- case MachO::LC_SEGMENT:
- SegmentVmAddr = MLC.segment_command_data.vmaddr;
- SegmentVmSize = MLC.segment_command_data.vmsize;
- Segname = StringRef(MLC.segment_command_data.segname,
- strnlen(MLC.segment_command_data.segname,
- sizeof(MLC.segment_command_data.segname)));
- break;
- case MachO::LC_SEGMENT_64:
- SegmentVmAddr = MLC.segment_command_64_data.vmaddr;
- SegmentVmSize = MLC.segment_command_64_data.vmsize;
- Segname = StringRef(MLC.segment_command_64_data.segname,
- strnlen(MLC.segment_command_64_data.segname,
- sizeof(MLC.segment_command_64_data.segname)));
- break;
- default:
- continue;
- }
-
- if (Segname == "__LINKEDIT") {
- // We update the __LINKEDIT segment later (in layoutTail).
- assert(LC.Sections.empty() && "__LINKEDIT segment has sections");
- LinkEditLoadCommand = &MLC;
- continue;
- }
-
- // Update file offsets and sizes of sections.
- uint64_t SegOffset = Offset;
- uint64_t SegFileSize = 0;
- uint64_t VMSize = 0;
- for (auto &Sec : LC.Sections) {
- if (IsObjectFile) {
- if (Sec.isVirtualSection()) {
- Sec.Offset = 0;
- } else {
- uint64_t PaddingSize = OffsetToAlignment(SegFileSize, 1 << Sec.Align);
- Sec.Offset = SegOffset + SegFileSize + PaddingSize;
- Sec.Size = Sec.Content.size();
- SegFileSize += PaddingSize + Sec.Size;
- }
- VMSize = std::max(VMSize, Sec.Addr + Sec.Size);
- } else {
- if (Sec.isVirtualSection()) {
- Sec.Offset = 0;
- VMSize += Sec.Size;
- } else {
- uint32_t SectOffset = Sec.Addr - SegmentVmAddr;
- Sec.Offset = SegOffset + SectOffset;
- Sec.Size = Sec.Content.size();
- SegFileSize = std::max(SegFileSize, SectOffset + Sec.Size);
- VMSize = std::max(VMSize, SegFileSize);
- }
- }
- }
-
- if (IsObjectFile) {
- Offset += SegFileSize;
- } else {
- Offset = alignTo(Offset + SegFileSize, PageSize);
- SegFileSize = alignTo(SegFileSize, PageSize);
- // Use the original vmsize if the segment is __PAGEZERO.
- VMSize =
- Segname == "__PAGEZERO" ? SegmentVmSize : alignTo(VMSize, PageSize);
- }
-
- switch (MLC.load_command_data.cmd) {
- case MachO::LC_SEGMENT:
- MLC.segment_command_data.cmdsize =
- sizeof(MachO::segment_command) +
- sizeof(MachO::section) * LC.Sections.size();
- MLC.segment_command_data.nsects = LC.Sections.size();
- MLC.segment_command_data.fileoff = SegOffset;
- MLC.segment_command_data.vmsize = VMSize;
- MLC.segment_command_data.filesize = SegFileSize;
- break;
- case MachO::LC_SEGMENT_64:
- MLC.segment_command_64_data.cmdsize =
- sizeof(MachO::segment_command_64) +
- sizeof(MachO::section_64) * LC.Sections.size();
- MLC.segment_command_64_data.nsects = LC.Sections.size();
- MLC.segment_command_64_data.fileoff = SegOffset;
- MLC.segment_command_64_data.vmsize = VMSize;
- MLC.segment_command_64_data.filesize = SegFileSize;
- break;
- }
- }
-
- return Offset;
-}
-
-uint64_t MachOLayoutBuilder::layoutRelocations(uint64_t Offset) {
- for (auto &LC : O.LoadCommands)
- for (auto &Sec : LC.Sections) {
- Sec.RelOff = Sec.Relocations.empty() ? 0 : Offset;
- Sec.NReloc = Sec.Relocations.size();
- Offset += sizeof(MachO::any_relocation_info) * Sec.NReloc;
- }
-
- return Offset;
-}
-
-Error MachOLayoutBuilder::layoutTail(uint64_t Offset) {
- // The order of LINKEDIT elements is as follows:
- // rebase info, binding info, weak binding info, lazy binding info, export
- // trie, data-in-code, symbol table, indirect symbol table, symbol table
- // strings.
- uint64_t NListSize = Is64Bit ? sizeof(MachO::nlist_64) : sizeof(MachO::nlist);
- uint64_t StartOfLinkEdit = Offset;
- uint64_t StartOfRebaseInfo = StartOfLinkEdit;
- uint64_t StartOfBindingInfo = StartOfRebaseInfo + O.Rebases.Opcodes.size();
- uint64_t StartOfWeakBindingInfo = StartOfBindingInfo + O.Binds.Opcodes.size();
- uint64_t StartOfLazyBindingInfo =
- StartOfWeakBindingInfo + O.WeakBinds.Opcodes.size();
- uint64_t StartOfExportTrie =
- StartOfLazyBindingInfo + O.LazyBinds.Opcodes.size();
- uint64_t StartOfFunctionStarts = StartOfExportTrie + O.Exports.Trie.size();
- uint64_t StartOfDataInCode =
- StartOfFunctionStarts + O.FunctionStarts.Data.size();
- uint64_t StartOfSymbols = StartOfDataInCode + O.DataInCode.Data.size();
- uint64_t StartOfIndirectSymbols =
- StartOfSymbols + NListSize * O.SymTable.Symbols.size();
- uint64_t StartOfSymbolStrings =
- StartOfIndirectSymbols +
- sizeof(uint32_t) * O.IndirectSymTable.Symbols.size();
- uint64_t LinkEditSize =
- (StartOfSymbolStrings + StrTableBuilder.getSize()) - StartOfLinkEdit;
-
- // Now we have determined the layout of the contents of the __LINKEDIT
- // segment. Update its load command.
- if (LinkEditLoadCommand) {
- MachO::macho_load_command *MLC = LinkEditLoadCommand;
- switch (LinkEditLoadCommand->load_command_data.cmd) {
- case MachO::LC_SEGMENT:
- MLC->segment_command_data.cmdsize = sizeof(MachO::segment_command);
- MLC->segment_command_data.fileoff = StartOfLinkEdit;
- MLC->segment_command_data.vmsize = alignTo(LinkEditSize, PageSize);
- MLC->segment_command_data.filesize = LinkEditSize;
- break;
- case MachO::LC_SEGMENT_64:
- MLC->segment_command_64_data.cmdsize = sizeof(MachO::segment_command_64);
- MLC->segment_command_64_data.fileoff = StartOfLinkEdit;
- MLC->segment_command_64_data.vmsize = alignTo(LinkEditSize, PageSize);
- MLC->segment_command_64_data.filesize = LinkEditSize;
- break;
- }
- }
-
- for (auto &LC : O.LoadCommands) {
- auto &MLC = LC.MachOLoadCommand;
- auto cmd = MLC.load_command_data.cmd;
- switch (cmd) {
- case MachO::LC_SYMTAB:
- MLC.symtab_command_data.symoff = StartOfSymbols;
- MLC.symtab_command_data.nsyms = O.SymTable.Symbols.size();
- MLC.symtab_command_data.stroff = StartOfSymbolStrings;
- MLC.symtab_command_data.strsize = StrTableBuilder.getSize();
- break;
- case MachO::LC_DYSYMTAB: {
- if (MLC.dysymtab_command_data.ntoc != 0 ||
- MLC.dysymtab_command_data.nmodtab != 0 ||
- MLC.dysymtab_command_data.nextrefsyms != 0 ||
- MLC.dysymtab_command_data.nlocrel != 0 ||
- MLC.dysymtab_command_data.nextrel != 0)
- return createStringError(llvm::errc::not_supported,
- "shared library is not yet supported");
-
- if (!O.IndirectSymTable.Symbols.empty()) {
- MLC.dysymtab_command_data.indirectsymoff = StartOfIndirectSymbols;
- MLC.dysymtab_command_data.nindirectsyms =
- O.IndirectSymTable.Symbols.size();
- }
-
- updateDySymTab(MLC);
- break;
- }
- case MachO::LC_DATA_IN_CODE:
- MLC.linkedit_data_command_data.dataoff = StartOfDataInCode;
- MLC.linkedit_data_command_data.datasize = O.DataInCode.Data.size();
- break;
- case MachO::LC_FUNCTION_STARTS:
- MLC.linkedit_data_command_data.dataoff = StartOfFunctionStarts;
- MLC.linkedit_data_command_data.datasize = O.FunctionStarts.Data.size();
- break;
- case MachO::LC_DYLD_INFO:
- case MachO::LC_DYLD_INFO_ONLY:
- MLC.dyld_info_command_data.rebase_off =
- O.Rebases.Opcodes.empty() ? 0 : StartOfRebaseInfo;
- MLC.dyld_info_command_data.rebase_size = O.Rebases.Opcodes.size();
- MLC.dyld_info_command_data.bind_off =
- O.Binds.Opcodes.empty() ? 0 : StartOfBindingInfo;
- MLC.dyld_info_command_data.bind_size = O.Binds.Opcodes.size();
- MLC.dyld_info_command_data.weak_bind_off =
- O.WeakBinds.Opcodes.empty() ? 0 : StartOfWeakBindingInfo;
- MLC.dyld_info_command_data.weak_bind_size = O.WeakBinds.Opcodes.size();
- MLC.dyld_info_command_data.lazy_bind_off =
- O.LazyBinds.Opcodes.empty() ? 0 : StartOfLazyBindingInfo;
- MLC.dyld_info_command_data.lazy_bind_size = O.LazyBinds.Opcodes.size();
- MLC.dyld_info_command_data.export_off =
- O.Exports.Trie.empty() ? 0 : StartOfExportTrie;
- MLC.dyld_info_command_data.export_size = O.Exports.Trie.size();
- break;
- case MachO::LC_LOAD_DYLINKER:
- case MachO::LC_MAIN:
- case MachO::LC_RPATH:
- case MachO::LC_SEGMENT:
- case MachO::LC_SEGMENT_64:
- case MachO::LC_VERSION_MIN_MACOSX:
- case MachO::LC_BUILD_VERSION:
- case MachO::LC_ID_DYLIB:
- case MachO::LC_LOAD_DYLIB:
- case MachO::LC_UUID:
- case MachO::LC_SOURCE_VERSION:
- // Nothing to update.
- break;
- default:
- // Abort if it's unsupported in order to prevent corrupting the object.
- return createStringError(llvm::errc::not_supported,
- "unsupported load command (cmd=0x%x)", cmd);
- }
- }
-
- return Error::success();
-}
-
-Error MachOLayoutBuilder::layout() {
- O.Header.NCmds = O.LoadCommands.size();
- O.Header.SizeOfCmds = computeSizeOfCmds();
- constructStringTable();
- updateSymbolIndexes();
- uint64_t Offset = layoutSegments();
- Offset = layoutRelocations(Offset);
- return layoutTail(Offset);
-}
-
-} // end namespace macho
-} // end namespace objcopy
-} // end namespace llvm
Removed: llvm/trunk/tools/llvm-objcopy/MachO/MachOLayoutBuilder.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/MachO/MachOLayoutBuilder.h?rev=369233&view=auto
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/MachO/MachOLayoutBuilder.h (original)
+++ llvm/trunk/tools/llvm-objcopy/MachO/MachOLayoutBuilder.h (removed)
@@ -1,50 +0,0 @@
-//===- MachOLayoutBuilder.h -------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_OBJCOPY_MACHO_MACHOLAYOUTBUILDER_H
-#define LLVM_OBJCOPY_MACHO_MACHOLAYOUTBUILDER_H
-
-#include "MachOObjcopy.h"
-#include "Object.h"
-
-namespace llvm {
-namespace objcopy {
-namespace macho {
-
-class MachOLayoutBuilder {
- Object &O;
- bool Is64Bit;
- uint64_t PageSize;
-
- // Points to the __LINKEDIT segment if it exists.
- MachO::macho_load_command *LinkEditLoadCommand = nullptr;
- StringTableBuilder StrTableBuilder{StringTableBuilder::MachO};
-
- uint32_t computeSizeOfCmds() const;
- void constructStringTable();
- void updateSymbolIndexes();
- void updateDySymTab(MachO::macho_load_command &MLC);
- uint64_t layoutSegments();
- uint64_t layoutRelocations(uint64_t Offset);
- Error layoutTail(uint64_t Offset);
-
-public:
- MachOLayoutBuilder(Object &O, bool Is64Bit, uint64_t PageSize)
- : O(O), Is64Bit(Is64Bit), PageSize(PageSize) {}
-
- // Recomputes and updates fields in the given object such as file offsets.
- Error layout();
-
- StringTableBuilder &getStringTableBuilder() { return StrTableBuilder; }
-};
-
-} // end namespace macho
-} // end namespace objcopy
-} // end namespace llvm
-
-#endif // LLVM_OBJCOPY_MACHO_MACHOLAYOUTBUILDER_H
Modified: llvm/trunk/tools/llvm-objcopy/MachO/MachOObjcopy.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/MachO/MachOObjcopy.cpp?rev=369234&r1=369233&r2=369234&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/MachO/MachOObjcopy.cpp (original)
+++ llvm/trunk/tools/llvm-objcopy/MachO/MachOObjcopy.cpp Sun Aug 18 23:45:48 2019
@@ -57,11 +57,7 @@ Error executeObjcopyOnBinary(const CopyC
if (Error E = handleArgs(Config, *O))
return createFileError(Config.InputFilename, std::move(E));
- // TODO: Support 16KB pages which are employed in iOS arm64 binaries:
- // https://github.com/llvm/llvm-project/commit/1bebb2832ee312d3b0316dacff457a7a29435edb
- const uint64_t PageSize = 4096;
-
- MachOWriter Writer(*O, In.is64Bit(), In.isLittleEndian(), PageSize, Out);
+ MachOWriter Writer(*O, In.is64Bit(), In.isLittleEndian(), Out);
if (auto E = Writer.finalize())
return E;
return Writer.write();
Modified: llvm/trunk/tools/llvm-objcopy/MachO/MachOReader.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/MachO/MachOReader.cpp?rev=369234&r1=369233&r2=369234&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/MachO/MachOReader.cpp (original)
+++ llvm/trunk/tools/llvm-objcopy/MachO/MachOReader.cpp Sun Aug 18 23:45:48 2019
@@ -129,19 +129,10 @@ void MachOReader::readLoadCommands(Objec
case MachO::LC_SYMTAB:
O.SymTabCommandIndex = O.LoadCommands.size();
break;
- case MachO::LC_DYSYMTAB:
- O.DySymTabCommandIndex = O.LoadCommands.size();
- break;
case MachO::LC_DYLD_INFO:
case MachO::LC_DYLD_INFO_ONLY:
O.DyLdInfoCommandIndex = O.LoadCommands.size();
break;
- case MachO::LC_DATA_IN_CODE:
- O.DataInCodeCommandIndex = O.LoadCommands.size();
- break;
- case MachO::LC_FUNCTION_STARTS:
- O.FunctionStartsCommandIndex = O.LoadCommands.size();
- break;
}
#define HANDLE_LOAD_COMMAND(LCName, LCValue, LCStruct) \
case MachO::LCName: \
@@ -231,35 +222,6 @@ void MachOReader::readExportInfo(Object
O.Exports.Trie = MachOObj.getDyldInfoExportsTrie();
}
-void MachOReader::readDataInCodeData(Object &O) const {
- if (!O.DataInCodeCommandIndex)
- return;
- const MachO::linkedit_data_command &LDC =
- O.LoadCommands[*O.DataInCodeCommandIndex]
- .MachOLoadCommand.linkedit_data_command_data;
-
- O.DataInCode.Data = arrayRefFromStringRef(
- MachOObj.getData().substr(LDC.dataoff, LDC.datasize));
-}
-
-void MachOReader::readFunctionStartsData(Object &O) const {
- if (!O.FunctionStartsCommandIndex)
- return;
- const MachO::linkedit_data_command &LDC =
- O.LoadCommands[*O.FunctionStartsCommandIndex]
- .MachOLoadCommand.linkedit_data_command_data;
-
- O.FunctionStarts.Data = arrayRefFromStringRef(
- MachOObj.getData().substr(LDC.dataoff, LDC.datasize));
-}
-
-void MachOReader::readIndirectSymbolTable(Object &O) const {
- MachO::dysymtab_command DySymTab = MachOObj.getDysymtabLoadCommand();
- for (uint32_t i = 0; i < DySymTab.nindirectsyms; ++i)
- O.IndirectSymTable.Symbols.push_back(
- MachOObj.getIndirectSymbolTableEntry(DySymTab, i));
-}
-
std::unique_ptr<Object> MachOReader::create() const {
auto Obj = std::make_unique<Object>();
readHeader(*Obj);
@@ -271,9 +233,6 @@ std::unique_ptr<Object> MachOReader::cre
readWeakBindInfo(*Obj);
readLazyBindInfo(*Obj);
readExportInfo(*Obj);
- readDataInCodeData(*Obj);
- readFunctionStartsData(*Obj);
- readIndirectSymbolTable(*Obj);
return Obj;
}
Modified: llvm/trunk/tools/llvm-objcopy/MachO/MachOReader.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/MachO/MachOReader.h?rev=369234&r1=369233&r2=369234&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/MachO/MachOReader.h (original)
+++ llvm/trunk/tools/llvm-objcopy/MachO/MachOReader.h Sun Aug 18 23:45:48 2019
@@ -36,9 +36,6 @@ class MachOReader : public Reader {
void readWeakBindInfo(Object &O) const;
void readLazyBindInfo(Object &O) const;
void readExportInfo(Object &O) const;
- void readDataInCodeData(Object &O) const;
- void readFunctionStartsData(Object &O) const;
- void readIndirectSymbolTable(Object &O) const;
public:
explicit MachOReader(const object::MachOObjectFile &Obj) : MachOObj(Obj) {}
Modified: llvm/trunk/tools/llvm-objcopy/MachO/MachOWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/MachO/MachOWriter.cpp?rev=369234&r1=369233&r2=369234&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/MachO/MachOWriter.cpp (original)
+++ llvm/trunk/tools/llvm-objcopy/MachO/MachOWriter.cpp Sun Aug 18 23:45:48 2019
@@ -7,7 +7,6 @@
//===----------------------------------------------------------------------===//
#include "MachOWriter.h"
-#include "MachOLayoutBuilder.h"
#include "Object.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/BinaryFormat/MachO.h"
@@ -41,10 +40,16 @@ size_t MachOWriter::totalSize() const {
const MachO::symtab_command &SymTabCommand =
O.LoadCommands[*O.SymTabCommandIndex]
.MachOLoadCommand.symtab_command_data;
- if (SymTabCommand.symoff)
+ if (SymTabCommand.symoff) {
+ assert((SymTabCommand.nsyms == O.SymTable.Symbols.size()) &&
+ "Incorrect number of symbols");
Ends.push_back(SymTabCommand.symoff + symTableSize());
- if (SymTabCommand.stroff)
+ }
+ if (SymTabCommand.stroff) {
+ assert((SymTabCommand.strsize == StrTableBuilder.getSize()) &&
+ "Incorrect string table size");
Ends.push_back(SymTabCommand.stroff + SymTabCommand.strsize);
+ }
}
if (O.DyLdInfoCommandIndex) {
const MachO::dyld_info_command &DyLdInfoCommand =
@@ -79,36 +84,6 @@ size_t MachOWriter::totalSize() const {
}
}
- if (O.DySymTabCommandIndex) {
- const MachO::dysymtab_command &DySymTabCommand =
- O.LoadCommands[*O.DySymTabCommandIndex]
- .MachOLoadCommand.dysymtab_command_data;
-
- if (DySymTabCommand.indirectsymoff)
- Ends.push_back(DySymTabCommand.indirectsymoff +
- sizeof(uint32_t) * O.IndirectSymTable.Symbols.size());
- }
-
- if (O.DataInCodeCommandIndex) {
- const MachO::linkedit_data_command &LinkEditDataCommand =
- O.LoadCommands[*O.DataInCodeCommandIndex]
- .MachOLoadCommand.linkedit_data_command_data;
-
- if (LinkEditDataCommand.dataoff)
- Ends.push_back(LinkEditDataCommand.dataoff +
- LinkEditDataCommand.datasize);
- }
-
- if (O.FunctionStartsCommandIndex) {
- const MachO::linkedit_data_command &LinkEditDataCommand =
- O.LoadCommands[*O.FunctionStartsCommandIndex]
- .MachOLoadCommand.linkedit_data_command_data;
-
- if (LinkEditDataCommand.dataoff)
- Ends.push_back(LinkEditDataCommand.dataoff +
- LinkEditDataCommand.datasize);
- }
-
// Otherwise, use the last section / reloction.
for (const auto &LC : O.LoadCommands)
for (const auto &S : LC.Sections) {
@@ -145,6 +120,14 @@ void MachOWriter::writeHeader() {
memcpy(B.getBufferStart(), &Header, HeaderSize);
}
+void MachOWriter::updateSymbolIndexes() {
+ uint32_t Index = 0;
+ for (auto &Symbol : O.SymTable.Symbols) {
+ Symbol->Index = Index;
+ Index++;
+ }
+}
+
void MachOWriter::writeLoadCommands() {
uint8_t *Begin = B.getBufferStart() + headerSize();
for (const auto &LC : O.LoadCommands) {
@@ -278,7 +261,7 @@ void MachOWriter::writeSymbolTable() {
.MachOLoadCommand.symtab_command_data;
uint8_t *StrTable = (uint8_t *)B.getBufferStart() + SymTabCommand.stroff;
- LayoutBuilder.getStringTableBuilder().write(StrTable);
+ StrTableBuilder.write(StrTable);
}
void MachOWriter::writeStringTable() {
@@ -292,7 +275,7 @@ void MachOWriter::writeStringTable() {
for (auto Iter = O.SymTable.Symbols.begin(), End = O.SymTable.Symbols.end();
Iter != End; Iter++) {
SymbolEntry *Sym = Iter->get();
- uint32_t Nstrx = LayoutBuilder.getStringTableBuilder().getOffset(Sym->Name);
+ auto Nstrx = StrTableBuilder.getOffset(Sym->Name);
if (Is64Bit)
writeNListEntry<MachO::nlist_64>(*Sym, IsLittleEndian, SymTable, Nstrx);
@@ -361,45 +344,6 @@ void MachOWriter::writeExportInfo() {
memcpy(Out, O.Exports.Trie.data(), O.Exports.Trie.size());
}
-void MachOWriter::writeIndirectSymbolTable() {
- if (!O.DySymTabCommandIndex)
- return;
-
- const MachO::dysymtab_command &DySymTabCommand =
- O.LoadCommands[*O.DySymTabCommandIndex]
- .MachOLoadCommand.dysymtab_command_data;
-
- char *Out = (char *)B.getBufferStart() + DySymTabCommand.indirectsymoff;
- assert((DySymTabCommand.nindirectsyms == O.IndirectSymTable.Symbols.size()) &&
- "Incorrect indirect symbol table size");
- memcpy(Out, O.IndirectSymTable.Symbols.data(),
- sizeof(uint32_t) * O.IndirectSymTable.Symbols.size());
-}
-
-void MachOWriter::writeDataInCodeData() {
- if (!O.DataInCodeCommandIndex)
- return;
- const MachO::linkedit_data_command &LinkEditDataCommand =
- O.LoadCommands[*O.DataInCodeCommandIndex]
- .MachOLoadCommand.linkedit_data_command_data;
- char *Out = (char *)B.getBufferStart() + LinkEditDataCommand.dataoff;
- assert((LinkEditDataCommand.datasize == O.DataInCode.Data.size()) &&
- "Incorrect data in code data size");
- memcpy(Out, O.DataInCode.Data.data(), O.DataInCode.Data.size());
-}
-
-void MachOWriter::writeFunctionStartsData() {
- if (!O.FunctionStartsCommandIndex)
- return;
- const MachO::linkedit_data_command &LinkEditDataCommand =
- O.LoadCommands[*O.FunctionStartsCommandIndex]
- .MachOLoadCommand.linkedit_data_command_data;
- char *Out = (char *)B.getBufferStart() + LinkEditDataCommand.dataoff;
- assert((LinkEditDataCommand.datasize == O.FunctionStarts.Data.size()) &&
- "Incorrect function starts data size");
- memcpy(Out, O.FunctionStarts.Data.data(), O.FunctionStarts.Data.size());
-}
-
void MachOWriter::writeTail() {
typedef void (MachOWriter::*WriteHandlerType)(void);
typedef std::pair<uint64_t, WriteHandlerType> WriteOperation;
@@ -435,36 +379,6 @@ void MachOWriter::writeTail() {
{DyLdInfoCommand.export_off, &MachOWriter::writeExportInfo});
}
- if (O.DySymTabCommandIndex) {
- const MachO::dysymtab_command &DySymTabCommand =
- O.LoadCommands[*O.DySymTabCommandIndex]
- .MachOLoadCommand.dysymtab_command_data;
-
- if (DySymTabCommand.indirectsymoff)
- Queue.emplace_back(DySymTabCommand.indirectsymoff,
- &MachOWriter::writeIndirectSymbolTable);
- }
-
- if (O.DataInCodeCommandIndex) {
- const MachO::linkedit_data_command &LinkEditDataCommand =
- O.LoadCommands[*O.DataInCodeCommandIndex]
- .MachOLoadCommand.linkedit_data_command_data;
-
- if (LinkEditDataCommand.dataoff)
- Queue.emplace_back(LinkEditDataCommand.dataoff,
- &MachOWriter::writeDataInCodeData);
- }
-
- if (O.FunctionStartsCommandIndex) {
- const MachO::linkedit_data_command &LinkEditDataCommand =
- O.LoadCommands[*O.FunctionStartsCommandIndex]
- .MachOLoadCommand.linkedit_data_command_data;
-
- if (LinkEditDataCommand.dataoff)
- Queue.emplace_back(LinkEditDataCommand.dataoff,
- &MachOWriter::writeFunctionStartsData);
- }
-
llvm::sort(Queue, [](const WriteOperation &LHS, const WriteOperation &RHS) {
return LHS.first < RHS.first;
});
@@ -473,13 +387,198 @@ void MachOWriter::writeTail() {
(this->*WriteOp.second)();
}
-Error MachOWriter::finalize() { return LayoutBuilder.layout(); }
+void MachOWriter::updateSizeOfCmds() {
+ auto Size = 0;
+ for (const auto &LC : O.LoadCommands) {
+ auto &MLC = LC.MachOLoadCommand;
+ auto cmd = MLC.load_command_data.cmd;
+
+ switch (cmd) {
+ case MachO::LC_SEGMENT:
+ Size += sizeof(MachO::segment_command) +
+ sizeof(MachO::section) * LC.Sections.size();
+ continue;
+ case MachO::LC_SEGMENT_64:
+ Size += sizeof(MachO::segment_command_64) +
+ sizeof(MachO::section_64) * LC.Sections.size();
+ continue;
+ }
+
+ switch (cmd) {
+#define HANDLE_LOAD_COMMAND(LCName, LCValue, LCStruct) \
+ case MachO::LCName: \
+ Size += sizeof(MachO::LCStruct); \
+ break;
+#include "llvm/BinaryFormat/MachO.def"
+#undef HANDLE_LOAD_COMMAND
+ }
+ }
+
+ O.Header.SizeOfCmds = Size;
+}
+
+// Updates the index and the number of local/external/undefined symbols. Here we
+// assume that MLC is a LC_DYSYMTAB and the nlist entries in the symbol table
+// are already sorted by the those types.
+void MachOWriter::updateDySymTab(MachO::macho_load_command &MLC) {
+ uint32_t NumLocalSymbols = 0;
+ auto Iter = O.SymTable.Symbols.begin();
+ auto End = O.SymTable.Symbols.end();
+ for (; Iter != End; Iter++) {
+ if ((*Iter)->n_type & (MachO::N_EXT | MachO::N_PEXT))
+ break;
+
+ NumLocalSymbols++;
+ }
+
+ uint32_t NumExtDefSymbols = 0;
+ for (; Iter != End; Iter++) {
+ if (((*Iter)->n_type & MachO::N_TYPE) == MachO::N_UNDF)
+ break;
+
+ NumExtDefSymbols++;
+ }
+
+ MLC.dysymtab_command_data.ilocalsym = 0;
+ MLC.dysymtab_command_data.nlocalsym = NumLocalSymbols;
+ MLC.dysymtab_command_data.iextdefsym = NumLocalSymbols;
+ MLC.dysymtab_command_data.nextdefsym = NumExtDefSymbols;
+ MLC.dysymtab_command_data.iundefsym = NumLocalSymbols + NumExtDefSymbols;
+ MLC.dysymtab_command_data.nundefsym =
+ O.SymTable.Symbols.size() - (NumLocalSymbols + NumExtDefSymbols);
+}
+
+// Recomputes and updates offset and size fields in load commands and sections
+// since they could be modified.
+Error MachOWriter::layout() {
+ auto SizeOfCmds = loadCommandsSize();
+ auto Offset = headerSize() + SizeOfCmds;
+ O.Header.NCmds = O.LoadCommands.size();
+ O.Header.SizeOfCmds = SizeOfCmds;
+
+ // Lay out sections.
+ for (auto &LC : O.LoadCommands) {
+ uint64_t FileOff = Offset;
+ uint64_t VMSize = 0;
+ uint64_t FileOffsetInSegment = 0;
+ for (auto &Sec : LC.Sections) {
+ if (!Sec.isVirtualSection()) {
+ auto FilePaddingSize =
+ OffsetToAlignment(FileOffsetInSegment, 1ull << Sec.Align);
+ Sec.Offset = Offset + FileOffsetInSegment + FilePaddingSize;
+ Sec.Size = Sec.Content.size();
+ FileOffsetInSegment += FilePaddingSize + Sec.Size;
+ }
+
+ VMSize = std::max(VMSize, Sec.Addr + Sec.Size);
+ }
+
+ // TODO: Handle the __PAGEZERO segment.
+ auto &MLC = LC.MachOLoadCommand;
+ switch (MLC.load_command_data.cmd) {
+ case MachO::LC_SEGMENT:
+ MLC.segment_command_data.cmdsize =
+ sizeof(MachO::segment_command) +
+ sizeof(MachO::section) * LC.Sections.size();
+ MLC.segment_command_data.nsects = LC.Sections.size();
+ MLC.segment_command_data.fileoff = FileOff;
+ MLC.segment_command_data.vmsize = VMSize;
+ MLC.segment_command_data.filesize = FileOffsetInSegment;
+ break;
+ case MachO::LC_SEGMENT_64:
+ MLC.segment_command_64_data.cmdsize =
+ sizeof(MachO::segment_command_64) +
+ sizeof(MachO::section_64) * LC.Sections.size();
+ MLC.segment_command_64_data.nsects = LC.Sections.size();
+ MLC.segment_command_64_data.fileoff = FileOff;
+ MLC.segment_command_64_data.vmsize = VMSize;
+ MLC.segment_command_64_data.filesize = FileOffsetInSegment;
+ break;
+ }
+
+ Offset += FileOffsetInSegment;
+ }
+
+ // Lay out relocations.
+ for (auto &LC : O.LoadCommands)
+ for (auto &Sec : LC.Sections) {
+ Sec.RelOff = Sec.Relocations.empty() ? 0 : Offset;
+ Sec.NReloc = Sec.Relocations.size();
+ Offset += sizeof(MachO::any_relocation_info) * Sec.NReloc;
+ }
+
+ // Lay out tail stuff.
+ auto NListSize = Is64Bit ? sizeof(MachO::nlist_64) : sizeof(MachO::nlist);
+ for (auto &LC : O.LoadCommands) {
+ auto &MLC = LC.MachOLoadCommand;
+ auto cmd = MLC.load_command_data.cmd;
+ switch (cmd) {
+ case MachO::LC_SYMTAB:
+ MLC.symtab_command_data.nsyms = O.SymTable.Symbols.size();
+ MLC.symtab_command_data.strsize = StrTableBuilder.getSize();
+ MLC.symtab_command_data.symoff = Offset;
+ Offset += NListSize * MLC.symtab_command_data.nsyms;
+ MLC.symtab_command_data.stroff = Offset;
+ Offset += MLC.symtab_command_data.strsize;
+ break;
+ case MachO::LC_DYSYMTAB: {
+ if (MLC.dysymtab_command_data.ntoc != 0 ||
+ MLC.dysymtab_command_data.nmodtab != 0 ||
+ MLC.dysymtab_command_data.nextrefsyms != 0 ||
+ MLC.dysymtab_command_data.nlocrel != 0 ||
+ MLC.dysymtab_command_data.nextrel != 0)
+ return createStringError(llvm::errc::not_supported,
+ "shared library is not yet supported");
+
+ if (MLC.dysymtab_command_data.nindirectsyms != 0)
+ return createStringError(llvm::errc::not_supported,
+ "indirect symbol table is not yet supported");
+
+ updateDySymTab(MLC);
+ break;
+ }
+ case MachO::LC_SEGMENT:
+ case MachO::LC_SEGMENT_64:
+ case MachO::LC_VERSION_MIN_MACOSX:
+ case MachO::LC_BUILD_VERSION:
+ case MachO::LC_ID_DYLIB:
+ case MachO::LC_LOAD_DYLIB:
+ case MachO::LC_UUID:
+ case MachO::LC_SOURCE_VERSION:
+ // Nothing to update.
+ break;
+ default:
+ // Abort if it's unsupported in order to prevent corrupting the object.
+ return createStringError(llvm::errc::not_supported,
+ "unsupported load command (cmd=0x%x)", cmd);
+ }
+ }
+
+ return Error::success();
+}
+
+void MachOWriter::constructStringTable() {
+ for (std::unique_ptr<SymbolEntry> &Sym : O.SymTable.Symbols)
+ StrTableBuilder.add(Sym->Name);
+ StrTableBuilder.finalize();
+}
+
+Error MachOWriter::finalize() {
+ updateSizeOfCmds();
+ constructStringTable();
+
+ if (auto E = layout())
+ return E;
+
+ return Error::success();
+}
Error MachOWriter::write() {
if (Error E = B.allocate(totalSize()))
return E;
memset(B.getBufferStart(), 0, totalSize());
writeHeader();
+ updateSymbolIndexes();
writeLoadCommands();
writeSections();
writeTail();
Modified: llvm/trunk/tools/llvm-objcopy/MachO/MachOWriter.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/MachO/MachOWriter.h?rev=369234&r1=369233&r2=369234&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/MachO/MachOWriter.h (original)
+++ llvm/trunk/tools/llvm-objcopy/MachO/MachOWriter.h Sun Aug 18 23:45:48 2019
@@ -7,7 +7,6 @@
//===----------------------------------------------------------------------===//
#include "../Buffer.h"
-#include "MachOLayoutBuilder.h"
#include "MachOObjcopy.h"
#include "Object.h"
#include "llvm/BinaryFormat/MachO.h"
@@ -23,15 +22,20 @@ class MachOWriter {
Object &O;
bool Is64Bit;
bool IsLittleEndian;
- uint64_t PageSize;
Buffer &B;
- MachOLayoutBuilder LayoutBuilder;
+ StringTableBuilder StrTableBuilder{StringTableBuilder::MachO};
size_t headerSize() const;
size_t loadCommandsSize() const;
size_t symTableSize() const;
size_t strTableSize() const;
+ void updateDySymTab(MachO::macho_load_command &MLC);
+ void updateSizeOfCmds();
+ void updateSymbolIndexes();
+ void constructStringTable();
+ Error layout();
+
void writeHeader();
void writeLoadCommands();
template <typename StructType>
@@ -44,16 +48,11 @@ class MachOWriter {
void writeWeakBindInfo();
void writeLazyBindInfo();
void writeExportInfo();
- void writeIndirectSymbolTable();
- void writeDataInCodeData();
- void writeFunctionStartsData();
void writeTail();
public:
- MachOWriter(Object &O, bool Is64Bit, bool IsLittleEndian, uint64_t PageSize,
- Buffer &B)
- : O(O), Is64Bit(Is64Bit), IsLittleEndian(IsLittleEndian),
- PageSize(PageSize), B(B), LayoutBuilder(O, Is64Bit, PageSize) {}
+ MachOWriter(Object &O, bool Is64Bit, bool IsLittleEndian, Buffer &B)
+ : O(O), Is64Bit(Is64Bit), IsLittleEndian(IsLittleEndian), B(B) {}
size_t totalSize() const;
Error finalize();
Modified: llvm/trunk/tools/llvm-objcopy/MachO/Object.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/MachO/Object.h?rev=369234&r1=369233&r2=369234&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/MachO/Object.h (original)
+++ llvm/trunk/tools/llvm-objcopy/MachO/Object.h Sun Aug 18 23:45:48 2019
@@ -90,16 +90,6 @@ struct SymbolEntry {
uint8_t n_sect;
uint16_t n_desc;
uint64_t n_value;
-
- bool isExternalSymbol() const {
- return n_type & ((MachO::N_EXT | MachO::N_PEXT));
- }
-
- bool isLocalSymbol() const { return !isExternalSymbol(); }
-
- bool isUndefinedSymbol() const {
- return (n_type & MachO::N_TYPE) == MachO::N_UNDF;
- }
};
/// The location of the symbol table inside the binary is described by LC_SYMTAB
@@ -110,10 +100,6 @@ struct SymbolTable {
const SymbolEntry *getSymbolByIndex(uint32_t Index) const;
};
-struct IndirectSymbolTable {
- std::vector<uint32_t> Symbols;
-};
-
/// The location of the string table inside the binary is described by LC_SYMTAB
/// load command.
struct StringTable {
@@ -220,10 +206,6 @@ struct ExportInfo {
ArrayRef<uint8_t> Trie;
};
-struct LinkData {
- ArrayRef<uint8_t> Data;
-};
-
struct Object {
MachHeader Header;
std::vector<LoadCommand> LoadCommands;
@@ -236,20 +218,11 @@ struct Object {
WeakBindInfo WeakBinds;
LazyBindInfo LazyBinds;
ExportInfo Exports;
- IndirectSymbolTable IndirectSymTable;
- LinkData DataInCode;
- LinkData FunctionStarts;
/// The index of LC_SYMTAB load command if present.
Optional<size_t> SymTabCommandIndex;
/// The index of LC_DYLD_INFO or LC_DYLD_INFO_ONLY load command if present.
Optional<size_t> DyLdInfoCommandIndex;
- /// The index LC_DYSYMTAB load comamnd if present.
- Optional<size_t> DySymTabCommandIndex;
- /// The index LC_DATA_IN_CODE load comamnd if present.
- Optional<size_t> DataInCodeCommandIndex;
- /// The index LC_FUNCTION_STARTS load comamnd if present.
- Optional<size_t> FunctionStartsCommandIndex;
};
} // end namespace macho
More information about the llvm-commits
mailing list