diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2010-03-18 12:27:15 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2010-03-18 12:27:15 +0000 |
commit | 441f34fa999247cf9948edbb92089804a4d176d5 (patch) | |
tree | f284a129ef00f07754f54fa3c628739fd2e66bb7 /bfd/peXXigen.c | |
parent | b43420e6cdbc2b1ae000f4671470d208ac7241a9 (diff) | |
download | gdb-441f34fa999247cf9948edbb92089804a4d176d5.zip gdb-441f34fa999247cf9948edbb92089804a4d176d5.tar.gz gdb-441f34fa999247cf9948edbb92089804a4d176d5.tar.bz2 |
Don't add IMAGE_FILE_RELOCS_STRIPPED for PIE.
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.
Diffstat (limited to 'bfd/peXXigen.c')
-rw-r--r-- | bfd/peXXigen.c | 11 |
1 files changed, 10 insertions, 1 deletions
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; } |