[PATCH] D51961: [objcopy] make objcopy follow program header standards

Armando Montanez via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 11 16:50:49 PDT 2018


amontanez created this revision.
amontanez added reviewers: jakehehrlich, jhenderson.
Herald added a reviewer: alexshap.
Herald added a subscriber: rupprecht.

Objects with unused program headers copied by objcopy would always have nonzero values for program header offset and program header entry size. While technically valid, this atypical behavior triggers warnings in some tools. This change sets the two fields to zero when the program header is unused, better fitting the general expectations for unused program header data.


https://reviews.llvm.org/D51961

Files:
  llvm/test/tools/llvm-objcopy/relocatable-phdr.test
  llvm/tools/llvm-objcopy/Object.cpp


Index: llvm/tools/llvm-objcopy/Object.cpp
===================================================================
--- llvm/tools/llvm-objcopy/Object.cpp
+++ llvm/tools/llvm-objcopy/Object.cpp
@@ -1049,13 +1049,11 @@
   Ehdr.e_machine = Obj.Machine;
   Ehdr.e_version = Obj.Version;
   Ehdr.e_entry = Obj.Entry;
-  // TODO: Only set phoff when a program header exists, to avoid tools
-  // thinking this is corrupt data.
-  Ehdr.e_phoff = Obj.ProgramHdrSegment.Offset;
+  Ehdr.e_phnum = size(Obj.segments());
+  Ehdr.e_phoff = (size(Obj.segments()) != 0) ? Obj.ProgramHdrSegment.Offset : 0;
+  Ehdr.e_phentsize = (size(Obj.segments()) != 0) ? sizeof(Elf_Phdr) : 0;
   Ehdr.e_flags = Obj.Flags;
   Ehdr.e_ehsize = sizeof(Elf_Ehdr);
-  Ehdr.e_phentsize = sizeof(Elf_Phdr);
-  Ehdr.e_phnum = size(Obj.segments());
   Ehdr.e_shentsize = sizeof(Elf_Shdr);
   if (WriteSectionHeaders) {
     Ehdr.e_shoff = Obj.SHOffset;
Index: llvm/test/tools/llvm-objcopy/relocatable-phdr.test
===================================================================
--- /dev/null
+++ llvm/test/tools/llvm-objcopy/relocatable-phdr.test
@@ -0,0 +1,16 @@
+# This test ensures an object without a program header will retain zero values
+# for offset and header size when copied with llvm-objcopy.
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy %t %t2
+# RUN: llvm-readelf -file-headers %t2 | FileCheck %s
+
+!ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_EXEC
+  Machine:         EM_X86_64
+
+# CHECK:     Start of program headers:          0 (bytes into file)
+# CHECK:     Size of program headers:           0 (bytes)
+# CHECK-NEXT:Number of program headers:         0


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D51961.164997.patch
Type: text/x-patch
Size: 1693 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180911/461caa9c/attachment.bin>


More information about the llvm-commits mailing list