diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2017-04-27 13:55:31 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2017-04-27 13:55:48 -0700 |
commit | de9a3c4285fad1914929ee304ddaa26e76af8031 (patch) | |
tree | e3368c31ed041c51a8a396d4e758a3f10417ab25 | |
parent | da3d25afa26476bf24247b8696fd00ab31f39db9 (diff) | |
download | gdb-de9a3c4285fad1914929ee304ddaa26e76af8031.zip gdb-de9a3c4285fad1914929ee304ddaa26e76af8031.tar.gz gdb-de9a3c4285fad1914929ee304ddaa26e76af8031.tar.bz2 |
x86: Create dynamic sections in create_dynamic_sections
This patch creates dynamic sections in i386/x86-64 create_dynamic_sections
instead of creating them on demend. Linker will strip them if they are
empty. It changes order in x86-64 .eh_frame section. The extra DW_CFA_nop
paddings is due to
https://sourceware.org/bugzilla/show_bug.cgi?id=21441
bfd/
* elf32-i386.c (elf_i386_create_dynamic_sections): Create the
.plt.got section here.
(elf_i386_check_relocs): Don't create the .plt.got section.
* elf64-x86-64.c (elf_x86_64_create_dynamic_sections): Create
the .plt.got and .plt.bnd sections here.
(elf_x86_64_check_relocs): Don't create the .plt.got nor
.plt.bnd sections.
ld/
* testsuite/ld-x86-64/pr21038a.d: Update DW_CFA_nop paddings
in .eh_frame section.
* testsuite/ld-x86-64/pr21038c.d: Update .eh_frame order.
-rw-r--r-- | bfd/ChangeLog | 10 | ||||
-rw-r--r-- | bfd/elf32-i386.c | 131 | ||||
-rw-r--r-- | bfd/elf64-x86-64.c | 219 | ||||
-rw-r--r-- | ld/ChangeLog | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/pr21038a.d | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/pr21038c.d | 4 |
6 files changed, 185 insertions, 191 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9435b94..0d328b4 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,15 @@ 2017-04-27 H.J. Lu <hongjiu.lu@intel.com> + * elf32-i386.c (elf_i386_create_dynamic_sections): Create the + .plt.got section here. + (elf_i386_check_relocs): Don't create the .plt.got section. + * elf64-x86-64.c (elf_x86_64_create_dynamic_sections): Create + the .plt.got and .plt.bnd sections here. + (elf_x86_64_check_relocs): Don't create the .plt.got nor + .plt.bnd sections. + +2017-04-27 H.J. Lu <hongjiu.lu@intel.com> + * elf64-x86-64.c (elf_x86_64_link_hash_entry): Remove has_bnd_reloc. (elf_x86_64_link_hash_newfunc): Don't clear has_bnd_reloc. diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 45c6c0e..c995ef5 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -1124,18 +1124,70 @@ elf_i386_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) &htab->srelplt2)) return FALSE; - if (!info->no_ld_generated_unwind_info - && htab->plt_eh_frame == NULL - && htab->elf.splt != NULL) + if (htab->elf.splt != NULL) { - flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY - | SEC_HAS_CONTENTS | SEC_IN_MEMORY - | SEC_LINKER_CREATED); - htab->plt_eh_frame - = bfd_make_section_anyway_with_flags (dynobj, ".eh_frame", flags); - if (htab->plt_eh_frame == NULL - || !bfd_set_section_alignment (dynobj, htab->plt_eh_frame, 2)) - return FALSE; + if (htab->plt_got == NULL + && !get_elf_i386_backend_data (dynobj)->is_vxworks + && get_elf_i386_backend_data (dynobj) == &elf_i386_arch_bed) + { + /* Create the GOT procedure linkage table. */ + unsigned int plt_got_align; + const struct elf_backend_data *bed; + + bed = get_elf_backend_data (dynobj); + BFD_ASSERT (sizeof (elf_i386_got_plt_entry) == 8 + && (sizeof (elf_i386_got_plt_entry) + == sizeof (elf_i386_pic_got_plt_entry))); + plt_got_align = 3; + + htab->plt_got + = bfd_make_section_anyway_with_flags (dynobj, + ".plt.got", + (bed->dynamic_sec_flags + | SEC_ALLOC + | SEC_CODE + | SEC_LOAD + | SEC_READONLY)); + if (htab->plt_got == NULL + || !bfd_set_section_alignment (dynobj, + htab->plt_got, + plt_got_align)) + return FALSE; + } + + if (!info->no_ld_generated_unwind_info) + { + flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY + | SEC_HAS_CONTENTS | SEC_IN_MEMORY + | SEC_LINKER_CREATED); + + if (htab->plt_eh_frame == NULL) + { + htab->plt_eh_frame + = bfd_make_section_anyway_with_flags (dynobj, + ".eh_frame", + flags); + if (htab->plt_eh_frame == NULL + || !bfd_set_section_alignment (dynobj, + htab->plt_eh_frame, + 2)) + return FALSE; + } + + if (htab->plt_got_eh_frame == NULL + && htab->plt_got != NULL) + { + htab->plt_got_eh_frame + = bfd_make_section_anyway_with_flags (dynobj, + ".eh_frame", + flags); + if (htab->plt_got_eh_frame == NULL + || !bfd_set_section_alignment (dynobj, + htab->plt_got_eh_frame, + 2)) + return FALSE; + } + } } return TRUE; @@ -1858,7 +1910,6 @@ elf_i386_check_relocs (bfd *abfd, const Elf_Internal_Rela *rel_end; asection *sreloc; bfd_byte *contents; - bfd_boolean use_plt_got; if (bfd_link_relocatable (info)) return TRUE; @@ -1890,10 +1941,6 @@ elf_i386_check_relocs (bfd *abfd, return FALSE; } - use_plt_got = (!get_elf_i386_backend_data (abfd)->is_vxworks - && (get_elf_i386_backend_data (abfd) - == &elf_i386_arch_bed)); - symtab_hdr = &elf_symtab_hdr (abfd); sym_hashes = elf_sym_hashes (abfd); @@ -2353,58 +2400,6 @@ do_size: break; } - if (use_plt_got - && h != NULL - && h->plt.refcount > 0 - && (((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed) - || h->got.refcount > 0) - && htab->plt_got == NULL) - { - /* Create the GOT procedure linkage table. */ - unsigned int plt_got_align; - const struct elf_backend_data *bed; - - bed = get_elf_backend_data (info->output_bfd); - BFD_ASSERT (sizeof (elf_i386_got_plt_entry) == 8 - && (sizeof (elf_i386_got_plt_entry) - == sizeof (elf_i386_pic_got_plt_entry))); - plt_got_align = 3; - - if (htab->elf.dynobj == NULL) - htab->elf.dynobj = abfd; - htab->plt_got - = bfd_make_section_anyway_with_flags (htab->elf.dynobj, - ".plt.got", - (bed->dynamic_sec_flags - | SEC_ALLOC - | SEC_CODE - | SEC_LOAD - | SEC_READONLY)); - if (htab->plt_got == NULL - || !bfd_set_section_alignment (htab->elf.dynobj, - htab->plt_got, - plt_got_align)) - goto error_return; - - if (!info->no_ld_generated_unwind_info - && htab->plt_got_eh_frame == NULL - && get_elf_i386_backend_data (abfd)->plt->eh_frame_plt_got != NULL) - { - flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY - | SEC_HAS_CONTENTS | SEC_IN_MEMORY - | SEC_LINKER_CREATED); - htab->plt_got_eh_frame - = bfd_make_section_anyway_with_flags (htab->elf.dynobj, - ".eh_frame", - flags); - if (htab->plt_got_eh_frame == NULL - || !bfd_set_section_alignment (htab->elf.dynobj, - htab->plt_got_eh_frame, - 2)) - goto error_return; - } - } - if (r_type == R_386_GOT32X && (h == NULL || h->type != STT_GNU_IFUNC)) sec->need_convert_load = 1; diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index c491628..5985319 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -1197,19 +1197,106 @@ elf_x86_64_create_dynamic_sections (bfd *dynobj, htab->interp = s; } - if (!info->no_ld_generated_unwind_info - && htab->plt_eh_frame == NULL - && htab->elf.splt != NULL) + if (htab->elf.splt != NULL) { - flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY - | SEC_HAS_CONTENTS | SEC_IN_MEMORY - | SEC_LINKER_CREATED); - htab->plt_eh_frame - = bfd_make_section_anyway_with_flags (dynobj, ".eh_frame", flags); - if (htab->plt_eh_frame == NULL - || !bfd_set_section_alignment (dynobj, htab->plt_eh_frame, - ABI_64_P (dynobj) ? 3 : 2)) - return FALSE; + const struct elf_backend_data *bed + = get_elf_backend_data (dynobj); + flagword pltflags = (bed->dynamic_sec_flags + | SEC_ALLOC + | SEC_CODE + | SEC_LOAD + | SEC_READONLY); + + if (htab->plt_got == NULL + && get_elf_x86_64_backend_data (dynobj) == &elf_x86_64_arch_bed) + { + /* Create the GOT procedure linkage table. */ + unsigned int plt_got_align; + + BFD_ASSERT (sizeof (elf_x86_64_legacy_plt2_entry) == 8 + && (sizeof (elf_x86_64_bnd_plt2_entry) + == sizeof (elf_x86_64_legacy_plt2_entry))); + plt_got_align = 3; + + htab->plt_got + = bfd_make_section_anyway_with_flags (dynobj, + ".plt.got", + pltflags); + if (htab->plt_got == NULL + || !bfd_set_section_alignment (dynobj, + htab->plt_got, + plt_got_align)) + return FALSE; + } + + /* MPX PLT is supported only if elf_x86_64_arch_bed is used in + 64-bit mode. */ + if (ABI_64_P (dynobj) + && info->bndplt + && get_elf_x86_64_backend_data (dynobj) == &elf_x86_64_arch_bed + && htab->plt_bnd == NULL) + { + /* Create the second PLT for Intel MPX support. */ + BFD_ASSERT (sizeof (elf_x86_64_bnd_plt2_entry) == 8 + && (sizeof (elf_x86_64_bnd_plt2_entry) + == sizeof (elf_x86_64_legacy_plt2_entry))); + + htab->plt_bnd + = bfd_make_section_anyway_with_flags (dynobj, + ".plt.bnd", + pltflags); + if (htab->plt_bnd == NULL + || !bfd_set_section_alignment (dynobj, htab->plt_bnd, 3)) + return FALSE; + } + + if (!info->no_ld_generated_unwind_info) + { + flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY + | SEC_HAS_CONTENTS | SEC_IN_MEMORY + | SEC_LINKER_CREATED); + + if (htab->plt_eh_frame == NULL) + { + htab->plt_eh_frame + = bfd_make_section_anyway_with_flags (dynobj, + ".eh_frame", + flags); + if (htab->plt_eh_frame == NULL + || !bfd_set_section_alignment (dynobj, + htab->plt_eh_frame, + ABI_64_P (dynobj) ? 3 : 2)) + return FALSE; + } + + if (htab->plt_got_eh_frame == NULL + && htab->plt_got != NULL) + { + htab->plt_got_eh_frame + = bfd_make_section_anyway_with_flags (htab->elf.dynobj, + ".eh_frame", + flags); + if (htab->plt_got_eh_frame == NULL + || !bfd_set_section_alignment (dynobj, + htab->plt_got_eh_frame, + ABI_64_P (dynobj) ? 3 : 2)) + return FALSE; + } + + if (htab->plt_bnd_eh_frame == NULL + && htab->plt_bnd != NULL) + { + htab->plt_bnd_eh_frame + = bfd_make_section_anyway_with_flags (dynobj, + ".eh_frame", + flags); + if (htab->plt_bnd_eh_frame == NULL + || !bfd_set_section_alignment (dynobj, + htab->plt_bnd_eh_frame, + 3)) + return FALSE; + } + } } /* Align .got section to its entry size. */ @@ -2198,7 +2285,6 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, const Elf_Internal_Rela *rel_end; asection *sreloc; bfd_byte *contents; - bfd_boolean use_plt_got; if (bfd_link_relocatable (info)) return TRUE; @@ -2230,8 +2316,6 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, return FALSE; } - use_plt_got = get_elf_x86_64_backend_data (abfd) == &elf_x86_64_arch_bed; - symtab_hdr = &elf_symtab_hdr (abfd); sym_hashes = elf_sym_hashes (abfd); @@ -2340,59 +2424,6 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_X86_64_PLT32: case R_X86_64_32: case R_X86_64_64: - /* MPX PLT is supported only if elf_x86_64_arch_bed - is used in 64-bit mode. */ - if (ABI_64_P (abfd) - && info->bndplt - && (get_elf_x86_64_backend_data (abfd) - == &elf_x86_64_arch_bed)) - { - /* Create the second PLT for Intel MPX support. */ - if (htab->plt_bnd == NULL) - { - const struct elf_backend_data *bed; - - bed = get_elf_backend_data (info->output_bfd); - BFD_ASSERT (sizeof (elf_x86_64_bnd_plt2_entry) == 8 - && (sizeof (elf_x86_64_bnd_plt2_entry) - == sizeof (elf_x86_64_legacy_plt2_entry))); - - if (htab->elf.dynobj == NULL) - htab->elf.dynobj = abfd; - htab->plt_bnd - = bfd_make_section_anyway_with_flags (htab->elf.dynobj, - ".plt.bnd", - (bed->dynamic_sec_flags - | SEC_ALLOC - | SEC_CODE - | SEC_LOAD - | SEC_READONLY)); - if (htab->plt_bnd == NULL - || !bfd_set_section_alignment (htab->elf.dynobj, - htab->plt_bnd, - 3)) - goto error_return; - } - - if (!info->no_ld_generated_unwind_info - && htab->plt_bnd_eh_frame == NULL) - { - flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY - | SEC_HAS_CONTENTS | SEC_IN_MEMORY - | SEC_LINKER_CREATED); - htab->plt_bnd_eh_frame - = bfd_make_section_anyway_with_flags (htab->elf.dynobj, - ".eh_frame", - flags); - if (htab->plt_bnd_eh_frame == NULL - || !bfd_set_section_alignment (htab->elf.dynobj, - htab->plt_bnd_eh_frame, - 3)) - goto error_return; - } - } - /* Fall through. */ - case R_X86_64_32S: case R_X86_64_PC64: case R_X86_64_GOTPCREL: @@ -2798,58 +2829,6 @@ do_size: break; } - if (use_plt_got - && h != NULL - && h->plt.refcount > 0 - && (((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed) - || h->got.refcount > 0) - && htab->plt_got == NULL) - { - /* Create the GOT procedure linkage table. */ - unsigned int plt_got_align; - const struct elf_backend_data *bed; - - bed = get_elf_backend_data (info->output_bfd); - BFD_ASSERT (sizeof (elf_x86_64_legacy_plt2_entry) == 8 - && (sizeof (elf_x86_64_bnd_plt2_entry) - == sizeof (elf_x86_64_legacy_plt2_entry))); - plt_got_align = 3; - - if (htab->elf.dynobj == NULL) - htab->elf.dynobj = abfd; - htab->plt_got - = bfd_make_section_anyway_with_flags (htab->elf.dynobj, - ".plt.got", - (bed->dynamic_sec_flags - | SEC_ALLOC - | SEC_CODE - | SEC_LOAD - | SEC_READONLY)); - if (htab->plt_got == NULL - || !bfd_set_section_alignment (htab->elf.dynobj, - htab->plt_got, - plt_got_align)) - goto error_return; - - if (!info->no_ld_generated_unwind_info - && htab->plt_got_eh_frame == NULL - && get_elf_x86_64_backend_data (abfd)->eh_frame_plt_got != NULL) - { - flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY - | SEC_HAS_CONTENTS | SEC_IN_MEMORY - | SEC_LINKER_CREATED); - htab->plt_got_eh_frame - = bfd_make_section_anyway_with_flags (htab->elf.dynobj, - ".eh_frame", - flags); - if (htab->plt_got_eh_frame == NULL - || !bfd_set_section_alignment (htab->elf.dynobj, - htab->plt_got_eh_frame, - ABI_64_P (htab->elf.dynobj) ? 3 : 2)) - goto error_return; - } - } - if ((r_type == R_X86_64_GOTPCREL || r_type == R_X86_64_GOTPCRELX || r_type == R_X86_64_REX_GOTPCRELX) diff --git a/ld/ChangeLog b/ld/ChangeLog index c93d903..008e8c9 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2017-04-27 H.J. Lu <hongjiu.lu@intel.com> + + * testsuite/ld-x86-64/pr21038a.d: Update DW_CFA_nop paddings + in .eh_frame section. + * testsuite/ld-x86-64/pr21038c.d: Update .eh_frame order. + 2017-04-26 H.J. Lu <hongjiu.lu@intel.com> * testsuite/ld-i386/tlsdesc2.d: New test. diff --git a/ld/testsuite/ld-x86-64/pr21038a.d b/ld/testsuite/ld-x86-64/pr21038a.d index e6829d5..f2f88eb 100644 --- a/ld/testsuite/ld-x86-64/pr21038a.d +++ b/ld/testsuite/ld-x86-64/pr21038a.d @@ -40,7 +40,11 @@ Contents of the .eh_frame section: DW_CFA_nop DW_CFA_nop -0+58 0000000000000010 0000005c FDE cie=00000000 pc=0000000000000230..0000000000000238 +0+58 0000000000000014 0000005c FDE cie=00000000 pc=0000000000000230..0000000000000238 + DW_CFA_nop + DW_CFA_nop + DW_CFA_nop + DW_CFA_nop DW_CFA_nop DW_CFA_nop DW_CFA_nop diff --git a/ld/testsuite/ld-x86-64/pr21038c.d b/ld/testsuite/ld-x86-64/pr21038c.d index 5b6c22f..05b3622 100644 --- a/ld/testsuite/ld-x86-64/pr21038c.d +++ b/ld/testsuite/ld-x86-64/pr21038c.d @@ -40,7 +40,7 @@ Contents of the .eh_frame section: DW_CFA_nop DW_CFA_nop -0+58 0000000000000014 0000005c FDE cie=00000000 pc=0000000000000288..0000000000000290 +0+58 0000000000000014 0000005c FDE cie=00000000 pc=0000000000000280..0000000000000288 DW_CFA_nop DW_CFA_nop DW_CFA_nop @@ -49,7 +49,7 @@ Contents of the .eh_frame section: DW_CFA_nop DW_CFA_nop -0+70 0000000000000010 00000074 FDE cie=00000000 pc=0000000000000280..0000000000000288 +0+70 0000000000000010 00000074 FDE cie=00000000 pc=0000000000000288..0000000000000290 DW_CFA_nop DW_CFA_nop DW_CFA_nop |