summaryrefslogtreecommitdiffstats
path: root/llvm/tools/yaml2obj/yaml2macho.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/yaml2obj/yaml2macho.cpp')
-rw-r--r--llvm/tools/yaml2obj/yaml2macho.cpp43
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);
OpenPOWER on IntegriCloud