diff options
| author | Rui Ueyama <ruiu@google.com> | 2015-08-11 23:09:00 +0000 |
|---|---|---|
| committer | Rui Ueyama <ruiu@google.com> | 2015-08-11 23:09:00 +0000 |
| commit | fa071e13aa79a0b59723819a7775cddcdcb0db77 (patch) | |
| tree | 2033bcbeadaa68c2842c3908f1a5e6f1b3bf163d | |
| parent | abc794d3dbc557c66c1e9c2023e0d46cc9ea861e (diff) | |
| download | bcm5719-llvm-fa071e13aa79a0b59723819a7775cddcdcb0db77.tar.gz bcm5719-llvm-fa071e13aa79a0b59723819a7775cddcdcb0db77.zip | |
COFF: Align sections to 512-byte boundaries on disk.
Sections must start at page boundaries in memory, but they
can be aligned to sector boundaries (512-bytes) on disk.
We aligned them to 4096-byte boundaries even on disk, so we
wasted disk space a bit.
llvm-svn: 244691
| -rw-r--r-- | lld/COFF/Writer.cpp | 24 | ||||
| -rw-r--r-- | lld/test/COFF/baserel.test | 2 | ||||
| -rw-r--r-- | lld/test/COFF/hello32.test | 4 |
3 files changed, 13 insertions, 17 deletions
diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp index bc9e29be53a..abb72f10888 100644 --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -37,8 +37,7 @@ using namespace lld; using namespace lld::coff; static const int PageSize = 4096; -static const int FileAlignment = 512; -static const int SectionAlignment = 4096; +static const int SectorSize = 512; static const int DOSStubSize = 64; static const int NumberfOfDataDirectory = 16; @@ -174,7 +173,7 @@ void OutputSection::addChunk(Chunk *C) { Off += C->getSize(); Header.VirtualSize = Off; if (C->hasData()) - Header.SizeOfRawData = RoundUpToAlignment(Off, FileAlignment); + Header.SizeOfRawData = RoundUpToAlignment(Off, SectorSize); } void OutputSection::addPermissions(uint32_t C) { @@ -507,15 +506,14 @@ void Writer::createSymbolAndStringTable() { // We position the symbol table to be adjacent to the end of the last section. uint64_t FileOff = LastSection->getFileOff() + - RoundUpToAlignment(LastSection->getRawSize(), FileAlignment); + RoundUpToAlignment(LastSection->getRawSize(), SectorSize); if (!OutputSymtab.empty()) { PointerToSymbolTable = FileOff; FileOff += OutputSymtab.size() * sizeof(coff_symbol16); } if (!Strtab.empty()) FileOff += Strtab.size() + 4; - FileSize = SizeOfHeaders + - RoundUpToAlignment(FileOff - SizeOfHeaders, FileAlignment); + FileSize = RoundUpToAlignment(FileOff, SectorSize); } // Visits all sections to assign incremental, non-overlapping RVAs and @@ -526,9 +524,9 @@ void Writer::assignAddresses() { sizeof(coff_section) * OutputSections.size(); SizeOfHeaders += Config->is64() ? sizeof(pe32plus_header) : sizeof(pe32_header); - SizeOfHeaders = RoundUpToAlignment(SizeOfHeaders, PageSize); + SizeOfHeaders = RoundUpToAlignment(SizeOfHeaders, SectorSize); uint64_t RVA = 0x1000; // The first page is kept unmapped. - uint64_t FileOff = SizeOfHeaders; + FileSize = SizeOfHeaders; // Move DISCARDABLE (or non-memory-mapped) sections to the end of file because // the loader cannot handle holes. std::stable_partition( @@ -539,13 +537,11 @@ void Writer::assignAddresses() { if (Sec->getName() == ".reloc") addBaserels(Sec); Sec->setRVA(RVA); - Sec->setFileOffset(FileOff); + Sec->setFileOffset(FileSize); RVA += RoundUpToAlignment(Sec->getVirtualSize(), PageSize); - FileOff += RoundUpToAlignment(Sec->getRawSize(), FileAlignment); + FileSize += RoundUpToAlignment(Sec->getRawSize(), SectorSize); } SizeOfImage = SizeOfHeaders + RoundUpToAlignment(RVA - 0x1000, PageSize); - FileSize = SizeOfHeaders + - RoundUpToAlignment(FileOff - SizeOfHeaders, FileAlignment); } template <typename PEHeaderTy> void Writer::writeHeader() { @@ -584,8 +580,8 @@ template <typename PEHeaderTy> void Writer::writeHeader() { Buf += sizeof(*PE); PE->Magic = Config->is64() ? PE32Header::PE32_PLUS : PE32Header::PE32; PE->ImageBase = Config->ImageBase; - PE->SectionAlignment = SectionAlignment; - PE->FileAlignment = FileAlignment; + PE->SectionAlignment = PageSize; + PE->FileAlignment = SectorSize; PE->MajorImageVersion = Config->MajorImageVersion; PE->MinorImageVersion = Config->MinorImageVersion; PE->MajorOperatingSystemVersion = Config->MajorOSVersion; diff --git a/lld/test/COFF/baserel.test b/lld/test/COFF/baserel.test index 6d9b0164dc3..bac9c22cbc3 100644 --- a/lld/test/COFF/baserel.test +++ b/lld/test/COFF/baserel.test @@ -61,7 +61,7 @@ # BASEREL-HEADER-NEXT: VirtualSize: 0x20 # BASEREL-HEADER-NEXT: VirtualAddress: 0x5000 # BASEREL-HEADER-NEXT: RawDataSize: 512 -# BASEREL-HEADER-NEXT: PointerToRawData: 0x1800 +# BASEREL-HEADER-NEXT: PointerToRawData: 0xC00 # BASEREL-HEADER-NEXT: PointerToRelocations: 0x0 # BASEREL-HEADER-NEXT: PointerToLineNumbers: 0x0 # BASEREL-HEADER-NEXT: RelocationCount: 0 diff --git a/lld/test/COFF/hello32.test b/lld/test/COFF/hello32.test index 5157a4e0579..4307d4bf89a 100644 --- a/lld/test/COFF/hello32.test +++ b/lld/test/COFF/hello32.test @@ -38,8 +38,8 @@ HEADER-NEXT: MajorImageVersion: 0 HEADER-NEXT: MinorImageVersion: 0 HEADER-NEXT: MajorSubsystemVersion: 6 HEADER-NEXT: MinorSubsystemVersion: 0 -HEADER-NEXT: SizeOfImage: 20480 -HEADER-NEXT: SizeOfHeaders: 4096 +HEADER-NEXT: SizeOfImage: 16896 +HEADER-NEXT: SizeOfHeaders: 512 HEADER-NEXT: Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI (0x3) HEADER-NEXT: Characteristics [ (0x8140) HEADER-NEXT: IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE (0x40) |

