[llvm] r269953 - Re-apply: [obj2yaml] [yaml2obj] Support MachO section and section_64
Chris Bieneman via llvm-commits
llvm-commits at lists.llvm.org
Wed May 18 09:17:23 PDT 2016
Author: cbieneman
Date: Wed May 18 11:17:23 2016
New Revision: 269953
URL: http://llvm.org/viewvc/llvm-project?rev=269953&view=rev
Log:
Re-apply: [obj2yaml] [yaml2obj] Support MachO section and section_64
This re-applies r269845, r269846, and r269850 with an included fix for a crash reported by zturner.
Added:
llvm/trunk/test/ObjectYAML/MachO/sections.yaml
Modified:
llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h
llvm/trunk/lib/ObjectYAML/MachOYAML.cpp
llvm/trunk/test/ObjectYAML/MachO/load_commands.yaml
llvm/trunk/tools/obj2yaml/macho2yaml.cpp
llvm/trunk/tools/yaml2obj/yaml2macho.cpp
Modified: llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h?rev=269953&r1=269952&r2=269953&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h (original)
+++ llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h Wed May 18 11:17:23 2016
@@ -22,6 +22,21 @@
namespace llvm {
namespace MachOYAML {
+struct Section {
+ char sectname[16];
+ char segname[16];
+ llvm::yaml::Hex64 addr;
+ uint64_t size;
+ llvm::yaml::Hex32 offset;
+ uint32_t align;
+ llvm::yaml::Hex32 reloff;
+ uint32_t nreloc;
+ llvm::yaml::Hex32 flags;
+ llvm::yaml::Hex32 reserved1;
+ llvm::yaml::Hex32 reserved2;
+ llvm::yaml::Hex32 reserved3;
+};
+
struct FileHeader {
llvm::yaml::Hex32 magic;
llvm::yaml::Hex32 cputype;
@@ -36,17 +51,20 @@ struct FileHeader {
struct LoadCommand {
virtual ~LoadCommand();
llvm::MachO::macho_load_command Data;
+ std::vector<Section> Sections;
};
struct Object {
FileHeader Header;
std::vector<LoadCommand> LoadCommands;
+ std::vector<Section> Sections;
};
} // namespace llvm::MachOYAML
} // namespace llvm
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::LoadCommand)
+LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::Section)
namespace llvm {
namespace yaml {
@@ -63,6 +81,10 @@ template <> struct MappingTraits<MachOYA
static void mapping(IO &IO, MachOYAML::LoadCommand &LoadCommand);
};
+template <> struct MappingTraits<MachOYAML::Section> {
+ static void mapping(IO &IO, MachOYAML::Section &Section);
+};
+
#define HANDLE_LOAD_COMMAND(LCName, LCValue, LCStruct) \
io.enumCase(value, #LCName, MachO::LCName);
Modified: llvm/trunk/lib/ObjectYAML/MachOYAML.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/MachOYAML.cpp?rev=269953&r1=269952&r2=269953&view=diff
==============================================================================
--- llvm/trunk/lib/ObjectYAML/MachOYAML.cpp (original)
+++ llvm/trunk/lib/ObjectYAML/MachOYAML.cpp Wed May 18 11:17:23 2016
@@ -15,7 +15,7 @@
#include "llvm/Support/Casting.h"
#include "llvm/Support/Format.h"
-#include <string.h> // For memcpy and memset.
+#include <string.h> // For memcpy, memset and strnlen.
namespace llvm {
@@ -25,7 +25,8 @@ namespace yaml {
void ScalarTraits<char_16>::output(const char_16 &Val, void *,
llvm::raw_ostream &Out) {
- Out << Val;
+ auto Len = strnlen(&Val[0], 16);
+ Out << StringRef(&Val[0], Len);
}
StringRef ScalarTraits<char_16>::input(StringRef Scalar, void *, char_16 &Val) {
@@ -110,20 +111,42 @@ void MappingTraits<MachOYAML::LoadComman
switch (LoadCommand.Data.load_command_data.cmd) {
#include "llvm/Support/MachO.def"
}
+ if (LoadCommand.Data.load_command_data.cmd == MachO::LC_SEGMENT ||
+ LoadCommand.Data.load_command_data.cmd == MachO::LC_SEGMENT_64) {
+ IO.mapOptional("Sections", LoadCommand.Sections);
+ }
}
void MappingTraits<MachO::dyld_info_command>::mapping(
IO &IO, MachO::dyld_info_command &LoadCommand) {
IO.mapRequired("rebase_off", LoadCommand.rebase_off);
IO.mapRequired("rebase_size", LoadCommand.rebase_size);
- IO.mapRequired("bind_off", LoadCommand.bind_size);
+ IO.mapRequired("bind_off", LoadCommand.bind_off);
+ IO.mapRequired("bind_size", LoadCommand.bind_size);
IO.mapRequired("weak_bind_off", LoadCommand.weak_bind_off);
IO.mapRequired("weak_bind_size", LoadCommand.weak_bind_size);
- IO.mapRequired("lazy_bind_off", LoadCommand.lazy_bind_size);
+ IO.mapRequired("lazy_bind_off", LoadCommand.lazy_bind_off);
+ IO.mapRequired("lazy_bind_size", LoadCommand.lazy_bind_size);
IO.mapRequired("export_off", LoadCommand.export_off);
IO.mapRequired("export_size", LoadCommand.export_size);
}
+void MappingTraits<MachOYAML::Section>::mapping(IO &IO,
+ MachOYAML::Section &Section) {
+ IO.mapRequired("sectname", Section.sectname);
+ IO.mapRequired("segname", Section.segname);
+ IO.mapRequired("addr", Section.addr);
+ IO.mapRequired("size", Section.size);
+ IO.mapRequired("offset", Section.offset);
+ IO.mapRequired("align", Section.align);
+ IO.mapRequired("reloff", Section.reloff);
+ IO.mapRequired("nreloc", Section.nreloc);
+ IO.mapRequired("flags", Section.flags);
+ IO.mapRequired("reserved1", Section.reserved1);
+ IO.mapRequired("reserved2", Section.reserved2);
+ IO.mapOptional("reserved3", Section.reserved3);
+}
+
void MappingTraits<MachO::dylib>::mapping(IO &IO, MachO::dylib &DylibStruct) {
IO.mapRequired("name", DylibStruct.name);
IO.mapRequired("timestamp", DylibStruct.timestamp);
Modified: llvm/trunk/test/ObjectYAML/MachO/load_commands.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/load_commands.yaml?rev=269953&r1=269952&r2=269953&view=diff
==============================================================================
--- llvm/trunk/test/ObjectYAML/MachO/load_commands.yaml (original)
+++ llvm/trunk/test/ObjectYAML/MachO/load_commands.yaml Wed May 18 11:17:23 2016
@@ -59,10 +59,12 @@ LoadCommands:
cmdsize: 48
rebase_off: 12288
rebase_size: 8
- bind_off: 96
+ bind_off: 12296
+ bind_size: 96
weak_bind_off: 0
weak_bind_size: 0
- lazy_bind_off: 624
+ lazy_bind_off: 12392
+ lazy_bind_size: 624
export_off: 13016
export_size: 48
- cmd: LC_SYMTAB
@@ -184,10 +186,12 @@ LoadCommands:
#CHECK: cmdsize: 48
#CHECK: rebase_off: 12288
#CHECK: rebase_size: 8
-#CHECK: bind_off: 96
+#CHECK: bind_off: 12296
+#CHECK: bind_size: 96
#CHECK: weak_bind_off: 0
#CHECK: weak_bind_size: 0
-#CHECK: lazy_bind_off: 624
+#CHECK: lazy_bind_off: 12392
+#CHECK: lazy_bind_size: 624
#CHECK: export_off: 13016
#CHECK: export_size: 48
#CHECK: - cmd: LC_SYMTAB
Added: llvm/trunk/test/ObjectYAML/MachO/sections.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/sections.yaml?rev=269953&view=auto
==============================================================================
--- llvm/trunk/test/ObjectYAML/MachO/sections.yaml (added)
+++ llvm/trunk/test/ObjectYAML/MachO/sections.yaml Wed May 18 11:17:23 2016
@@ -0,0 +1,284 @@
+# RUN: yaml2obj -format=macho %s | obj2yaml | FileCheck %s
+
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACF
+ cputype: 0x01000007
+ cpusubtype: 0x80000003
+ filetype: 0x00000002
+ ncmds: 16
+ sizeofcmds: 1408
+ flags: 0x00218085
+ 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: 552
+ segname: __TEXT
+ vmaddr: 4294967296
+ vmsize: 8192
+ fileoff: 0
+ filesize: 8192
+ maxprot: 7
+ initprot: 5
+ nsects: 6
+ flags: 0
+ Sections:
+ - sectname: __text
+ segname: __TEXT
+ addr: 0x0000000100001160
+ size: 3099
+ offset: 0x00001160
+ align: 4
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x80000400
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __stubs
+ segname: __TEXT
+ addr: 0x0000000100001D7C
+ size: 90
+ offset: 0x00001D7C
+ align: 1
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x80000408
+ reserved1: 0x00000000
+ reserved2: 0x00000006
+ reserved3: 0x00000000
+ - sectname: __stub_helper
+ segname: __TEXT
+ addr: 0x0000000100001DD8
+ size: 166
+ offset: 0x00001DD8
+ align: 2
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x80000400
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __gcc_except_tab
+ segname: __TEXT
+ addr: 0x0000000100001E80
+ size: 240
+ offset: 0x00001E80
+ align: 2
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __cstring
+ segname: __TEXT
+ addr: 0x0000000100001F70
+ size: 15
+ offset: 0x00001F70
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000002
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __unwind_info
+ segname: __TEXT
+ addr: 0x0000000100001F80
+ size: 120
+ offset: 0x00001F80
+ align: 2
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - cmd: LC_SEGMENT_64
+ cmdsize: 312
+ segname: __DATA
+ vmaddr: 4294975488
+ vmsize: 4096
+ fileoff: 8192
+ filesize: 4096
+ maxprot: 7
+ initprot: 3
+ nsects: 3
+ flags: 0
+ Sections:
+ - sectname: __got
+ segname: __DATA
+ addr: 0x0000000100002000
+ size: 24
+ offset: 0x00002000
+ align: 3
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000006
+ reserved1: 0x0000000F
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __nl_symbol_ptr
+ segname: __DATA
+ addr: 0x0000000100002018
+ size: 16
+ offset: 0x00002018
+ align: 3
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000006
+ reserved1: 0x00000012
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __la_symbol_ptr
+ segname: __DATA
+ addr: 0x0000000100002028
+ size: 120
+ offset: 0x00002028
+ align: 3
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x00000007
+ reserved1: 0x00000014
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - cmd: LC_SEGMENT_64
+ cmdsize: 72
+ segname: __LINKEDIT
+ vmaddr: 4294979584
+ vmsize: 4096
+ fileoff: 12288
+ filesize: 2508
+ maxprot: 7
+ initprot: 1
+ nsects: 0
+ flags: 0
+ - cmd: LC_DYLD_INFO_ONLY
+ cmdsize: 48
+ rebase_off: 12288
+ rebase_size: 8
+ bind_off: 12296
+ bind_size: 96
+ weak_bind_off: 0
+ weak_bind_size: 0
+ lazy_bind_off: 12392
+ lazy_bind_size: 624
+ export_off: 13016
+ export_size: 48
+ - cmd: LC_SYMTAB
+ cmdsize: 24
+ symoff: 13080
+ nsyms: 30
+ stroff: 13700
+ strsize: 1096
+ - cmd: LC_DYSYMTAB
+ cmdsize: 80
+ ilocalsym: 0
+ nlocalsym: 9
+ iextdefsym: 9
+ nextdefsym: 2
+ iundefsym: 11
+ nundefsym: 19
+ tocoff: 0
+ ntoc: 0
+ modtaboff: 0
+ nmodtab: 0
+ extrefsymoff: 0
+ nextrefsyms: 0
+ indirectsymoff: 13560
+ nindirectsyms: 35
+ extreloff: 0
+ nextrel: 0
+ locreloff: 0
+ nlocrel: 0
+ - cmd: LC_LOAD_DYLINKER
+ cmdsize: 32
+ name: 12
+ - cmd: LC_UUID
+ cmdsize: 24
+ cmdsize: 24
+ uuid: 461A1B28-822F-3F38-B670-645419E636F5
+ - cmd: LC_VERSION_MIN_MACOSX
+ cmdsize: 16
+ version: 658176
+ sdk: 658176
+ - cmd: LC_SOURCE_VERSION
+ cmdsize: 16
+ version: 0
+ - cmd: LC_MAIN
+ cmdsize: 24
+ entryoff: 4448
+ stacksize: 0
+ - cmd: LC_LOAD_DYLIB
+ cmdsize: 48
+ dylib:
+ name: 24
+ timestamp: 2
+ current_version: 7864576
+ compatibility_version: 65536
+ - cmd: LC_LOAD_DYLIB
+ cmdsize: 56
+ dylib:
+ name: 24
+ timestamp: 2
+ current_version: 80349697
+ compatibility_version: 65536
+ - cmd: LC_FUNCTION_STARTS
+ cmdsize: 16
+ dataoff: 13064
+ datasize: 16
+ - cmd: LC_DATA_IN_CODE
+ cmdsize: 16
+ dataoff: 13080
+ datasize: 0
+...
+
+
+#CHECK: - cmd: LC_SEGMENT_64
+#CHECK: segname: __PAGEZERO
+#CHECK: - cmd: LC_SEGMENT_64
+#CHECK: segname: __TEXT
+#CHECK: Sections:
+#CHECK: - sectname: __text
+#CHECK: segname: __TEXT
+#CHECK: addr: 0x0000000100001160
+#CHECK: size: 3099
+#CHECK: offset: 0x00001160
+#CHECK: align: 4
+#CHECK: reloff: 0x00000000
+#CHECK: nreloc: 0
+#CHECK: flags: 0x80000400
+#CHECK: reserved1: 0x00000000
+#CHECK: reserved2: 0x00000000
+#CHECK: reserved3: 0x00000000
+#CHECK: - sectname: __stubs
+#CHECK: segname: __TEXT
+#CHECK: - sectname: __stub_helper
+#CHECK: segname: __TEXT
+#CHECK: - sectname: __gcc_except_tab
+#CHECK: segname: __TEXT
+#CHECK: - sectname: __cstring
+#CHECK: segname: __TEXT
+#CHECK: - sectname: __unwind_info
+#CHECK: segname: __TEXT
+#CHECK: - cmd: LC_SEGMENT_64
+#CHECK: segname: __DATA
+#CHECK: Sections:
+#CHECK: - sectname: __got
+#CHECK: segname: __DATA
+#CHECK: - sectname: __nl_symbol_ptr
+#CHECK: segname: __DATA
+#CHECK: - sectname: __la_symbol_ptr
+#CHECK: segname: __DATA
Modified: llvm/trunk/tools/obj2yaml/macho2yaml.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/obj2yaml/macho2yaml.cpp?rev=269953&r1=269952&r2=269953&view=diff
==============================================================================
--- llvm/trunk/tools/obj2yaml/macho2yaml.cpp (original)
+++ llvm/trunk/tools/obj2yaml/macho2yaml.cpp Wed May 18 11:17:23 2016
@@ -13,6 +13,8 @@
#include "llvm/ObjectYAML/MachOYAML.h"
#include "llvm/Support/ErrorHandling.h"
+#include <string.h> // for memcpy
+
using namespace llvm;
class MachODumper {
@@ -32,6 +34,24 @@ public:
MachO::swapStruct(LC.Data.LCStruct##_data); \
break;
+template <typename SectionType>
+MachOYAML::Section constructSection(SectionType Sec) {
+ MachOYAML::Section TempSec;
+ memcpy(reinterpret_cast<void *>(&TempSec.sectname[0]), &Sec.sectname[0], 16);
+ memcpy(reinterpret_cast<void *>(&TempSec.segname[0]), &Sec.segname[0], 16);
+ TempSec.addr = Sec.addr;
+ TempSec.size = Sec.size;
+ TempSec.offset = Sec.offset;
+ TempSec.align = Sec.align;
+ TempSec.reloff = Sec.reloff;
+ TempSec.nreloc = Sec.nreloc;
+ TempSec.flags = Sec.flags;
+ TempSec.reserved1 = Sec.reserved1;
+ TempSec.reserved2 = Sec.reserved2;
+ TempSec.reserved3 = 0;
+ return TempSec;
+}
+
Expected<std::unique_ptr<MachOYAML::Object>> MachODumper::dump() {
auto Y = make_unique<MachOYAML::Object>();
Y->Header.magic = Obj.getHeader().magic;
@@ -54,6 +74,40 @@ Expected<std::unique_ptr<MachOYAML::Obje
break;
#include "llvm/Support/MachO.def"
}
+ if (LoadCmd.C.cmd == MachO::LC_SEGMENT) {
+ auto End = LoadCmd.Ptr + LoadCmd.C.cmdsize;
+ const MachO::section *Curr = reinterpret_cast<const MachO::section *>(
+ LoadCmd.Ptr + sizeof(MachO::segment_command));
+ for (; reinterpret_cast<const void *>(Curr) < End; Curr++) {
+ if (Obj.isLittleEndian() != sys::IsLittleEndianHost) {
+ MachO::section Sec;
+ memcpy((void *)&Sec, Curr, sizeof(MachO::section));
+ MachO::swapStruct(Sec);
+ LC.Sections.push_back(constructSection(Sec));
+ } else {
+ LC.Sections.push_back(constructSection(*Curr));
+ }
+ }
+ } else if (LoadCmd.C.cmd == MachO::LC_SEGMENT_64) {
+ auto End = LoadCmd.Ptr + LoadCmd.C.cmdsize;
+ const MachO::section_64 *Curr =
+ reinterpret_cast<const MachO::section_64 *>(
+ LoadCmd.Ptr + sizeof(MachO::segment_command_64));
+ for (; reinterpret_cast<const void *>(Curr) < End; Curr++) {
+ MachOYAML::Section TempSec;
+ if (Obj.isLittleEndian() != sys::IsLittleEndianHost) {
+ MachO::section_64 Sec;
+ memcpy((void *)&Sec, Curr, sizeof(MachO::section_64));
+ MachO::swapStruct(Sec);
+ LC.Sections.push_back(constructSection(Sec));
+ TempSec = constructSection(Sec);
+ } else {
+ TempSec = constructSection(*Curr);
+ }
+ TempSec.reserved3 = Curr->reserved3;
+ LC.Sections.push_back(TempSec);
+ }
+ }
Y->LoadCommands.push_back(std::move(LC));
}
Modified: llvm/trunk/tools/yaml2obj/yaml2macho.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2macho.cpp?rev=269953&r1=269952&r2=269953&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2macho.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2macho.cpp Wed May 18 11:17:23 2016
@@ -77,6 +77,23 @@ Error MachOWriter::writeHeader(raw_ostre
return Error::success();
}
+template <typename SectionType>
+SectionType constructSection(MachOYAML::Section Sec) {
+ SectionType TempSec;
+ memcpy(reinterpret_cast<void *>(&TempSec.sectname[0]), &Sec.sectname[0], 16);
+ memcpy(reinterpret_cast<void *>(&TempSec.segname[0]), &Sec.segname[0], 16);
+ TempSec.addr = Sec.addr;
+ TempSec.size = Sec.size;
+ TempSec.offset = Sec.offset;
+ TempSec.align = Sec.align;
+ TempSec.reloff = Sec.reloff;
+ TempSec.nreloc = Sec.nreloc;
+ TempSec.flags = Sec.flags;
+ TempSec.reserved1 = Sec.reserved1;
+ TempSec.reserved2 = Sec.reserved2;
+ return TempSec;
+}
+
Error MachOWriter::writeLoadCommands(raw_ostream &OS) {
for (auto &LC : Obj.LoadCommands) {
size_t BytesWritten = 0;
@@ -96,6 +113,21 @@ Error MachOWriter::writeLoadCommands(raw
#include "llvm/Support/MachO.def"
}
+ if(LC.Data.load_command_data.cmd == MachO::LC_SEGMENT) {
+ for(auto Sec : LC.Sections) {
+ auto TempSec = constructSection<MachO::section>(Sec);
+ OS.write(reinterpret_cast<const char *>(&(TempSec)), sizeof(MachO::section));
+ BytesWritten += sizeof(MachO::section);
+ }
+ } else if(LC.Data.load_command_data.cmd == MachO::LC_SEGMENT_64) {
+ for(auto Sec : LC.Sections) {
+ auto TempSec = constructSection<MachO::section_64>(Sec);
+ TempSec.reserved3 = Sec.reserved3;
+ OS.write(reinterpret_cast<const char *>(&(TempSec)), sizeof(MachO::section_64));
+ BytesWritten += sizeof(MachO::section_64);
+ }
+ }
+
auto BytesRemaining =
LC.Data.load_command_data.cmdsize - BytesWritten;
if (BytesRemaining > 0) {
More information about the llvm-commits
mailing list