From d511bbb0f06d3f7f32433d81e3249d66329f3b94 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Thu, 18 Mar 2010 12:27:14 +0000 Subject: [PATCH] Don't add IMAGE_FILE_RELOCS_STRIPPED for PIE. 2010-03-18 H.J. Lu 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 | 12 ++++++++++++ bfd/libcoff-in.h | 1 + bfd/libcoff.h | 1 + bfd/peXXigen.c | 11 ++++++++++- 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index d8af13c07..623490c8a 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,15 @@ +2010-03-18 H.J. Lu + + 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 PR gas/11323 diff --git a/bfd/libcoff-in.h b/bfd/libcoff-in.h index cf0a31907..e2b60c532 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 db5e2904f..966f71ee1 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 87e66d7c4..8f56f219f 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; } -- 2.11.4.GIT