Index: test/tools/yaml2obj/coff-arm64.yaml =================================================================== --- test/tools/yaml2obj/coff-arm64.yaml +++ test/tools/yaml2obj/coff-arm64.yaml @@ -1,8 +1,13 @@ # RUN: yaml2obj %s -o %t # RUN: llvm-readobj -file-headers %t | FileCheck %s +# RUN: llvm-readobj -sections %t | FileCheck %s --check-prefix=SECTIONS # CHECK: OptionalHeaderSize: 240 +# SECTIONS: VirtualAddress: 0x1000 +# SECTIONS: VirtualAddress: 0x2000 +# SECTIONS: VirtualAddress: 0x3000 + --- !COFF OptionalHeader: AddressOfEntryPoint: 4096 Index: tools/yaml2obj/yaml2coff.cpp =================================================================== --- tools/yaml2obj/yaml2coff.cpp +++ tools/yaml2obj/yaml2coff.cpp @@ -458,16 +458,19 @@ << binary_le(CP.Obj.Header.SizeOfOptionalHeader) << binary_le(CP.Obj.Header.Characteristics); } + uint64_t ImageBase = 0; if (CP.isPE()) { if (CP.is64Bit()) { object::pe32plus_header PEH; initializeOptionalHeader(CP, COFF::PE32Header::PE32_PLUS, &PEH); OS.write(reinterpret_cast(&PEH), sizeof(PEH)); + ImageBase = PEH.ImageBase; } else { object::pe32_header PEH; uint32_t BaseOfData = initializeOptionalHeader(CP, COFF::PE32Header::PE32, &PEH); PEH.BaseOfData = BaseOfData; OS.write(reinterpret_cast(&PEH), sizeof(PEH)); + ImageBase = PEH.ImageBase; } for (const Optional &DD : CP.Obj.OptionalHeader->DataDirectories) { @@ -490,7 +493,7 @@ i != e; ++i) { OS.write(i->Header.Name, COFF::NameSize); OS << binary_le(i->Header.VirtualSize) - << binary_le(i->Header.VirtualAddress) + << binary_le(uint32_t(i->Header.VirtualAddress - ImageBase)) << binary_le(i->Header.SizeOfRawData) << binary_le(i->Header.PointerToRawData) << binary_le(i->Header.PointerToRelocations)