From: Thomas Preud'homme Date: Tue, 29 Mar 2016 18:52:31 +0000 (+0100) Subject: Support for dedicated stub section with padding X-Git-Tag: users/ARM/embedded-binutils-2_26-branch-2016q1~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=27af0d1d5f900a273a14194f943c14736b2aa00d;p=thirdparty%2Fbinutils-gdb.git Support for dedicated stub section with padding 2016-03-29 Thomas Preud'homme bfd/ * elf32-arm.c (arm_dedicated_stub_section_padding): New function. (elf32_arm_size_stubs): Declare stub_type in a more outer scope and account for padding for stub section requiring one. (elf32_arm_build_stubs): Add comment to stress the importance of zeroing veneer section content. --- diff --git a/bfd/ChangeLog.arm b/bfd/ChangeLog.arm index 8d353e2bd9f..fec9d2d2cd4 100644 --- a/bfd/ChangeLog.arm +++ b/bfd/ChangeLog.arm @@ -1,3 +1,11 @@ +2016-03-29 Thomas Preud'homme + + * elf32-arm.c (arm_dedicated_stub_section_padding): New function. + (elf32_arm_size_stubs): Declare stub_type in a more outer scope and + account for padding for stub section requiring one. + (elf32_arm_build_stubs): Add comment to stress the importance of + zeroing veneer section content. + 2016-03-29 Thomas Preud'homme * bfd-in.h (bfd_elf32_arm_keep_private_stub_output_sections): Declare diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index a871dcd752e..874ff6b73d1 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -4402,6 +4402,24 @@ arm_stub_sym_claimed (enum elf32_arm_stub_type stub_type) abort (); /* Should be unreachable. */ } +/* Returns the padding needed for the dedicated section used stubs of type + STUB_TYPE. */ + +static int +arm_dedicated_stub_section_padding (enum elf32_arm_stub_type stub_type) +{ + if (stub_type >= max_stub_type) + abort (); /* Should be unreachable. */ + + switch (stub_type) + { + default: + return 0; + } + + abort (); /* Should be unreachable. */ +} + static bfd_boolean arm_build_one_stub (struct bfd_hash_entry *gen_entry, void * in_arg) @@ -5378,6 +5396,7 @@ elf32_arm_size_stubs (bfd *output_bfd, bfd *input_bfd; unsigned int bfd_indx; asection *stub_sec; + enum elf32_arm_stub_type stub_type; bfd_boolean stub_changed = FALSE; unsigned prev_num_a8_fixes = num_a8_fixes; @@ -5433,7 +5452,6 @@ elf32_arm_size_stubs (bfd *output_bfd, for (; irela < irelaend; irela++) { unsigned int r_type, r_indx; - enum elf32_arm_stub_type stub_type; asection *sym_sec; bfd_vma sym_value; bfd_vma destination; @@ -5733,7 +5751,27 @@ elf32_arm_size_stubs (bfd *output_bfd, stub_sec->size = 0; } + /* Compute stub section size, considering padding. */ bfd_hash_traverse (&htab->stub_hash_table, arm_size_one_stub, htab); + for (stub_type = arm_stub_none + 1; stub_type < max_stub_type; + stub_type++) + { + int size, padding; + asection **stub_sec_p; + + padding = arm_dedicated_stub_section_padding (stub_type); + stub_sec_p = arm_dedicated_stub_input_section_ptr (htab, stub_type); + /* Skip if no stub input section or no stub section padding + required. */ + if ((stub_sec_p != NULL && *stub_sec_p == NULL) || padding == 0) + continue; + /* Stub section padding required but no dedicated section. */ + BFD_ASSERT (stub_sec_p); + + size = (*stub_sec_p)->size; + size = (size + padding - 1) & ~(padding - 1); + (*stub_sec_p)->size = size; + } /* Add Cortex-A8 erratum veneers to stub section sizes too. */ if (htab->fix_cortex_a8) @@ -5841,7 +5879,8 @@ elf32_arm_build_stubs (struct bfd_link_info *info) if (!strstr (stub_sec->name, STUB_SUFFIX)) continue; - /* Allocate memory to hold the linker stubs. */ + /* Allocate memory to hold the linker stubs. Zeroing the stub sections + must at least be done for stub section requiring padding. */ size = stub_sec->size; stub_sec->contents = (unsigned char *) bfd_zalloc (htab->stub_bfd, size); if (stub_sec->contents == NULL && size != 0)