| From 16ebb7ab5c462518388527b6ebee2f0e1080b777 Mon Sep 17 00:00:00 2001 |
| From: Pirama Arumuga Nainar <pirama@google.com> |
| Date: Mon, 2 Aug 2021 22:17:53 -0700 |
| Subject: [PATCH] [llvm-objcopy] [COFF] Do not patch debug entries if |
| PointerToRawData is zero |
| |
| Fix an edge case missed by https://reviews.llvm.org/D78921. For e.g., |
| the Repro debug entry (generated with the /Brepro linker flag) does not |
| have a debug-directory payload. Do not attempt to patch Debug entries |
| without a payload. |
| |
| Differential Revision: https://reviews.llvm.org/D107324 |
| --- |
| .../llvm-objcopy/COFF/debug-dir-unmapped.test | 2 +- |
| .../COFF/debug-entry-no-payload.test | 56 +++++++++++++++++++ |
| llvm/tools/llvm-objcopy/COFF/Writer.cpp | 16 +++--- |
| 3 files changed, 64 insertions(+), 10 deletions(-) |
| create mode 100644 llvm/test/tools/llvm-objcopy/COFF/debug-entry-no-payload.test |
| |
| diff --git a/llvm/test/tools/llvm-objcopy/COFF/debug-dir-unmapped.test b/llvm/test/tools/llvm-objcopy/COFF/debug-dir-unmapped.test |
| index b7966c14d7d9..29a08956a6c8 100644 |
| --- a/llvm/test/tools/llvm-objcopy/COFF/debug-dir-unmapped.test |
| +++ b/llvm/test/tools/llvm-objcopy/COFF/debug-dir-unmapped.test |
| @@ -6,7 +6,7 @@ |
| |
| # RUN: not llvm-objcopy --remove-section .rdata %t.in.exe %t.out.exe 2>&1 | FileCheck %s |
| |
| -# CHECK: error: '{{.*}}{{/|\\}}debug-dir-unmapped.test.tmp.out.exe': debug directory payload outside of mapped sections not supported |
| +# CHECK: error: '{{.*}}{{/|\\}}debug-dir-unmapped.test.tmp.out.exe': debug directory payload not found |
| |
| --- !COFF |
| OptionalHeader: |
| diff --git a/llvm/test/tools/llvm-objcopy/COFF/debug-entry-no-payload.test b/llvm/test/tools/llvm-objcopy/COFF/debug-entry-no-payload.test |
| new file mode 100644 |
| index 000000000000..f8bfa109e857 |
| --- /dev/null |
| +++ b/llvm/test/tools/llvm-objcopy/COFF/debug-entry-no-payload.test |
| @@ -0,0 +1,56 @@ |
| +## Check that llvm-objcopy does not produce an error for debug directory |
| +## entries without a payload (e.g. IMAGE_DEBUG_TYPE_REPRO, |
| +## IMAGE_DEBUG_TYPE_UNKNOWN) when patching entries that may have moved during |
| +## a requested operation. Also check that the such debug entries are present |
| +## in the output. |
| + |
| +## The code to patch debug entries is executed even when no operation is |
| +## requested. Hence the RUN line below invokes llvm-objcopy without any |
| +## arguments. |
| + |
| +# RUN: yaml2obj %s -o %t.in.exe |
| +# RUN: llvm-objcopy %t.in.exe %t.out.exe |
| +# RUN: llvm-readobj --coff-debug-directory %t.out.exe | FileCheck %s |
| + |
| +# CHECK: Type: Repro (0x10) |
| +# CHECK: Type: Unknown (0x0) |
| + |
| +--- !COFF |
| +OptionalHeader: |
| + AddressOfEntryPoint: 4096 |
| + ImageBase: 1073741824 |
| + SectionAlignment: 4096 |
| + FileAlignment: 512 |
| + MajorOperatingSystemVersion: 6 |
| + MinorOperatingSystemVersion: 0 |
| + MajorImageVersion: 0 |
| + MinorImageVersion: 0 |
| + MajorSubsystemVersion: 6 |
| + MinorSubsystemVersion: 0 |
| + Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI |
| + DLLCharacteristics: [ ] |
| + SizeOfStackReserve: 1048576 |
| + SizeOfStackCommit: 4096 |
| + SizeOfHeapReserve: 1048576 |
| + SizeOfHeapCommit: 4096 |
| + Debug: |
| + RelativeVirtualAddress: 8192 |
| + Size: 56 |
| +header: |
| + Machine: IMAGE_FILE_MACHINE_AMD64 |
| + Characteristics: [ ] |
| +sections: |
| + - Name: .text |
| + Characteristics: [ ] |
| + VirtualAddress: 4096 |
| + VirtualSize: 3 |
| + SectionData: 31C0C3 |
| + - Name: .rdata |
| + Characteristics: [ ] |
| + VirtualAddress: 8192 |
| + VirtualSize: 56 |
| + ## '10' in SectionData below indicates the Repro type for the first debug |
| + ## entry. The second entry has a type of Unknown ('00'). |
| + SectionData: 0000000047F96B2000000000100000000000000000000000000000000000000047F96B200000000000000000000000000000000000000000 |
| +symbols: [] |
| +... |
| diff --git a/llvm/tools/llvm-objcopy/COFF/Writer.cpp b/llvm/tools/llvm-objcopy/COFF/Writer.cpp |
| index e7be64faab65..8cc2312d137c 100644 |
| --- a/llvm/tools/llvm-objcopy/COFF/Writer.cpp |
| +++ b/llvm/tools/llvm-objcopy/COFF/Writer.cpp |
| @@ -426,15 +426,13 @@ Error COFFWriter::patchDebugDirectory() { |
| uint8_t *End = Ptr + Dir->Size; |
| while (Ptr < End) { |
| debug_directory *Debug = reinterpret_cast<debug_directory *>(Ptr); |
| - if (!Debug->AddressOfRawData) |
| - return createStringError(object_error::parse_failed, |
| - "debug directory payload outside of " |
| - "mapped sections not supported"); |
| - if (Expected<uint32_t> FilePosOrErr = |
| - virtualAddressToFileAddress(Debug->AddressOfRawData)) |
| - Debug->PointerToRawData = *FilePosOrErr; |
| - else |
| - return FilePosOrErr.takeError(); |
| + if (Debug->PointerToRawData) { |
| + if (Expected<uint32_t> FilePosOrErr = |
| + virtualAddressToFileAddress(Debug->AddressOfRawData)) |
| + Debug->PointerToRawData = *FilePosOrErr; |
| + else |
| + return FilePosOrErr.takeError(); |
| + } |
| Ptr += sizeof(debug_directory); |
| Offset += sizeof(debug_directory); |
| } |
| -- |
| 2.32.0.605.g8dce9f2422-goog |
| |