[llvm] r271604 - [obj2yaml] [yaml2obj] Support for MachO nlist and string table
Chris Bieneman via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 2 15:54:07 PDT 2016
Author: cbieneman
Date: Thu Jun 2 17:54:06 2016
New Revision: 271604
URL: http://llvm.org/viewvc/llvm-project?rev=271604&view=rev
Log:
[obj2yaml] [yaml2obj] Support for MachO nlist and string table
This commit adds round tripping for MachO symbol data. Symbols are entries in the name list, that contain offsets into the string table which is at the end of the __LINKEDIT segment.
Added:
llvm/trunk/test/ObjectYAML/MachO/symtab.yaml
Modified:
llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h
llvm/trunk/lib/ObjectYAML/MachOYAML.cpp
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=271604&r1=271603&r2=271604&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h (original)
+++ llvm/trunk/include/llvm/ObjectYAML/MachOYAML.h Thu Jun 2 17:54:06 2016
@@ -57,6 +57,13 @@ struct LoadCommand {
uint64_t ZeroPadBytes;
};
+struct NListEntry {
+ uint32_t n_strx;
+ uint8_t n_type;
+ uint8_t n_sect;
+ uint16_t n_desc;
+ uint64_t n_value;
+};
struct RebaseOpcode {
MachO::RebaseOpcode Opcode;
uint8_t Imm;
@@ -91,6 +98,8 @@ struct LinkEditData {
std::vector<MachOYAML::BindOpcode> WeakBindOpcodes;
std::vector<MachOYAML::BindOpcode> LazyBindOpcodes;
MachOYAML::ExportEntry ExportTrie;
+ std::vector<NListEntry> NameList;
+ std::vector<StringRef> StringTable;
};
struct Object {
@@ -111,6 +120,8 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(int64_t)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::RebaseOpcode)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::BindOpcode)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::ExportEntry)
+LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::NListEntry)
+LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::StringRef)
namespace llvm {
namespace yaml {
@@ -147,6 +158,10 @@ template <> struct MappingTraits<MachOYA
static void mapping(IO &IO, MachOYAML::Section &Section);
};
+template <> struct MappingTraits<MachOYAML::NListEntry> {
+ static void mapping(IO &IO, MachOYAML::NListEntry &NListEntry);
+};
+
#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=271604&r1=271603&r2=271604&view=diff
==============================================================================
--- llvm/trunk/lib/ObjectYAML/MachOYAML.cpp (original)
+++ llvm/trunk/lib/ObjectYAML/MachOYAML.cpp Thu Jun 2 17:54:06 2016
@@ -104,6 +104,8 @@ void MappingTraits<MachOYAML::LinkEditDa
IO.mapOptional("WeakBindOpcodes", LinkEditData.WeakBindOpcodes);
IO.mapOptional("LazyBindOpcodes", LinkEditData.LazyBindOpcodes);
IO.mapOptional("ExportTrie", LinkEditData.ExportTrie);
+ IO.mapOptional("NameList", LinkEditData.NameList);
+ IO.mapOptional("StringTable", LinkEditData.StringTable);
}
void MappingTraits<MachOYAML::RebaseOpcode>::mapping(
@@ -134,6 +136,15 @@ void MappingTraits<MachOYAML::ExportEntr
IO.mapOptional("Children", ExportEntry.Children);
}
+void MappingTraits<MachOYAML::NListEntry>::mapping(
+ IO &IO, MachOYAML::NListEntry &NListEntry) {
+ IO.mapRequired("n_strx", NListEntry.n_strx);
+ IO.mapRequired("n_type", NListEntry.n_type);
+ IO.mapRequired("n_sect", NListEntry.n_sect);
+ IO.mapRequired("n_desc", NListEntry.n_desc);
+ IO.mapRequired("n_value", NListEntry.n_value);
+}
+
template <typename StructType>
void mapLoadCommandData(IO &IO, MachOYAML::LoadCommand &LoadCommand) {}
Added: llvm/trunk/test/ObjectYAML/MachO/symtab.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/symtab.yaml?rev=271604&view=auto
==============================================================================
--- llvm/trunk/test/ObjectYAML/MachO/symtab.yaml (added)
+++ llvm/trunk/test/ObjectYAML/MachO/symtab.yaml Thu Jun 2 17:54:06 2016
@@ -0,0 +1,511 @@
+# 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:
+ - 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:
+ - 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
+ PayloadString: /usr/lib/dyld
+ ZeroPadBytes: 7
+ - cmd: LC_UUID
+ 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
+ PayloadString: '/usr/lib/libc++.1.dylib'
+ ZeroPadBytes: 1
+ - cmd: LC_LOAD_DYLIB
+ cmdsize: 56
+ dylib:
+ name: 24
+ timestamp: 2
+ current_version: 80349697
+ compatibility_version: 65536
+ PayloadString: /usr/lib/libSystem.B.dylib
+ ZeroPadBytes: 6
+ - cmd: LC_FUNCTION_STARTS
+ cmdsize: 16
+ dataoff: 13064
+ datasize: 16
+ - cmd: LC_DATA_IN_CODE
+ cmdsize: 16
+ dataoff: 13080
+ datasize: 0
+LinkEditData:
+ NameList:
+ - n_strx: 2
+ n_type: 30
+ n_sect: 1
+ n_desc: 128
+ n_value: 4294971808
+ - n_strx: 69
+ n_type: 30
+ n_sect: 1
+ n_desc: 128
+ n_value: 4294971888
+ - n_strx: 166
+ n_type: 30
+ n_sect: 1
+ n_desc: 128
+ n_value: 4294973024
+ - n_strx: 204
+ n_type: 30
+ n_sect: 1
+ n_desc: 128
+ n_value: 4294973056
+ - n_strx: 320
+ n_type: 30
+ n_sect: 1
+ n_desc: 128
+ n_value: 4294974784
+ - n_strx: 344
+ n_type: 30
+ n_sect: 1
+ n_desc: 128
+ n_value: 4294974800
+ - n_strx: 387
+ n_type: 30
+ n_sect: 1
+ n_desc: 128
+ n_value: 4294974832
+ - n_strx: 420
+ n_type: 14
+ n_sect: 4
+ n_desc: 0
+ n_value: 4294975104
+ - n_strx: 438
+ n_type: 14
+ n_sect: 4
+ n_desc: 0
+ n_value: 4294975280
+ - n_strx: 456
+ n_type: 15
+ n_sect: 1
+ n_desc: 16
+ n_value: 4294967296
+ - n_strx: 476
+ n_type: 15
+ n_sect: 1
+ n_desc: 0
+ n_value: 4294971744
+ - n_strx: 482
+ n_type: 1
+ n_sect: 0
+ n_desc: 512
+ n_value: 0
+ - n_strx: 498
+ n_type: 1
+ n_sect: 0
+ n_desc: 256
+ n_value: 0
+ - n_strx: 537
+ n_type: 1
+ n_sect: 0
+ n_desc: 256
+ n_value: 0
+ - n_strx: 567
+ n_type: 1
+ n_sect: 0
+ n_desc: 256
+ n_value: 0
+ - n_strx: 642
+ n_type: 1
+ n_sect: 0
+ n_desc: 256
+ n_value: 0
+ - n_strx: 711
+ n_type: 1
+ n_sect: 0
+ n_desc: 256
+ n_value: 0
+ - n_strx: 774
+ n_type: 1
+ n_sect: 0
+ n_desc: 256
+ n_value: 0
+ - n_strx: 834
+ n_type: 1
+ n_sect: 0
+ n_desc: 256
+ n_value: 0
+ - n_strx: 851
+ n_type: 1
+ n_sect: 0
+ n_desc: 256
+ n_value: 0
+ - n_strx: 875
+ n_type: 1
+ n_sect: 0
+ n_desc: 256
+ n_value: 0
+ - n_strx: 897
+ n_type: 1
+ n_sect: 0
+ n_desc: 256
+ n_value: 0
+ - n_strx: 954
+ n_type: 1
+ n_sect: 0
+ n_desc: 256
+ n_value: 0
+ - n_strx: 982
+ n_type: 1
+ n_sect: 0
+ n_desc: 256
+ n_value: 0
+ - n_strx: 999
+ n_type: 1
+ n_sect: 0
+ n_desc: 256
+ n_value: 0
+ - n_strx: 1018
+ n_type: 1
+ n_sect: 0
+ n_desc: 256
+ n_value: 0
+ - n_strx: 1035
+ n_type: 1
+ n_sect: 0
+ n_desc: 256
+ n_value: 0
+ - n_strx: 1057
+ n_type: 1
+ n_sect: 0
+ n_desc: 512
+ n_value: 0
+ - n_strx: 1065
+ n_type: 1
+ n_sect: 0
+ n_desc: 512
+ n_value: 0
+ - n_strx: 1073
+ n_type: 1
+ n_sect: 0
+ n_desc: 512
+ n_value: 0
+ StringTable:
+ - ' '
+ - __ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc
+ - __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
+ - __ZNSt3__111char_traitsIcE6lengthEPKc
+ - __ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_
+ - ___clang_call_terminate
+ - __ZNSt3__111char_traitsIcE11eq_int_typeEii
+ - __ZNSt3__111char_traitsIcE3eofEv
+ - GCC_except_table2
+ - GCC_except_table4
+ - __mh_execute_header
+ - _main
+ - __Unwind_Resume
+ - __ZNKSt3__16locale9use_facetERNS0_2idE
+ - __ZNKSt3__18ios_base6getlocEv
+ - __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc
+ - __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev
+ - __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3_
+ - __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev
+ - __ZNSt3__14coutE
+ - __ZNSt3__15ctypeIcE2idE
+ - __ZNSt3__16localeD1Ev
+ - __ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv
+ - __ZNSt3__18ios_base5clearEj
+ - __ZSt9terminatev
+ - ___cxa_begin_catch
+ - ___cxa_end_catch
+ - ___gxx_personality_v0
+ - _memset
+ - _strlen
+ - dyld_stub_binder
+...
+
+#CHECK: NameList:
+#CHECK: - n_strx: 2
+#CHECK: n_type: 30
+#CHECK: n_sect: 1
+#CHECK: n_desc: 128
+#CHECK: n_value: 4294971808
+#CHECK: - n_strx: 69
+#CHECK: n_type: 30
+#CHECK: n_sect: 1
+#CHECK: n_desc: 128
+#CHECK: n_value: 4294971888
+#CHECK: - n_strx: 166
+#CHECK: n_type: 30
+#CHECK: n_sect: 1
+#CHECK: n_desc: 128
+#CHECK: n_value: 4294973024
+#CHECK: - n_strx: 204
+#CHECK: n_type: 30
+#CHECK: n_sect: 1
+#CHECK: n_desc: 128
+#CHECK: n_value: 4294973056
+#CHECK: - n_strx: 320
+#CHECK: n_type: 30
+#CHECK: n_sect: 1
+#CHECK: n_desc: 128
+#CHECK: n_value: 4294974784
+#CHECK: - n_strx: 344
+#CHECK: n_type: 30
+#CHECK: n_sect: 1
+#CHECK: n_desc: 128
+#CHECK: n_value: 4294974800
+#CHECK: - n_strx: 387
+#CHECK: n_type: 30
+#CHECK: n_sect: 1
+#CHECK: n_desc: 128
+#CHECK: n_value: 4294974832
+#CHECK: - n_strx: 420
+#CHECK: n_type: 14
+#CHECK: n_sect: 4
+#CHECK: n_desc: 0
+#CHECK: n_value: 4294975104
+#CHECK: - n_strx: 438
+#CHECK: n_type: 14
+#CHECK: n_sect: 4
+#CHECK: n_desc: 0
+#CHECK: n_value: 4294975280
+#CHECK: - n_strx: 456
+#CHECK: n_type: 15
+#CHECK: n_sect: 1
+#CHECK: n_desc: 16
+#CHECK: n_value: 4294967296
+#CHECK: - n_strx: 476
+#CHECK: n_type: 15
+#CHECK: n_sect: 1
+#CHECK: n_desc: 0
+#CHECK: n_value: 4294971744
+#CHECK: - n_strx: 482
+#CHECK: n_type: 1
+#CHECK: n_sect: 0
+#CHECK: n_desc: 512
+#CHECK: n_value: 0
+#CHECK: - n_strx: 498
+#CHECK: n_type: 1
+#CHECK: n_sect: 0
+#CHECK: n_desc: 256
+#CHECK: n_value: 0
+#CHECK: - n_strx: 537
+#CHECK: n_type: 1
+#CHECK: n_sect: 0
+#CHECK: n_desc: 256
+#CHECK: n_value: 0
+#CHECK: - n_strx: 567
+#CHECK: n_type: 1
+#CHECK: n_sect: 0
+#CHECK: n_desc: 256
+#CHECK: n_value: 0
+#CHECK: - n_strx: 642
+#CHECK: n_type: 1
+#CHECK: n_sect: 0
+#CHECK: n_desc: 256
+#CHECK: n_value: 0
+#CHECK: - n_strx: 711
+#CHECK: n_type: 1
+#CHECK: n_sect: 0
+#CHECK: n_desc: 256
+#CHECK: n_value: 0
+#CHECK: - n_strx: 774
+#CHECK: n_type: 1
+#CHECK: n_sect: 0
+#CHECK: n_desc: 256
+#CHECK: n_value: 0
+#CHECK: - n_strx: 834
+#CHECK: n_type: 1
+#CHECK: n_sect: 0
+#CHECK: n_desc: 256
+#CHECK: n_value: 0
+#CHECK: - n_strx: 851
+#CHECK: n_type: 1
+#CHECK: n_sect: 0
+#CHECK: n_desc: 256
+#CHECK: n_value: 0
+#CHECK: - n_strx: 875
+#CHECK: n_type: 1
+#CHECK: n_sect: 0
+#CHECK: n_desc: 256
+#CHECK: n_value: 0
+#CHECK: - n_strx: 897
+#CHECK: n_type: 1
+#CHECK: n_sect: 0
+#CHECK: n_desc: 256
+#CHECK: n_value: 0
+#CHECK: - n_strx: 954
+#CHECK: n_type: 1
+#CHECK: n_sect: 0
+#CHECK: n_desc: 256
+#CHECK: n_value: 0
+#CHECK: - n_strx: 982
+#CHECK: n_type: 1
+#CHECK: n_sect: 0
+#CHECK: n_desc: 256
+#CHECK: n_value: 0
+#CHECK: - n_strx: 999
+#CHECK: n_type: 1
+#CHECK: n_sect: 0
+#CHECK: n_desc: 256
+#CHECK: n_value: 0
+#CHECK: - n_strx: 1018
+#CHECK: n_type: 1
+#CHECK: n_sect: 0
+#CHECK: n_desc: 256
+#CHECK: n_value: 0
+#CHECK: - n_strx: 1035
+#CHECK: n_type: 1
+#CHECK: n_sect: 0
+#CHECK: n_desc: 256
+#CHECK: n_value: 0
+#CHECK: - n_strx: 1057
+#CHECK: n_type: 1
+#CHECK: n_sect: 0
+#CHECK: n_desc: 512
+#CHECK: n_value: 0
+#CHECK: - n_strx: 1065
+#CHECK: n_type: 1
+#CHECK: n_sect: 0
+#CHECK: n_desc: 512
+#CHECK: n_value: 0
+#CHECK: - n_strx: 1073
+#CHECK: n_type: 1
+#CHECK: n_sect: 0
+#CHECK: n_desc: 512
+#CHECK: n_value: 0
+#CHECK: StringTable:
+#CHECK: - ' '
+#CHECK: - __ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc
+#CHECK: - __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
+#CHECK: - __ZNSt3__111char_traitsIcE6lengthEPKc
+#CHECK: - __ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_
+#CHECK: - ___clang_call_terminate
+#CHECK: - __ZNSt3__111char_traitsIcE11eq_int_typeEii
+#CHECK: - __ZNSt3__111char_traitsIcE3eofEv
+#CHECK: - GCC_except_table2
+#CHECK: - GCC_except_table4
+#CHECK: - __mh_execute_header
+#CHECK: - _main
+#CHECK: - __Unwind_Resume
+#CHECK: - __ZNKSt3__16locale9use_facetERNS0_2idE
+#CHECK: - __ZNKSt3__18ios_base6getlocEv
+#CHECK: - __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc
+#CHECK: - __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev
+#CHECK: - __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3_
+#CHECK: - __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev
+#CHECK: - __ZNSt3__14coutE
+#CHECK: - __ZNSt3__15ctypeIcE2idE
+#CHECK: - __ZNSt3__16localeD1Ev
+#CHECK: - __ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv
+#CHECK: - __ZNSt3__18ios_base5clearEj
+#CHECK: - __ZSt9terminatev
+#CHECK: - ___cxa_begin_catch
+#CHECK: - ___cxa_end_catch
+#CHECK: - ___gxx_personality_v0
+#CHECK: - _memset
+#CHECK: - _strlen
+#CHECK: - dyld_stub_binder
Modified: llvm/trunk/tools/obj2yaml/macho2yaml.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/obj2yaml/macho2yaml.cpp?rev=271604&r1=271603&r2=271604&view=diff
==============================================================================
--- llvm/trunk/tools/obj2yaml/macho2yaml.cpp (original)
+++ llvm/trunk/tools/obj2yaml/macho2yaml.cpp Thu Jun 2 17:54:06 2016
@@ -33,6 +33,7 @@ class MachODumper {
void dumpBindOpcodes(std::vector<MachOYAML::BindOpcode> &BindOpcodes,
ArrayRef<uint8_t> OpcodeBuffer, bool Lazy = false);
void dumpExportTrie(std::unique_ptr<MachOYAML::Object> &Y);
+ void dumpSymbols(std::unique_ptr<MachOYAML::Object> &Y);
public:
MachODumper(const object::MachOObjectFile &O) : Obj(O) {}
@@ -210,6 +211,7 @@ void MachODumper::dumpLinkEdit(std::uniq
dumpBindOpcodes(Y->LinkEdit.LazyBindOpcodes, Obj.getDyldInfoLazyBindOpcodes(),
true);
dumpExportTrie(Y);
+ dumpSymbols(Y);
}
void MachODumper::dumpRebaseOpcodes(std::unique_ptr<MachOYAML::Object> &Y) {
@@ -424,6 +426,41 @@ void MachODumper::dumpExportTrie(std::un
processExportNode(ExportsTrie.begin(), ExportsTrie.end(), LEData.ExportTrie);
}
+template <typename nlist_t>
+MachOYAML::NListEntry constructNameList(const nlist_t &nlist) {
+ MachOYAML::NListEntry NL;
+ NL.n_strx = nlist.n_strx;
+ NL.n_type = nlist.n_type;
+ NL.n_sect = nlist.n_sect;
+ NL.n_desc = nlist.n_desc;
+ NL.n_value = nlist.n_value;
+ return NL;
+}
+
+void MachODumper::dumpSymbols(std::unique_ptr<MachOYAML::Object> &Y) {
+ MachOYAML::LinkEditData &LEData = Y->LinkEdit;
+
+ for (auto Symbol : Obj.symbols()) {
+ MachOYAML::NListEntry NLE =
+ Obj.is64Bit() ? constructNameList<MachO::nlist_64>(
+ *reinterpret_cast<const MachO::nlist_64 *>(
+ Symbol.getRawDataRefImpl().p))
+ : constructNameList<MachO::nlist>(
+ *reinterpret_cast<const MachO::nlist *>(
+ Symbol.getRawDataRefImpl().p));
+ LEData.NameList.push_back(NLE);
+ }
+
+ StringRef RemainingTable = Obj.getStringTableData();
+ while (RemainingTable.size() > 0) {
+ auto SymbolPair = RemainingTable.split('\0');
+ RemainingTable = SymbolPair.second;
+ if (SymbolPair.first.empty())
+ break;
+ LEData.StringTable.push_back(SymbolPair.first);
+ }
+}
+
Error macho2yaml(raw_ostream &Out, const object::MachOObjectFile &Obj) {
MachODumper Dumper(Obj);
Expected<std::unique_ptr<MachOYAML::Object>> YAML = Dumper.dump();
Modified: llvm/trunk/tools/yaml2obj/yaml2macho.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2macho.cpp?rev=271604&r1=271603&r2=271604&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2macho.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2macho.cpp Thu Jun 2 17:54:06 2016
@@ -165,7 +165,7 @@ size_t writeLoadCommandData<MachO::dylin
template <>
size_t writeLoadCommandData<MachO::rpath_command>(MachOYAML::LoadCommand &LC,
- raw_ostream &OS) {
+ raw_ostream &OS) {
return writePayloadString(LC, OS);
}
@@ -295,23 +295,23 @@ void MachOWriter::writeBindOpcodes(
}
}
-void MachOWriter::dumpExportEntry(raw_ostream &OS, MachOYAML::ExportEntry &Entry) {
+void MachOWriter::dumpExportEntry(raw_ostream &OS,
+ MachOYAML::ExportEntry &Entry) {
encodeSLEB128(Entry.TerminalSize, OS);
if (Entry.TerminalSize > 0) {
encodeSLEB128(Entry.Flags, OS);
- if ( Entry.Flags & MachO::EXPORT_SYMBOL_FLAGS_REEXPORT ) {
+ if (Entry.Flags & MachO::EXPORT_SYMBOL_FLAGS_REEXPORT) {
encodeSLEB128(Entry.Other, OS);
OS << Entry.ImportName;
OS.write('\0');
- }
- else {
+ } else {
encodeSLEB128(Entry.Address, OS);
if (Entry.Flags & MachO::EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER)
encodeSLEB128(Entry.Other, OS);
}
}
OS.write(static_cast<uint8_t>(Entry.Children.size()));
- for (auto EE : Entry.Children){
+ for (auto EE : Entry.Children) {
OS << EE.Name;
OS.write('\0');
encodeSLEB128(EE.NodeOffset, OS);
@@ -325,6 +325,17 @@ Error MachOWriter::writeExportTrie(raw_o
return Error::success();
}
+template <typename NListType>
+void writeNListEntry(MachOYAML::NListEntry &NLE, raw_ostream &OS) {
+ NListType ListEntry;
+ ListEntry.n_strx = NLE.n_strx;
+ ListEntry.n_type = NLE.n_type;
+ ListEntry.n_sect = NLE.n_sect;
+ ListEntry.n_desc = NLE.n_desc;
+ ListEntry.n_value = NLE.n_value;
+ OS.write(reinterpret_cast<const char *>(&ListEntry), sizeof(NListType));
+}
+
Error MachOWriter::writeLinkEditData(raw_ostream &OS) {
MachOYAML::LinkEditData &LinkEdit = Obj.LinkEdit;
MachO::dyld_info_command *DyldInfoOnlyCmd = 0;
@@ -357,9 +368,27 @@ Error MachOWriter::writeLinkEditData(raw
LinkEdit.LazyBindOpcodes);
ZeroToOffset(OS, DyldInfoOnlyCmd->export_off);
- if(auto Err = writeExportTrie(OS))
+ if (auto Err = writeExportTrie(OS))
return Err;
+ ZeroToOffset(OS, SymtabCmd->symoff);
+
+ for (auto NLE : LinkEdit.NameList) {
+ if (is64Bit)
+ writeNListEntry<MachO::nlist_64>(NLE, OS);
+ else
+ writeNListEntry<MachO::nlist>(NLE, OS);
+ }
+
+ auto currOffset = OS.tell() - fileStart;
+ if (currOffset < SymtabCmd->stroff)
+ Fill(OS, SymtabCmd->stroff - currOffset, 0xDEADBEEFu);
+
+ for (auto Str : LinkEdit.StringTable) {
+ OS.write(Str.data(), Str.size());
+ OS.write('\0');
+ }
+
// Fill to the end of the string table
ZeroToOffset(OS, SymtabCmd->stroff + SymtabCmd->strsize);
More information about the llvm-commits
mailing list