[PATCH] D138783: [llvm-objcopy] [COFF] Always set PointerToRawData when writing a COFF file

Martin Storsjö via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 28 12:40:53 PST 2022


This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG30d5b755ea4f: [llvm-objcopy] [COFF] Always set PointerToRawData when writing a COFF file (authored by mstorsjo).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D138783/new/

https://reviews.llvm.org/D138783

Files:
  llvm/lib/ObjCopy/COFF/COFFWriter.cpp
  llvm/test/tools/llvm-objcopy/COFF/empty-sections.s


Index: llvm/test/tools/llvm-objcopy/COFF/empty-sections.s
===================================================================
--- /dev/null
+++ llvm/test/tools/llvm-objcopy/COFF/empty-sections.s
@@ -0,0 +1,40 @@
+## Check how the PointerToRawData field is set for empty sections.
+##
+## Some tools may leave it set to a nonzero value, while others
+## set it to zero. Currently, the LLVM MC layer produces a .data
+## section with a nonzero PointerToRawData value, even if no
+## .data section needs to be emitted. Other tools, such as yaml2obj
+## writes a zero field if there's no data.
+##
+## When llvm-objcopy copies object files, it either needs to
+## update the value to a valid value (within the bounds of the
+## file, even if the section is empty) or zero. Some tools
+## (such as obj2yaml or llvm-objcopy) can error out if the value
+## is out of bounds.
+##
+## Check that our input file has got a nonzero field, and that
+## it is set to zero after a run with llvm-objcopy.
+
+# REQUIRES: x86-registered-target
+
+# RUN: llvm-mc -triple x86_64-pc-win32 -filetype=obj %s -o %t.in.obj
+# RUN: llvm-readobj --sections %t.in.obj | FileCheck %s --check-prefix=INPUT
+# RUN: llvm-objcopy --remove-section=.bss %t.in.obj %t.out.obj
+# RUN: llvm-readobj --sections %t.out.obj | FileCheck %s --check-prefix=OUTPUT
+
+# INPUT:          Name: .data
+# INPUT-NEXT:     VirtualSize: 0x0
+# INPUT-NEXT:     VirtualAddress: 0x0
+# INPUT-NEXT:     RawDataSize: 0
+# INPUT-NEXT:     PointerToRawData: 0x8D
+
+# OUTPUT:         Name: .data
+# OUTPUT-NEXT:    VirtualSize: 0x0
+# OUTPUT-NEXT:    VirtualAddress: 0x0
+# OUTPUT-NEXT:    RawDataSize: 0
+# OUTPUT-NEXT:    PointerToRawData: 0x0{{$}}
+
+    .text
+    .globl func
+func:
+    ret
Index: llvm/lib/ObjCopy/COFF/COFFWriter.cpp
===================================================================
--- llvm/lib/ObjCopy/COFF/COFFWriter.cpp
+++ llvm/lib/ObjCopy/COFF/COFFWriter.cpp
@@ -96,6 +96,8 @@
   for (auto &S : Obj.getMutableSections()) {
     if (S.Header.SizeOfRawData > 0)
       S.Header.PointerToRawData = FileSize;
+    else
+      S.Header.PointerToRawData = 0;
     FileSize += S.Header.SizeOfRawData; // For executables, this is already
                                         // aligned to FileAlignment.
     if (S.Relocs.size() >= 0xffff) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D138783.478334.patch
Type: text/x-patch
Size: 2311 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221128/9f5f0612/attachment.bin>


More information about the llvm-commits mailing list