diff options
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); |

