[PATCH] X86-64: Allow copy relocs for building PIE

H.J. Lu hjl.tools@gmail.com
Wed Dec 3 16:13:00 GMT 2014


On Wed, Dec 3, 2014 at 5:44 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Tue, Dec 2, 2014 at 4:59 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
>> On Tue, Dec 02, 2014 at 04:53:19PM -0800, H.J. Lu wrote:
>>> On Tue, Dec 02, 2014 at 03:20:07PM -0800, H.J. Lu wrote:
>>> > I am checking in this patch to allow copy relocs for non-GOT pc-relative
>>> > relocation in PIE.  It makes bfd linker compatible with gold.
>>> >
>>> >
>>> > H.J.
>>> > ----
>>> > bfd/
>>> >
>>> >     * elf64-x86-64.c (elf_x86_64_create_dynamic_sections): Always
>>> >     allow copy relocs for building executables.
>>> >     (elf_x86_64_check_relocs): Allow copy relocs for non-GOT
>>> >     pc-relative relocation in shared object.
>>> >     (elf_x86_64_adjust_dynamic_symbol): Allocate copy relocs for
>>> >     PIE.
>>> >     (elf_x86_64_relocate_section): Don't copy a pc-relative
>>> >     relocation into the output file if the symbol needs copy reloc.
>>> >
>>>
>>> This patch reverts the change in elf_x86_64_check_relocs and the partial
>>> change in elf_x86_64_adjust_dynamic_symbol.  Instead, we discard space
>>> in PIE for relocs against symbols which turn out to need copy relocs.
>>>
>>>       * elf64-x86-64.c (elf_x86_64_check_relocs): Revert the last
>>>       change.
>>>       (elf_x86_64_adjust_dynamic_symbol): Don't check !info->shared
>>>       with ELIMINATE_COPY_RELOCS.
>>>       (elf_x86_64_allocate_dynrelocs): For PIE, discard space for
>>>       relocs against symbols which turn out to need copy relocs.
>>> ---
>>>  bfd/ChangeLog      |  9 +++++++++
>>>  bfd/elf64-x86-64.c | 36 +++++++++++++++++++++---------------
>>>  2 files changed, 30 insertions(+), 15 deletions(-)
>>>
>>> diff --git a/bfd/ChangeLog b/bfd/ChangeLog
>>> index 434db31..91245b9 100644
>>> --- a/bfd/ChangeLog
>>> +++ b/bfd/ChangeLog
>>> @@ -1,5 +1,14 @@
>>>  2014-12-02  H.J. Lu  <hongjiu.lu@intel.com>
>>>
>>> +     * elf64-x86-64.c (elf_x86_64_check_relocs): Revert the last
>>> +     change.
>>> +     (elf_x86_64_adjust_dynamic_symbol): Don't check !info->shared
>>> +     with ELIMINATE_COPY_RELOCS.
>>> +     (elf_x86_64_allocate_dynrelocs): For PIE, discard space for
>>> +     relocs against symbols which turn out to need copy relocs.
>>> +
>>> +2014-12-02  H.J. Lu  <hongjiu.lu@intel.com>
>>> +
>>>       * elf64-x86-64.c (elf_x86_64_create_dynamic_sections): Always
>>>       allow copy relocs for building executables.
>>>       (elf_x86_64_check_relocs): Allow copy relocs for non-GOT
>>
>>
>> I checked in another small update.
>>
>
> I backported all 3 patches to 2.25 branch.

I also checked this small patch into master and 2.25 branches.

-- 
H.J.
----
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index f7caed5..61a8b2b 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,7 @@
+2014-12-03  H.J. Lu  <hongjiu.lu@intel.com>
+
+ * elf64-x86-64.c (elf_x86_64_create_dynamic_sections): Reformat.
+
 2014-12-02  H.J. Lu  <hongjiu.lu@intel.com>

  * elf64-x86-64.c (elf_x86_64_relocate_section): Check
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index 8b0b8bf..566502f 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -1066,8 +1066,7 @@ elf_x86_64_create_dynamic_sections (bfd *dynobj,
   if (info->executable)
     {
       /* Always allow copy relocs for building executables.  */
-      asection *s;
-      s  = bfd_get_linker_section (dynobj, ".rela.bss");
+      asection *s = bfd_get_linker_section (dynobj, ".rela.bss");
       if (s == NULL)
  {
   const struct elf_backend_data *bed = get_elf_backend_data (dynobj);



More information about the Binutils mailing list