PATCH: PR binutils/11396: objcopy adds IMAGE_FILE_RELOCS_STRIPPED for PIE

H.J. Lu hongjiu.lu@intel.com
Wed Mar 17 23:21:00 GMT 2010


Hi,

objcopy shouldn't add IMAGE_FILE_RELOCS_STRIPPED for PIE.  This patch
fixes it. OK to install.

Thanks.

H.J.
---
2010-03-17  H.J. Lu  <hongjiu.lu@intel.com>

	PR binutils/11396
	* libcoff-in.h (pe_tdata): Add dont_strip_reloc.
	* libcoff.h: Regenerated.

	* peXXigen.c (_bfd_XXi_only_swap_filehdr_out): Clear F_RELFLG
	if dont_strip_reloc is set.
	(_bfd_XX_bfd_copy_private_bfd_data_common): Set
	dont_strip_reloc on output if there is no .reloc and
	IMAGE_FILE_RELOCS_STRIPPED isn't set in input.

diff --git a/bfd/libcoff-in.h b/bfd/libcoff-in.h
index cf0a319..e2b60c5 100644
--- a/bfd/libcoff-in.h
+++ b/bfd/libcoff-in.h
@@ -118,6 +118,7 @@ typedef struct pe_tdata
   struct internal_extra_pe_aouthdr pe_opthdr;
   int dll;
   int has_reloc_section;
+  int dont_strip_reloc;
   bfd_boolean (*in_reloc_p) (bfd *, reloc_howto_type *);
   flagword real_flags;
 } pe_data_type;
diff --git a/bfd/libcoff.h b/bfd/libcoff.h
index db5e290..966f71e 100644
--- a/bfd/libcoff.h
+++ b/bfd/libcoff.h
@@ -122,6 +122,7 @@ typedef struct pe_tdata
   struct internal_extra_pe_aouthdr pe_opthdr;
   int dll;
   int has_reloc_section;
+  int dont_strip_reloc;
   bfd_boolean (*in_reloc_p) (bfd *, reloc_howto_type *);
   flagword real_flags;
 } pe_data_type;
diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c
index 87e66d7..8f56f21 100644
--- a/bfd/peXXigen.c
+++ b/bfd/peXXigen.c
@@ -740,7 +740,8 @@ _bfd_XXi_only_swap_filehdr_out (bfd * abfd, void * in, void * out)
   struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
   struct external_PEI_filehdr *filehdr_out = (struct external_PEI_filehdr *) out;
 
-  if (pe_data (abfd)->has_reloc_section)
+  if (pe_data (abfd)->has_reloc_section
+      || pe_data (abfd)->dont_strip_reloc)
     filehdr_in->f_flags &= ~F_RELFLG;
 
   if (pe_data (abfd)->dll)
@@ -2206,6 +2207,14 @@ _bfd_XX_bfd_copy_private_bfd_data_common (bfd * ibfd, bfd * obfd)
       pe_data (obfd)->pe_opthdr.DataDirectory[PE_BASE_RELOCATION_TABLE].VirtualAddress = 0;
       pe_data (obfd)->pe_opthdr.DataDirectory[PE_BASE_RELOCATION_TABLE].Size = 0;
     }
+
+  /* For PIE, if there is .reloc, we won't add IMAGE_FILE_RELOCS_STRIPPED.
+     But there is no .reloc, we make sure that IMAGE_FILE_RELOCS_STRIPPED
+     won't be added.  */
+  if (! pe_data (ibfd)->has_reloc_section
+      && ! (pe_data (ibfd)->real_flags & IMAGE_FILE_RELOCS_STRIPPED))
+    pe_data (obfd)->dont_strip_reloc = 1;
+
   return TRUE;
 }
 



More information about the Binutils mailing list