summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorChris Bieneman <beanz@apple.com>2016-06-02 22:54:06 +0000
committerChris Bieneman <beanz@apple.com>2016-06-02 22:54:06 +0000
commit07bb3c84a2d1eff7f3577cce023dca517aa7c3ed (patch)
treebfc2fb2bb090b8a0c9f2a6869fddbf2abe4c31bf /llvm
parent172bf6edd13aa0c8e117db4d50f295c74b7dc4fd (diff)
downloadbcm5719-llvm-07bb3c84a2d1eff7f3577cce023dca517aa7c3ed.tar.gz
bcm5719-llvm-07bb3c84a2d1eff7f3577cce023dca517aa7c3ed.zip
[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. llvm-svn: 271604
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/ObjectYAML/MachOYAML.h15
-rw-r--r--llvm/lib/ObjectYAML/MachOYAML.cpp11
-rw-r--r--llvm/test/ObjectYAML/MachO/symtab.yaml511
-rw-r--r--llvm/tools/obj2yaml/macho2yaml.cpp37
-rw-r--r--llvm/tools/yaml2obj/yaml2macho.cpp43
5 files changed, 610 insertions, 7 deletions
diff --git a/llvm/include/llvm/ObjectYAML/MachOYAML.h b/llvm/include/llvm/ObjectYAML/MachOYAML.h
index ee11055b972..dee1bec3af3 100644
--- a/llvm/include/llvm/ObjectYAML/MachOYAML.h
+++ b/llvm/include/llvm/ObjectYAML/MachOYAML.h
@@ -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<MachOYAML::Section> {
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);
diff --git a/llvm/lib/ObjectYAML/MachOYAML.cpp b/llvm/lib/ObjectYAML/MachOYAML.cpp
index 6fe137215cf..b4e808552df 100644
--- a/llvm/lib/ObjectYAML/MachOYAML.cpp
+++ b/llvm/lib/ObjectYAML/MachOYAML.cpp
@@ -104,6 +104,8 @@ void MappingTraits<MachOYAML::LinkEditData>::mapping(
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::ExportEntry>::mapping(
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) {}
diff --git a/llvm/test/ObjectYAML/MachO/symtab.yaml b/llvm/test/ObjectYAML/MachO/symtab.yaml
new file mode 100644
index 00000000000..7472d4462d3
--- /dev/null
+++ b/llvm/test/ObjectYAML/MachO/symtab.yaml
@@ -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
diff --git a/llvm/tools/obj2yaml/macho2yaml.cpp b/llvm/tools/obj2yaml/macho2yaml.cpp
index be584f2ffe7..24bd6a60da4 100644
--- a/llvm/tools/obj2yaml/macho2yaml.cpp
+++ b/llvm/tools/obj2yaml/macho2yaml.cpp
@@ -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::unique_ptr<MachOYAML::Object> &Y) {
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::unique_ptr<MachOYAML::Object> &Y) {
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();
diff --git a/llvm/tools/yaml2obj/yaml2macho.cpp b/llvm/tools/yaml2obj/yaml2macho.cpp
index b825c9a3494..d65aabc5c86 100644
--- a/llvm/tools/yaml2obj/yaml2macho.cpp
+++ b/llvm/tools/yaml2obj/yaml2macho.cpp
@@ -165,7 +165,7 @@ size_t writeLoadCommandData<MachO::dylinker_command>(MachOYAML::LoadCommand &LC,
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_ostream &OS) {
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_ostream &OS) {
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);
OpenPOWER on IntegriCloud