summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog12
-rw-r--r--bfd/libcoff-in.h1
-rw-r--r--bfd/libcoff.h1
-rw-r--r--bfd/peXXigen.c11
4 files changed, 24 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index d8af13c07a..623490c8a5 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/libcoff-in.h b/bfd/libcoff-in.h
index cf0a31907b..e2b60c5326 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 db5e2904f6..966f71ee10 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 87e66d7c45..8f56f219f0 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;
}