uint64_t StringEntrySize =
sizeof(StringEntry) * OffloadingData.StringData.size();
+ // Make sure the image we're wrapping around is aligned as well.
+ uint64_t BinaryDataSize = alignTo(sizeof(Header) + sizeof(Entry) +
+ StringEntrySize + StrTab.getSize(),
+ getAlignment());
+
// Create the header and fill in the offsets. The entry will be directly
// placed after the header in memory. Align the size to the alignment of the
// header so this can be placed contiguously in a single section.
Header TheHeader;
- TheHeader.Size =
- alignTo(sizeof(Header) + sizeof(Entry) + StringEntrySize +
- OffloadingData.Image.getBufferSize() + StrTab.getSize(),
- getAlignment());
+ TheHeader.Size = alignTo(
+ BinaryDataSize + OffloadingData.Image.getBufferSize(), getAlignment());
TheHeader.EntryOffset = sizeof(Header);
TheHeader.EntrySize = sizeof(Entry);
TheEntry.StringOffset = sizeof(Header) + sizeof(Entry);
TheEntry.NumStrings = OffloadingData.StringData.size();
- TheEntry.ImageOffset =
- sizeof(Header) + sizeof(Entry) + StringEntrySize + StrTab.getSize();
+ TheEntry.ImageOffset = BinaryDataSize;
TheEntry.ImageSize = OffloadingData.Image.getBufferSize();
SmallVector<char, 1024> Data;
OS << StringRef(reinterpret_cast<char *>(&Map), sizeof(StringEntry));
}
StrTab.write(OS);
+ // Add padding to required image alignment.
+ OS.write_zeros(TheEntry.ImageOffset - OS.tell());
OS << OffloadingData.Image.getBuffer();
// Add final padding to required alignment.