diff --git a/llvm/include/llvm/ObjectYAML/MachOYAML.h b/llvm/include/llvm/ObjectYAML/MachOYAML.h --- a/llvm/include/llvm/ObjectYAML/MachOYAML.h +++ b/llvm/include/llvm/ObjectYAML/MachOYAML.h @@ -121,6 +121,7 @@ MachOYAML::ExportEntry ExportTrie; std::vector NameList; std::vector StringTable; + std::vector IndirectSymbols; bool isEmpty() const; }; diff --git a/llvm/lib/ObjectYAML/MachOEmitter.cpp b/llvm/lib/ObjectYAML/MachOEmitter.cpp --- a/llvm/lib/ObjectYAML/MachOEmitter.cpp +++ b/llvm/lib/ObjectYAML/MachOEmitter.cpp @@ -54,6 +54,7 @@ void writeNameList(raw_ostream &OS); void writeStringTable(raw_ostream &OS); void writeExportTrie(raw_ostream &OS); + void writeDynamicSymbolTable(raw_ostream &OS); void dumpExportEntry(raw_ostream &OS, MachOYAML::ExportEntry &Entry); void ZeroToOffset(raw_ostream &OS, size_t offset); @@ -482,6 +483,7 @@ MachO::dyld_info_command *DyldInfoOnlyCmd = 0; MachO::symtab_command *SymtabCmd = 0; + MachO::dysymtab_command *DSymtabCmd = 0; for (auto &LC : Obj.LoadCommands) { switch (LC.Data.load_command_data.cmd) { case MachO::LC_SYMTAB: @@ -504,6 +506,11 @@ WriteQueue.push_back(std::make_pair(DyldInfoOnlyCmd->export_off, &MachOWriter::writeExportTrie)); break; + case MachO::LC_DYSYMTAB: + DSymtabCmd = &LC.Data.dysymtab_command_data; + WriteQueue.push_back(std::make_pair( + DSymtabCmd->indirectsymoff, &MachOWriter::writeDynamicSymbolTable)); + break; } } @@ -556,6 +563,12 @@ } } +void MachOWriter::writeDynamicSymbolTable(raw_ostream &OS) { + for (auto Data : Obj.LinkEdit.IndirectSymbols) + OS.write(reinterpret_cast(&Data), + sizeof(yaml::Hex32::BaseType)); +} + class UniversalWriter { public: UniversalWriter(yaml::YamlObjectFile &ObjectFile) diff --git a/llvm/lib/ObjectYAML/MachOYAML.cpp b/llvm/lib/ObjectYAML/MachOYAML.cpp --- a/llvm/lib/ObjectYAML/MachOYAML.cpp +++ b/llvm/lib/ObjectYAML/MachOYAML.cpp @@ -164,6 +164,7 @@ IO.mapOptional("ExportTrie", LinkEditData.ExportTrie); IO.mapOptional("NameList", LinkEditData.NameList); IO.mapOptional("StringTable", LinkEditData.StringTable); + IO.mapOptional("IndirectSymbols", LinkEditData.IndirectSymbols); } void MappingTraits::mapping( diff --git a/llvm/test/ObjectYAML/MachO/dsymtab.yaml b/llvm/test/ObjectYAML/MachO/dsymtab.yaml new file mode 100644 --- /dev/null +++ b/llvm/test/ObjectYAML/MachO/dsymtab.yaml @@ -0,0 +1,259 @@ +# RUN: yaml2obj %s | obj2yaml | FileCheck %s + +--- !mach-o +FileHeader: + magic: 0xFEEDFACF + cputype: 0x1000007 + cpusubtype: 0x3 + filetype: 0x2 + ncmds: 16 + sizeofcmds: 1368 + flags: 0x200085 + reserved: 0x0 +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: 472 + segname: __TEXT + vmaddr: 4294967296 + vmsize: 16384 + fileoff: 0 + filesize: 16384 + maxprot: 5 + initprot: 5 + nsects: 5 + flags: 0 + Sections: + - sectname: __text + segname: __TEXT + addr: 0x100003F60 + size: 37 + offset: 0x3F60 + align: 4 + reloff: 0x0 + nreloc: 0 + flags: 0x80000400 + reserved1: 0x0 + reserved2: 0x0 + reserved3: 0x0 + content: 554889E54883EC10C745FC00000000488D3D30000000B000E80900000031C04883C4105DC3 + - sectname: __stubs + segname: __TEXT + addr: 0x100003F86 + size: 6 + offset: 0x3F86 + align: 1 + reloff: 0x0 + nreloc: 0 + flags: 0x80000408 + reserved1: 0x0 + reserved2: 0x6 + reserved3: 0x0 + content: FF2574400000 + - sectname: __stub_helper + segname: __TEXT + addr: 0x100003F8C + size: 26 + offset: 0x3F8C + align: 2 + reloff: 0x0 + nreloc: 0 + flags: 0x80000400 + reserved1: 0x0 + reserved2: 0x0 + reserved3: 0x0 + content: 4C8D1D754000004153FF2565000000906800000000E9E6FFFFFF + - sectname: __cstring + segname: __TEXT + addr: 0x100003FA6 + size: 13 + offset: 0x3FA6 + align: 0 + reloff: 0x0 + nreloc: 0 + flags: 0x2 + reserved1: 0x0 + reserved2: 0x0 + reserved3: 0x0 + content: 68656C6C6F20776F726C640A00 + - sectname: __unwind_info + segname: __TEXT + addr: 0x100003FB4 + size: 72 + offset: 0x3FB4 + align: 2 + reloff: 0x0 + nreloc: 0 + flags: 0x0 + reserved1: 0x0 + reserved2: 0x0 + reserved3: 0x0 + content: 010000001C000000000000001C000000000000001C00000002000000603F00003400000034000000863F00000000000034000000030000000C000100100001000000000000000001 + - cmd: LC_SEGMENT_64 + cmdsize: 152 + segname: __DATA_CONST + vmaddr: 4294983680 + vmsize: 16384 + fileoff: 16384 + filesize: 16384 + maxprot: 3 + initprot: 3 + nsects: 1 + flags: 16 + Sections: + - sectname: __got + segname: __DATA_CONST + addr: 0x100004000 + size: 8 + offset: 0x4000 + align: 3 + reloff: 0x0 + nreloc: 0 + flags: 0x6 + reserved1: 0x1 + reserved2: 0x0 + reserved3: 0x0 + content: '0000000000000000' + - cmd: LC_SEGMENT_64 + cmdsize: 232 + segname: __DATA + vmaddr: 4295000064 + vmsize: 16384 + fileoff: 32768 + filesize: 16384 + maxprot: 3 + initprot: 3 + nsects: 2 + flags: 0 + Sections: + - sectname: __la_symbol_ptr + segname: __DATA + addr: 0x100008000 + size: 8 + offset: 0x8000 + align: 3 + reloff: 0x0 + nreloc: 0 + flags: 0x7 + reserved1: 0x2 + reserved2: 0x0 + reserved3: 0x0 + content: 9C3F000001000000 + - sectname: __data + segname: __DATA + addr: 0x100008008 + size: 8 + offset: 0x8008 + align: 3 + reloff: 0x0 + nreloc: 0 + flags: 0x0 + reserved1: 0x0 + reserved2: 0x0 + reserved3: 0x0 + content: '0000000000000000' + - cmd: LC_SEGMENT_64 + cmdsize: 72 + segname: __LINKEDIT + vmaddr: 4295016448 + vmsize: 16384 + fileoff: 49152 + filesize: 272 + maxprot: 1 + initprot: 1 + nsects: 0 + flags: 0 + - cmd: LC_DYLD_INFO_ONLY + cmdsize: 48 + rebase_off: 49152 + rebase_size: 8 + bind_off: 49160 + bind_size: 24 + weak_bind_off: 0 + weak_bind_size: 0 + lazy_bind_off: 49184 + lazy_bind_size: 16 + export_off: 49200 + export_size: 48 + - cmd: LC_SYMTAB + cmdsize: 24 + symoff: 49256 + nsyms: 5 + stroff: 49352 + strsize: 72 + - cmd: LC_DYSYMTAB + cmdsize: 80 + ilocalsym: 0 + nlocalsym: 1 + iextdefsym: 1 + nextdefsym: 2 + iundefsym: 3 + nundefsym: 2 + tocoff: 0 + ntoc: 0 + modtaboff: 0 + nmodtab: 0 + extrefsymoff: 0 + nextrefsyms: 0 + indirectsymoff: 49336 + nindirectsyms: 3 + extreloff: 0 + nextrel: 0 + locreloff: 0 + nlocrel: 0 + - cmd: LC_LOAD_DYLINKER + cmdsize: 32 + name: 12 + Content: '/usr/lib/dyld' + ZeroPadBytes: 7 + - cmd: LC_UUID + cmdsize: 24 + uuid: FF5FAB50-C79A-3B66-AD3A-DE2F26398050 + - cmd: LC_BUILD_VERSION + cmdsize: 32 + platform: 1 + minos: 720896 + sdk: 721664 + ntools: 1 + Tools: + - tool: 3 + version: 46596096 + - cmd: LC_SOURCE_VERSION + cmdsize: 16 + version: 0 + - cmd: LC_MAIN + cmdsize: 24 + entryoff: 16224 + stacksize: 0 + - cmd: LC_LOAD_DYLIB + cmdsize: 56 + dylib: + name: 24 + timestamp: 2 + current_version: 84698117 + compatibility_version: 65536 + Content: '/usr/lib/libSystem.B.dylib' + ZeroPadBytes: 6 + - cmd: LC_FUNCTION_STARTS + cmdsize: 16 + dataoff: 49248 + datasize: 8 + - cmd: LC_DATA_IN_CODE + cmdsize: 16 + dataoff: 49256 + datasize: 0 +LinkEditData: + IndirectSymbols: [ 0x3, 0x4, 0x3 ] +... + +#CHECK: IndirectSymbols: [ 0x3, 0x4, 0x3 ] diff --git a/llvm/tools/obj2yaml/macho2yaml.cpp b/llvm/tools/obj2yaml/macho2yaml.cpp --- a/llvm/tools/obj2yaml/macho2yaml.cpp +++ b/llvm/tools/obj2yaml/macho2yaml.cpp @@ -38,6 +38,7 @@ ArrayRef OpcodeBuffer, bool Lazy = false); void dumpExportTrie(std::unique_ptr &Y); void dumpSymbols(std::unique_ptr &Y); + void dumpIndirectSymbols(std::unique_ptr &Y); template Expected constructSectionCommon(SectionType Sec, @@ -351,6 +352,7 @@ true); dumpExportTrie(Y); dumpSymbols(Y); + dumpIndirectSymbols(Y); } void MachODumper::dumpRebaseOpcodes(std::unique_ptr &Y) { @@ -599,6 +601,14 @@ } } +void MachODumper::dumpIndirectSymbols(std::unique_ptr &Y) { + MachOYAML::LinkEditData &LEData = Y->LinkEdit; + + MachO::dysymtab_command DLC = Obj.getDysymtabLoadCommand(); + for (unsigned i = 0; i < DLC.nindirectsyms; ++i) + LEData.IndirectSymbols.push_back(Obj.getIndirectSymbolTableEntry(DLC, i)); +} + Error macho2yaml(raw_ostream &Out, const object::MachOObjectFile &Obj, unsigned RawSegments) { std::unique_ptr DCtx = DWARFContext::create(Obj);