Index: llvm/lib/ObjectYAML/COFFEmitter.cpp =================================================================== --- llvm/lib/ObjectYAML/COFFEmitter.cpp +++ llvm/lib/ObjectYAML/COFFEmitter.cpp @@ -170,8 +170,8 @@ unsigned PEHeaderSize = CP.is64Bit() ? sizeof(object::pe32plus_header) : sizeof(object::pe32_header); CP.Obj.Header.SizeOfOptionalHeader = - PEHeaderSize + - sizeof(object::data_directory) * (COFF::NUM_DATA_DIRECTORIES + 1); + PEHeaderSize + sizeof(object::data_directory) * + CP.Obj.OptionalHeader->Header.NumberOfRvaAndSize; return true; } @@ -397,7 +397,7 @@ Header->SizeOfStackCommit = CP.Obj.OptionalHeader->Header.SizeOfStackCommit; Header->SizeOfHeapReserve = CP.Obj.OptionalHeader->Header.SizeOfHeapReserve; Header->SizeOfHeapCommit = CP.Obj.OptionalHeader->Header.SizeOfHeapCommit; - Header->NumberOfRvaAndSize = COFF::NUM_DATA_DIRECTORIES + 1; + Header->NumberOfRvaAndSize = CP.Obj.OptionalHeader->Header.NumberOfRvaAndSize; return BaseOfData; } @@ -458,8 +458,11 @@ PEH.BaseOfData = BaseOfData; OS.write(reinterpret_cast(&PEH), sizeof(PEH)); } + uint32_t NumDir = 0; for (const Optional &DD : CP.Obj.OptionalHeader->DataDirectories) { + if (NumDir >= CP.Obj.OptionalHeader->Header.NumberOfRvaAndSize) + break; if (!DD.hasValue()) { OS << zeros(uint32_t(0)); OS << zeros(uint32_t(0)); @@ -467,9 +470,13 @@ OS << binary_le(DD->RelativeVirtualAddress); OS << binary_le(DD->Size); } + ++NumDir; + } + for (; NumDir < CP.Obj.OptionalHeader->Header.NumberOfRvaAndSize; + ++NumDir) { + OS << zeros(uint32_t(0)); + OS << zeros(uint32_t(0)); } - OS << zeros(uint32_t(0)); - OS << zeros(uint32_t(0)); } assert(OS.tell() == CP.SectionTableStart); Index: llvm/lib/ObjectYAML/COFFYAML.cpp =================================================================== --- llvm/lib/ObjectYAML/COFFYAML.cpp +++ llvm/lib/ObjectYAML/COFFYAML.cpp @@ -467,6 +467,8 @@ IO.mapRequired("SizeOfHeapReserve", PH.Header.SizeOfHeapReserve); IO.mapRequired("SizeOfHeapCommit", PH.Header.SizeOfHeapCommit); + IO.mapOptional("NumberOfRvaAndSize", PH.Header.NumberOfRvaAndSize, + COFF::NUM_DATA_DIRECTORIES + 1); IO.mapOptional("ExportTable", PH.DataDirectories[COFF::EXPORT_TABLE]); IO.mapOptional("ImportTable", PH.DataDirectories[COFF::IMPORT_TABLE]); IO.mapOptional("ResourceTable", PH.DataDirectories[COFF::RESOURCE_TABLE]); Index: llvm/test/tools/yaml2obj/COFF/default-number-rva.yaml =================================================================== --- /dev/null +++ llvm/test/tools/yaml2obj/COFF/default-number-rva.yaml @@ -0,0 +1,113 @@ +# RUN: yaml2obj %s -o %t +# RUN: llvm-readobj --file-headers %t | FileCheck %s +# RUN: obj2yaml %t | FileCheck %s --check-prefix=ROUNDTRIP + +# CHECK: NumberOfRvaAndSize: 16 +# CHECK-NEXT: DataDirectory { +# CHECK-NEXT: ExportTableRVA: 0x0 +# CHECK-NEXT: ExportTableSize: 0x0 +# CHECK-NEXT: ImportTableRVA: 0x0 +# CHECK-NEXT: ImportTableSize: 0x0 +# CHECK-NEXT: ResourceTableRVA: 0x0 +# CHECK-NEXT: ResourceTableSize: 0x0 +# CHECK-NEXT: ExceptionTableRVA: 0x0 +# CHECK-NEXT: ExceptionTableSize: 0x0 +# CHECK-NEXT: CertificateTableRVA: 0x0 +# CHECK-NEXT: CertificateTableSize: 0x0 +# CHECK-NEXT: BaseRelocationTableRVA: 0x0 +# CHECK-NEXT: BaseRelocationTableSize: 0x0 +# CHECK-NEXT: DebugRVA: 0x0 +# CHECK-NEXT: DebugSize: 0x0 +# CHECK-NEXT: ArchitectureRVA: 0x0 +# CHECK-NEXT: ArchitectureSize: 0x0 +# CHECK-NEXT: GlobalPtrRVA: 0x0 +# CHECK-NEXT: GlobalPtrSize: 0x0 +# CHECK-NEXT: TLSTableRVA: 0x0 +# CHECK-NEXT: TLSTableSize: 0x0 +# CHECK-NEXT: LoadConfigTableRVA: 0x0 +# CHECK-NEXT: LoadConfigTableSize: 0x0 +# CHECK-NEXT: BoundImportRVA: 0x0 +# CHECK-NEXT: BoundImportSize: 0x0 +# CHECK-NEXT: IATRVA: 0x0 +# CHECK-NEXT: IATSize: 0x0 +# CHECK-NEXT: DelayImportDescriptorRVA: 0x0 +# CHECK-NEXT: DelayImportDescriptorSize: 0x0 +# CHECK-NEXT: CLRRuntimeHeaderRVA: 0x0 +# CHECK-NEXT: CLRRuntimeHeaderSize: 0x0 +# CHECK-NEXT: ReservedRVA: 0x0 +# CHECK-NEXT: ReservedSize: 0x0 +# CHECK-NEXT: } + +# ROUNDTRIP: ExportTable: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: ImportTable: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: ResourceTable: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: ExceptionTable: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: CertificateTable: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: BaseRelocationTable: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: Debug: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: Architecture: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: GlobalPtr: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: TlsTable: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: LoadConfigTable: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: BoundImport: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: IAT: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: DelayImportDescriptor: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: ClrRuntimeHeader: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 + +--- !COFF +OptionalHeader: + AddressOfEntryPoint: 4096 + ImageBase: 0 + SectionAlignment: 4096 + FileAlignment: 512 + MajorOperatingSystemVersion: 0 + MinorOperatingSystemVersion: 0 + MajorImageVersion: 0 + MinorImageVersion: 0 + MajorSubsystemVersion: 0 + MinorSubsystemVersion: 0 + Subsystem: IMAGE_SUBSYSTEM_EFI_APPLICATION + DLLCharacteristics: [ ] + SizeOfStackReserve: 0 + SizeOfStackCommit: 0 + SizeOfHeapReserve: 0 + SizeOfHeapCommit: 0 +header: + Machine: IMAGE_FILE_MACHINE_AMD64 + Characteristics: [ ] +sections: + - Name: foo + Characteristics: [ ] + Alignment: 4 +symbols: +... Index: llvm/test/tools/yaml2obj/COFF/variable-number-rva.yaml =================================================================== --- /dev/null +++ llvm/test/tools/yaml2obj/COFF/variable-number-rva.yaml @@ -0,0 +1,253 @@ +# RUN: yaml2obj %s -o %t -DNUMRVA=0 +# RUN: llvm-readobj --file-headers %t | FileCheck %s --check-prefix=CHECK0 +# RUN: obj2yaml %t | FileCheck %s --check-prefix=ROUNDTRIP0 + +# CHECK0: NumberOfRvaAndSize: 0 + +# ROUNDTRIP0: NumberOfRvaAndSize: 0 + +# RUN: yaml2obj %s -o %t -DNUMRVA=16 +# RUN: llvm-readobj --file-headers %t | FileCheck %s +# RUN: obj2yaml %t | FileCheck %s --check-prefix=ROUNDTRIP + +# CHECK: NumberOfRvaAndSize: 16 +# CHECK-NEXT: DataDirectory { +# CHECK-NEXT: ExportTableRVA: 0x0 +# CHECK-NEXT: ExportTableSize: 0x0 +# CHECK-NEXT: ImportTableRVA: 0x0 +# CHECK-NEXT: ImportTableSize: 0x0 +# CHECK-NEXT: ResourceTableRVA: 0x0 +# CHECK-NEXT: ResourceTableSize: 0x0 +# CHECK-NEXT: ExceptionTableRVA: 0x0 +# CHECK-NEXT: ExceptionTableSize: 0x0 +# CHECK-NEXT: CertificateTableRVA: 0x0 +# CHECK-NEXT: CertificateTableSize: 0x0 +# CHECK-NEXT: BaseRelocationTableRVA: 0x0 +# CHECK-NEXT: BaseRelocationTableSize: 0x0 +# CHECK-NEXT: DebugRVA: 0x0 +# CHECK-NEXT: DebugSize: 0x0 +# CHECK-NEXT: ArchitectureRVA: 0x0 +# CHECK-NEXT: ArchitectureSize: 0x0 +# CHECK-NEXT: GlobalPtrRVA: 0x0 +# CHECK-NEXT: GlobalPtrSize: 0x0 +# CHECK-NEXT: TLSTableRVA: 0x0 +# CHECK-NEXT: TLSTableSize: 0x0 +# CHECK-NEXT: LoadConfigTableRVA: 0x0 +# CHECK-NEXT: LoadConfigTableSize: 0x0 +# CHECK-NEXT: BoundImportRVA: 0x0 +# CHECK-NEXT: BoundImportSize: 0x0 +# CHECK-NEXT: IATRVA: 0x0 +# CHECK-NEXT: IATSize: 0x0 +# CHECK-NEXT: DelayImportDescriptorRVA: 0x0 +# CHECK-NEXT: DelayImportDescriptorSize: 0x0 +# CHECK-NEXT: CLRRuntimeHeaderRVA: 0x0 +# CHECK-NEXT: CLRRuntimeHeaderSize: 0x0 +# CHECK-NEXT: ReservedRVA: 0x0 +# CHECK-NEXT: ReservedSize: 0x0 +# CHECK-NEXT: } + +# ROUNDTRIP: ExportTable: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: ImportTable: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: ResourceTable: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: ExceptionTable: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: CertificateTable: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: BaseRelocationTable: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: Debug: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: Architecture: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: GlobalPtr: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: TlsTable: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: LoadConfigTable: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: BoundImport: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: IAT: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: DelayImportDescriptor: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 +# ROUNDTRIP-NEXT: ClrRuntimeHeader: +# ROUNDTRIP-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP-NEXT: Size: 0 + +# RUN: yaml2obj %s -o %t -DNUMRVA=6 +# RUN: llvm-readobj --file-headers %t | FileCheck %s --check-prefix=CHECK2 +# RUN: obj2yaml %t | FileCheck %s --check-prefix=ROUNDTRIP2 + +# CHECK2: NumberOfRvaAndSize: 6 +# CHECK2-NEXT: DataDirectory { +# CHECK2-NEXT: ExportTableRVA: 0x0 +# CHECK2-NEXT: ExportTableSize: 0x0 +# CHECK2-NEXT: ImportTableRVA: 0x0 +# CHECK2-NEXT: ImportTableSize: 0x0 +# CHECK2-NEXT: ResourceTableRVA: 0x0 +# CHECK2-NEXT: ResourceTableSize: 0x0 +# CHECK2-NEXT: ExceptionTableRVA: 0x0 +# CHECK2-NEXT: ExceptionTableSize: 0x0 +# CHECK2-NEXT: CertificateTableRVA: 0x0 +# CHECK2-NEXT: CertificateTableSize: 0x0 +# CHECK2-NEXT: BaseRelocationTableRVA: 0x0 +# CHECK2-NEXT: BaseRelocationTableSize: 0x0 +# CHECK2-NEXT: } + +# ROUNDTRIP2: NumberOfRvaAndSize: 6 +# ROUNDTRIP2-NEXT: ExportTable: +# ROUNDTRIP2-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP2-NEXT: Size: 0 +# ROUNDTRIP2-NEXT: ImportTable: +# ROUNDTRIP2-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP2-NEXT: Size: 0 +# ROUNDTRIP2-NEXT: ResourceTable: +# ROUNDTRIP2-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP2-NEXT: Size: 0 +# ROUNDTRIP2-NEXT: ExceptionTable: +# ROUNDTRIP2-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP2-NEXT: Size: 0 +# ROUNDTRIP2-NEXT: CertificateTable: +# ROUNDTRIP2-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP2-NEXT: Size: 0 +# ROUNDTRIP2-NEXT: BaseRelocationTable: +# ROUNDTRIP2-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP2-NEXT: Size: 0 + +# RUN: yaml2obj %s -o %t -DNUMRVA=18 +# RUN: llvm-readobj --file-headers %t | FileCheck %s --check-prefix=CHECK3 +# RUN: obj2yaml %t | FileCheck %s --check-prefix=ROUNDTRIP3 + +# CHECK3: NumberOfRvaAndSize: 18 +# CHECK3-NEXT: DataDirectory { +# CHECK3-NEXT: ExportTableRVA: 0x0 +# CHECK3-NEXT: ExportTableSize: 0x0 +# CHECK3-NEXT: ImportTableRVA: 0x0 +# CHECK3-NEXT: ImportTableSize: 0x0 +# CHECK3-NEXT: ResourceTableRVA: 0x0 +# CHECK3-NEXT: ResourceTableSize: 0x0 +# CHECK3-NEXT: ExceptionTableRVA: 0x0 +# CHECK3-NEXT: ExceptionTableSize: 0x0 +# CHECK3-NEXT: CertificateTableRVA: 0x0 +# CHECK3-NEXT: CertificateTableSize: 0x0 +# CHECK3-NEXT: BaseRelocationTableRVA: 0x0 +# CHECK3-NEXT: BaseRelocationTableSize: 0x0 +# CHECK3-NEXT: DebugRVA: 0x0 +# CHECK3-NEXT: DebugSize: 0x0 +# CHECK3-NEXT: ArchitectureRVA: 0x0 +# CHECK3-NEXT: ArchitectureSize: 0x0 +# CHECK3-NEXT: GlobalPtrRVA: 0x0 +# CHECK3-NEXT: GlobalPtrSize: 0x0 +# CHECK3-NEXT: TLSTableRVA: 0x0 +# CHECK3-NEXT: TLSTableSize: 0x0 +# CHECK3-NEXT: LoadConfigTableRVA: 0x0 +# CHECK3-NEXT: LoadConfigTableSize: 0x0 +# CHECK3-NEXT: BoundImportRVA: 0x0 +# CHECK3-NEXT: BoundImportSize: 0x0 +# CHECK3-NEXT: IATRVA: 0x0 +# CHECK3-NEXT: IATSize: 0x0 +# CHECK3-NEXT: DelayImportDescriptorRVA: 0x0 +# CHECK3-NEXT: DelayImportDescriptorSize: 0x0 +# CHECK3-NEXT: CLRRuntimeHeaderRVA: 0x0 +# CHECK3-NEXT: CLRRuntimeHeaderSize: 0x0 +# CHECK3-NEXT: ReservedRVA: 0x0 +# CHECK3-NEXT: ReservedSize: 0x0 +# CHECK3-NEXT: UnknownRVA: 0x0 +# CHECK3-NEXT: UnknownSize: 0x0 +# CHECK3-NEXT: UnknownRVA: 0x0 +# CHECK3-NEXT: UnknownSize: 0x0 +# CHECK3-NEXT: } + +# ROUNDTRIP3: NumberOfRvaAndSize: 18 +# ROUNDTRIP3-NEXT: ExportTable: +# ROUNDTRIP3-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP3-NEXT: Size: 0 +# ROUNDTRIP3-NEXT: ImportTable: +# ROUNDTRIP3-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP3-NEXT: Size: 0 +# ROUNDTRIP3-NEXT: ResourceTable: +# ROUNDTRIP3-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP3-NEXT: Size: 0 +# ROUNDTRIP3-NEXT: ExceptionTable: +# ROUNDTRIP3-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP3-NEXT: Size: 0 +# ROUNDTRIP3-NEXT: CertificateTable: +# ROUNDTRIP3-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP3-NEXT: Size: 0 +# ROUNDTRIP3-NEXT: BaseRelocationTable: +# ROUNDTRIP3-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP3-NEXT: Size: 0 +# ROUNDTRIP3-NEXT: Debug: +# ROUNDTRIP3-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP3-NEXT: Size: 0 +# ROUNDTRIP3-NEXT: Architecture: +# ROUNDTRIP3-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP3-NEXT: Size: 0 +# ROUNDTRIP3-NEXT: GlobalPtr: +# ROUNDTRIP3-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP3-NEXT: Size: 0 +# ROUNDTRIP3-NEXT: TlsTable: +# ROUNDTRIP3-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP3-NEXT: Size: 0 +# ROUNDTRIP3-NEXT: LoadConfigTable: +# ROUNDTRIP3-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP3-NEXT: Size: 0 +# ROUNDTRIP3-NEXT: BoundImport: +# ROUNDTRIP3-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP3-NEXT: Size: 0 +# ROUNDTRIP3-NEXT: IAT: +# ROUNDTRIP3-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP3-NEXT: Size: 0 +# ROUNDTRIP3-NEXT: DelayImportDescriptor: +# ROUNDTRIP3-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP3-NEXT: Size: 0 +# ROUNDTRIP3-NEXT: ClrRuntimeHeader: +# ROUNDTRIP3-NEXT: RelativeVirtualAddress: 0 +# ROUNDTRIP3-NEXT: Size: 0 + +--- !COFF +OptionalHeader: + AddressOfEntryPoint: 4096 + ImageBase: 0 + SectionAlignment: 4096 + FileAlignment: 512 + MajorOperatingSystemVersion: 0 + MinorOperatingSystemVersion: 0 + MajorImageVersion: 0 + MinorImageVersion: 0 + MajorSubsystemVersion: 0 + MinorSubsystemVersion: 0 + Subsystem: IMAGE_SUBSYSTEM_EFI_APPLICATION + DLLCharacteristics: [ ] + SizeOfStackReserve: 0 + SizeOfStackCommit: 0 + SizeOfHeapReserve: 0 + SizeOfHeapCommit: 0 + NumberOfRvaAndSize: [[NUMRVA]] +header: + Machine: IMAGE_FILE_MACHINE_AMD64 + Characteristics: [ ] +sections: + - Name: foo + Characteristics: [ ] + Alignment: 4 +symbols: +... Index: llvm/tools/llvm-readobj/COFFDumper.cpp =================================================================== --- llvm/tools/llvm-readobj/COFFDumper.cpp +++ llvm/tools/llvm-readobj/COFFDumper.cpp @@ -709,7 +709,10 @@ }; for (uint32_t i = 0; i < Hdr->NumberOfRvaAndSize; ++i) - printDataDirectory(i, directory[i]); + if (i < sizeof(directory) / sizeof(char *)) + printDataDirectory(i, directory[i]); + else + printDataDirectory(i, "Unknown"); } } Index: llvm/tools/obj2yaml/coff2yaml.cpp =================================================================== --- llvm/tools/obj2yaml/coff2yaml.cpp +++ llvm/tools/obj2yaml/coff2yaml.cpp @@ -80,6 +80,8 @@ OptionalHeader->SizeOfHeapReserve; YAMLObj.OptionalHeader->Header.SizeOfHeapCommit = OptionalHeader->SizeOfHeapCommit; + YAMLObj.OptionalHeader->Header.NumberOfRvaAndSize = + OptionalHeader->NumberOfRvaAndSize; unsigned I = 0; for (auto &DestDD : YAMLObj.OptionalHeader->DataDirectories) { const object::data_directory *DD = Obj.getDataDirectory(I++);