diff options
| author | Chris Bieneman <beanz@apple.com> | 2016-06-02 22:54:06 +0000 |
|---|---|---|
| committer | Chris Bieneman <beanz@apple.com> | 2016-06-02 22:54:06 +0000 |
| commit | 07bb3c84a2d1eff7f3577cce023dca517aa7c3ed (patch) | |
| tree | bfc2fb2bb090b8a0c9f2a6869fddbf2abe4c31bf /llvm/tools/yaml2obj | |
| parent | 172bf6edd13aa0c8e117db4d50f295c74b7dc4fd (diff) | |
| download | bcm5719-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/tools/yaml2obj')
| -rw-r--r-- | llvm/tools/yaml2obj/yaml2macho.cpp | 43 |
1 files changed, 36 insertions, 7 deletions
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); |

