Don't add IMAGE_FILE_RELOCS_STRIPPED for PIE.
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 18 Mar 2010 12:27:15 +0000 (12:27 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 18 Mar 2010 12:27:15 +0000 (12:27 +0000)
2010-03-18  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.

bfd/ChangeLog
bfd/libcoff-in.h
bfd/libcoff.h
bfd/peXXigen.c

index d8af13c..623490c 100644 (file)
@@ -1,3 +1,15 @@
+2010-03-18  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.
+
 2010-03-18  Wei Guozhi  <carrot@google.com>
 
        PR gas/11323
index cf0a319..e2b60c5 100644 (file)
@@ -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;
index db5e290..966f71e 100644 (file)
@@ -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;
index 87e66d7..8f56f21 100644 (file)
@@ -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;
 }