1*56bb7041Schristos# This shell script emits a C file. -*- C -*- 2*56bb7041Schristos# Copyright (C) 1991-2020 Free Software Foundation, Inc. 3*56bb7041Schristos# 4*56bb7041Schristos# This file is part of the GNU Binutils. 5*56bb7041Schristos# 6*56bb7041Schristos# This program is free software; you can redistribute it and/or modify 7*56bb7041Schristos# it under the terms of the GNU General Public License as published by 8*56bb7041Schristos# the Free Software Foundation; either version 3 of the License, or 9*56bb7041Schristos# (at your option) any later version. 10*56bb7041Schristos# 11*56bb7041Schristos# This program is distributed in the hope that it will be useful, 12*56bb7041Schristos# but WITHOUT ANY WARRANTY; without even the implied warranty of 13*56bb7041Schristos# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*56bb7041Schristos# GNU General Public License for more details. 15*56bb7041Schristos# 16*56bb7041Schristos# You should have received a copy of the GNU General Public License 17*56bb7041Schristos# along with this program; if not, write to the Free Software 18*56bb7041Schristos# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 19*56bb7041Schristos# MA 02110-1301, USA. 20*56bb7041Schristos# 21*56bb7041Schristos 22*56bb7041Schristos# This file is sourced from elf.em, and defines extra arm-elf 23*56bb7041Schristos# specific routines. 24*56bb7041Schristos# 25*56bb7041Schristostest -z "$TARGET2_TYPE" && TARGET2_TYPE="rel" 26*56bb7041Schristosfragment <<EOF 27*56bb7041Schristos 28*56bb7041Schristos#include "ldctor.h" 29*56bb7041Schristos#include "elf/arm.h" 30*56bb7041Schristos#include "elf32-arm.h" 31*56bb7041Schristos 32*56bb7041Schristosstatic struct elf32_arm_params params = 33*56bb7041Schristos{ 34*56bb7041Schristos NULL, /* thumb_entry_symbol */ 35*56bb7041Schristos 0, /* byteswap_code */ 36*56bb7041Schristos 0${TARGET1_IS_REL}, /* target1_is_rel */ 37*56bb7041Schristos "${TARGET2_TYPE}", /* target2_type */ 38*56bb7041Schristos 0, /* fix_v4bx */ 39*56bb7041Schristos 0, /* use_blx */ 40*56bb7041Schristos BFD_ARM_VFP11_FIX_DEFAULT, /* vfp11_denorm_fix */ 41*56bb7041Schristos BFD_ARM_STM32L4XX_FIX_NONE, /* stm32l4xx_fix */ 42*56bb7041Schristos 0, /* no_enum_size_warning */ 43*56bb7041Schristos 0, /* no_wchar_size_warning */ 44*56bb7041Schristos 0, /* pic_veneer */ 45*56bb7041Schristos -1, /* fix_cortex_a8 */ 46*56bb7041Schristos 1, /* fix_arm1176 */ 47*56bb7041Schristos -1, /* merge_exidx_entries */ 48*56bb7041Schristos 0, /* cmse_implib */ 49*56bb7041Schristos NULL /* in_implib_bfd */ 50*56bb7041Schristos}; 51*56bb7041Schristosstatic char *in_implib_filename = NULL; 52*56bb7041Schristos 53*56bb7041Schristosstatic void 54*56bb7041Schristosgld${EMULATION_NAME}_before_parse (void) 55*56bb7041Schristos{ 56*56bb7041Schristos#ifndef TARGET_ /* I.e., if not generic. */ 57*56bb7041Schristos ldfile_set_output_arch ("`echo ${ARCH}`", bfd_arch_unknown); 58*56bb7041Schristos#endif /* not TARGET_ */ 59*56bb7041Schristos input_flags.dynamic = ${DYNAMIC_LINK-TRUE}; 60*56bb7041Schristos config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`; 61*56bb7041Schristos config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`; 62*56bb7041Schristos link_info.check_relocs_after_open_input = TRUE; 63*56bb7041SchristosEOF 64*56bb7041Schristosif test -n "$COMMONPAGESIZE"; then 65*56bb7041Schristosfragment <<EOF 66*56bb7041Schristos link_info.relro = DEFAULT_LD_Z_RELRO; 67*56bb7041SchristosEOF 68*56bb7041Schristosfi 69*56bb7041Schristosfragment <<EOF 70*56bb7041Schristos} 71*56bb7041Schristos 72*56bb7041Schristosstatic void 73*56bb7041Schristosgld${EMULATION_NAME}_set_symbols (void) 74*56bb7041Schristos{ 75*56bb7041Schristos /* PR 19106: The section resizing code in gldarmelf_after_allocation 76*56bb7041Schristos is effectively the same as relaxation, so prevent early memory 77*56bb7041Schristos region checks which produce bogus error messages. 78*56bb7041Schristos Note - this test has nothing to do with symbols. It is just here 79*56bb7041Schristos because this is the first emulation routine that is called after 80*56bb7041Schristos the command line has been parsed. */ 81*56bb7041Schristos if (!bfd_link_relocatable (&link_info)) 82*56bb7041Schristos TARGET_ENABLE_RELAXATION; 83*56bb7041Schristos} 84*56bb7041Schristos 85*56bb7041Schristosstatic void 86*56bb7041Schristosarm_elf_before_allocation (void) 87*56bb7041Schristos{ 88*56bb7041Schristos bfd_elf32_arm_set_byteswap_code (&link_info, params.byteswap_code); 89*56bb7041Schristos 90*56bb7041Schristos /* Choose type of VFP11 erratum fix, or warn if specified fix is unnecessary 91*56bb7041Schristos due to architecture version. */ 92*56bb7041Schristos bfd_elf32_arm_set_vfp11_fix (link_info.output_bfd, &link_info); 93*56bb7041Schristos 94*56bb7041Schristos /* Choose type of STM32L4XX erratum fix, or warn if specified fix is 95*56bb7041Schristos unnecessary due to architecture version. */ 96*56bb7041Schristos bfd_elf32_arm_set_stm32l4xx_fix (link_info.output_bfd, &link_info); 97*56bb7041Schristos 98*56bb7041Schristos /* Auto-select Cortex-A8 erratum fix if it wasn't explicitly specified. */ 99*56bb7041Schristos bfd_elf32_arm_set_cortex_a8_fix (link_info.output_bfd, &link_info); 100*56bb7041Schristos 101*56bb7041Schristos /* Ensure the output sections of veneers needing a dedicated one is not 102*56bb7041Schristos removed. */ 103*56bb7041Schristos bfd_elf32_arm_keep_private_stub_output_sections (&link_info); 104*56bb7041Schristos 105*56bb7041Schristos /* We should be able to set the size of the interworking stub section. We 106*56bb7041Schristos can't do it until later if we have dynamic sections, though. */ 107*56bb7041Schristos if (elf_hash_table (&link_info)->dynobj == NULL) 108*56bb7041Schristos { 109*56bb7041Schristos /* Here we rummage through the found bfds to collect glue information. */ 110*56bb7041Schristos LANG_FOR_EACH_INPUT_STATEMENT (is) 111*56bb7041Schristos { 112*56bb7041Schristos /* Initialise mapping tables for code/data. */ 113*56bb7041Schristos bfd_elf32_arm_init_maps (is->the_bfd); 114*56bb7041Schristos 115*56bb7041Schristos if (!bfd_elf32_arm_process_before_allocation (is->the_bfd, 116*56bb7041Schristos &link_info) 117*56bb7041Schristos || !bfd_elf32_arm_vfp11_erratum_scan (is->the_bfd, &link_info) 118*56bb7041Schristos || !bfd_elf32_arm_stm32l4xx_erratum_scan (is->the_bfd, 119*56bb7041Schristos &link_info)) 120*56bb7041Schristos /* xgettext:c-format */ 121*56bb7041Schristos einfo (_("%P: errors encountered processing file %s\n"), 122*56bb7041Schristos is->filename); 123*56bb7041Schristos } 124*56bb7041Schristos 125*56bb7041Schristos /* We have seen it all. Allocate it, and carry on. */ 126*56bb7041Schristos bfd_elf32_arm_allocate_interworking_sections (& link_info); 127*56bb7041Schristos } 128*56bb7041Schristos 129*56bb7041Schristos /* Call the standard elf routine. */ 130*56bb7041Schristos gld${EMULATION_NAME}_before_allocation (); 131*56bb7041Schristos} 132*56bb7041Schristos 133*56bb7041Schristos/* Fake input file for stubs. */ 134*56bb7041Schristosstatic lang_input_statement_type *stub_file; 135*56bb7041Schristos 136*56bb7041Schristos/* Whether we need to call gldarm_layout_sections_again. */ 137*56bb7041Schristosstatic int need_laying_out = 0; 138*56bb7041Schristos 139*56bb7041Schristos/* Maximum size of a group of input sections that can be handled by 140*56bb7041Schristos one stub section. A value of +/-1 indicates the bfd back-end 141*56bb7041Schristos should use a suitable default size. */ 142*56bb7041Schristosstatic bfd_signed_vma group_size = 1; 143*56bb7041Schristos 144*56bb7041Schristosstruct hook_stub_info 145*56bb7041Schristos{ 146*56bb7041Schristos lang_statement_list_type add; 147*56bb7041Schristos asection *input_section; 148*56bb7041Schristos}; 149*56bb7041Schristos 150*56bb7041Schristos/* Traverse the linker tree to find the spot where the stub goes. */ 151*56bb7041Schristos 152*56bb7041Schristosstatic bfd_boolean 153*56bb7041Schristoshook_in_stub (struct hook_stub_info *info, lang_statement_union_type **lp) 154*56bb7041Schristos{ 155*56bb7041Schristos lang_statement_union_type *l; 156*56bb7041Schristos bfd_boolean ret; 157*56bb7041Schristos 158*56bb7041Schristos for (; (l = *lp) != NULL; lp = &l->header.next) 159*56bb7041Schristos { 160*56bb7041Schristos switch (l->header.type) 161*56bb7041Schristos { 162*56bb7041Schristos case lang_constructors_statement_enum: 163*56bb7041Schristos ret = hook_in_stub (info, &constructor_list.head); 164*56bb7041Schristos if (ret) 165*56bb7041Schristos return ret; 166*56bb7041Schristos break; 167*56bb7041Schristos 168*56bb7041Schristos case lang_output_section_statement_enum: 169*56bb7041Schristos ret = hook_in_stub (info, 170*56bb7041Schristos &l->output_section_statement.children.head); 171*56bb7041Schristos if (ret) 172*56bb7041Schristos return ret; 173*56bb7041Schristos break; 174*56bb7041Schristos 175*56bb7041Schristos case lang_wild_statement_enum: 176*56bb7041Schristos ret = hook_in_stub (info, &l->wild_statement.children.head); 177*56bb7041Schristos if (ret) 178*56bb7041Schristos return ret; 179*56bb7041Schristos break; 180*56bb7041Schristos 181*56bb7041Schristos case lang_group_statement_enum: 182*56bb7041Schristos ret = hook_in_stub (info, &l->group_statement.children.head); 183*56bb7041Schristos if (ret) 184*56bb7041Schristos return ret; 185*56bb7041Schristos break; 186*56bb7041Schristos 187*56bb7041Schristos case lang_input_section_enum: 188*56bb7041Schristos if (l->input_section.section == info->input_section) 189*56bb7041Schristos { 190*56bb7041Schristos /* We've found our section. Insert the stub immediately 191*56bb7041Schristos after its associated input section. */ 192*56bb7041Schristos *(info->add.tail) = l->header.next; 193*56bb7041Schristos l->header.next = info->add.head; 194*56bb7041Schristos return TRUE; 195*56bb7041Schristos } 196*56bb7041Schristos break; 197*56bb7041Schristos 198*56bb7041Schristos case lang_data_statement_enum: 199*56bb7041Schristos case lang_reloc_statement_enum: 200*56bb7041Schristos case lang_object_symbols_statement_enum: 201*56bb7041Schristos case lang_output_statement_enum: 202*56bb7041Schristos case lang_target_statement_enum: 203*56bb7041Schristos case lang_input_statement_enum: 204*56bb7041Schristos case lang_assignment_statement_enum: 205*56bb7041Schristos case lang_padding_statement_enum: 206*56bb7041Schristos case lang_address_statement_enum: 207*56bb7041Schristos case lang_fill_statement_enum: 208*56bb7041Schristos break; 209*56bb7041Schristos 210*56bb7041Schristos default: 211*56bb7041Schristos FAIL (); 212*56bb7041Schristos break; 213*56bb7041Schristos } 214*56bb7041Schristos } 215*56bb7041Schristos return FALSE; 216*56bb7041Schristos} 217*56bb7041Schristos 218*56bb7041Schristos 219*56bb7041Schristos/* Call-back for elf32_arm_size_stubs. */ 220*56bb7041Schristos 221*56bb7041Schristos/* Create a new stub section, and arrange for it to be linked 222*56bb7041Schristos immediately after INPUT_SECTION. */ 223*56bb7041Schristos 224*56bb7041Schristosstatic asection * 225*56bb7041Schristoself32_arm_add_stub_section (const char * stub_sec_name, 226*56bb7041Schristos asection * output_section, 227*56bb7041Schristos asection * after_input_section, 228*56bb7041Schristos unsigned int alignment_power) 229*56bb7041Schristos{ 230*56bb7041Schristos asection *stub_sec; 231*56bb7041Schristos flagword flags; 232*56bb7041Schristos lang_output_section_statement_type *os; 233*56bb7041Schristos struct hook_stub_info info; 234*56bb7041Schristos 235*56bb7041Schristos flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE 236*56bb7041Schristos | SEC_HAS_CONTENTS | SEC_RELOC | SEC_IN_MEMORY | SEC_KEEP 237*56bb7041Schristos | SEC_LINKER_CREATED); 238*56bb7041Schristos stub_sec = bfd_make_section_anyway_with_flags (stub_file->the_bfd, 239*56bb7041Schristos stub_sec_name, flags); 240*56bb7041Schristos if (stub_sec == NULL) 241*56bb7041Schristos goto err_ret; 242*56bb7041Schristos 243*56bb7041Schristos bfd_set_section_alignment (stub_sec, alignment_power); 244*56bb7041Schristos 245*56bb7041Schristos os = lang_output_section_get (output_section); 246*56bb7041Schristos 247*56bb7041Schristos info.input_section = after_input_section; 248*56bb7041Schristos lang_list_init (&info.add); 249*56bb7041Schristos lang_add_section (&info.add, stub_sec, NULL, os); 250*56bb7041Schristos 251*56bb7041Schristos if (info.add.head == NULL) 252*56bb7041Schristos goto err_ret; 253*56bb7041Schristos 254*56bb7041Schristos if (after_input_section == NULL) 255*56bb7041Schristos { 256*56bb7041Schristos lang_statement_union_type **lp = &os->children.head; 257*56bb7041Schristos lang_statement_union_type *l, *lprev = NULL; 258*56bb7041Schristos 259*56bb7041Schristos for (; (l = *lp) != NULL; lp = &l->header.next, lprev = l); 260*56bb7041Schristos 261*56bb7041Schristos if (lprev) 262*56bb7041Schristos lprev->header.next = info.add.head; 263*56bb7041Schristos else 264*56bb7041Schristos os->children.head = info.add.head; 265*56bb7041Schristos 266*56bb7041Schristos return stub_sec; 267*56bb7041Schristos } 268*56bb7041Schristos else 269*56bb7041Schristos { 270*56bb7041Schristos if (hook_in_stub (&info, &os->children.head)) 271*56bb7041Schristos return stub_sec; 272*56bb7041Schristos } 273*56bb7041Schristos 274*56bb7041Schristos err_ret: 275*56bb7041Schristos einfo (_("%X%P: can not make stub section: %E\n")); 276*56bb7041Schristos return NULL; 277*56bb7041Schristos} 278*56bb7041Schristos 279*56bb7041Schristos/* Another call-back for elf_arm_size_stubs. */ 280*56bb7041Schristos 281*56bb7041Schristosstatic void 282*56bb7041Schristosgldarm_layout_sections_again (void) 283*56bb7041Schristos{ 284*56bb7041Schristos /* If we have changed sizes of the stub sections, then we need 285*56bb7041Schristos to recalculate all the section offsets. This may mean we need to 286*56bb7041Schristos add even more stubs. */ 287*56bb7041Schristos ldelf_map_segments (TRUE); 288*56bb7041Schristos need_laying_out = -1; 289*56bb7041Schristos} 290*56bb7041Schristos 291*56bb7041Schristosstatic void 292*56bb7041Schristosbuild_section_lists (lang_statement_union_type *statement) 293*56bb7041Schristos{ 294*56bb7041Schristos if (statement->header.type == lang_input_section_enum) 295*56bb7041Schristos { 296*56bb7041Schristos asection *i = statement->input_section.section; 297*56bb7041Schristos 298*56bb7041Schristos if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS 299*56bb7041Schristos && (i->flags & SEC_EXCLUDE) == 0 300*56bb7041Schristos && i->output_section != NULL 301*56bb7041Schristos && i->output_section->owner == link_info.output_bfd) 302*56bb7041Schristos elf32_arm_next_input_section (& link_info, i); 303*56bb7041Schristos } 304*56bb7041Schristos} 305*56bb7041Schristos 306*56bb7041Schristosstatic int 307*56bb7041Schristoscompare_output_sec_vma (const void *a, const void *b) 308*56bb7041Schristos{ 309*56bb7041Schristos asection *asec = *(asection **) a, *bsec = *(asection **) b; 310*56bb7041Schristos asection *aout = asec->output_section, *bout = bsec->output_section; 311*56bb7041Schristos bfd_vma avma, bvma; 312*56bb7041Schristos 313*56bb7041Schristos /* If there's no output section for some reason, compare equal. */ 314*56bb7041Schristos if (!aout || !bout) 315*56bb7041Schristos return 0; 316*56bb7041Schristos 317*56bb7041Schristos avma = aout->vma + asec->output_offset; 318*56bb7041Schristos bvma = bout->vma + bsec->output_offset; 319*56bb7041Schristos 320*56bb7041Schristos if (avma > bvma) 321*56bb7041Schristos return 1; 322*56bb7041Schristos else if (avma < bvma) 323*56bb7041Schristos return -1; 324*56bb7041Schristos 325*56bb7041Schristos return 0; 326*56bb7041Schristos} 327*56bb7041Schristos 328*56bb7041Schristosstatic void 329*56bb7041Schristosgld${EMULATION_NAME}_after_allocation (void) 330*56bb7041Schristos{ 331*56bb7041Schristos int ret; 332*56bb7041Schristos 333*56bb7041Schristos /* Build a sorted list of input text sections, then use that to process 334*56bb7041Schristos the unwind table index. */ 335*56bb7041Schristos unsigned int list_size = 10; 336*56bb7041Schristos asection **sec_list = (asection **) 337*56bb7041Schristos xmalloc (list_size * sizeof (asection *)); 338*56bb7041Schristos unsigned int sec_count = 0; 339*56bb7041Schristos 340*56bb7041Schristos LANG_FOR_EACH_INPUT_STATEMENT (is) 341*56bb7041Schristos { 342*56bb7041Schristos bfd *abfd = is->the_bfd; 343*56bb7041Schristos asection *sec; 344*56bb7041Schristos 345*56bb7041Schristos if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0) 346*56bb7041Schristos continue; 347*56bb7041Schristos 348*56bb7041Schristos for (sec = abfd->sections; sec != NULL; sec = sec->next) 349*56bb7041Schristos { 350*56bb7041Schristos asection *out_sec = sec->output_section; 351*56bb7041Schristos 352*56bb7041Schristos if (out_sec 353*56bb7041Schristos && elf_section_data (sec) 354*56bb7041Schristos && elf_section_type (sec) == SHT_PROGBITS 355*56bb7041Schristos && (elf_section_flags (sec) & SHF_EXECINSTR) != 0 356*56bb7041Schristos && (sec->flags & SEC_EXCLUDE) == 0 357*56bb7041Schristos && sec->sec_info_type != SEC_INFO_TYPE_JUST_SYMS 358*56bb7041Schristos && out_sec != bfd_abs_section_ptr) 359*56bb7041Schristos { 360*56bb7041Schristos if (sec_count == list_size) 361*56bb7041Schristos { 362*56bb7041Schristos list_size *= 2; 363*56bb7041Schristos sec_list = (asection **) 364*56bb7041Schristos xrealloc (sec_list, list_size * sizeof (asection *)); 365*56bb7041Schristos } 366*56bb7041Schristos 367*56bb7041Schristos sec_list[sec_count++] = sec; 368*56bb7041Schristos } 369*56bb7041Schristos } 370*56bb7041Schristos } 371*56bb7041Schristos 372*56bb7041Schristos qsort (sec_list, sec_count, sizeof (asection *), &compare_output_sec_vma); 373*56bb7041Schristos 374*56bb7041Schristos if (elf32_arm_fix_exidx_coverage (sec_list, sec_count, &link_info, 375*56bb7041Schristos params.merge_exidx_entries)) 376*56bb7041Schristos need_laying_out = 1; 377*56bb7041Schristos 378*56bb7041Schristos free (sec_list); 379*56bb7041Schristos 380*56bb7041Schristos /* bfd_elf32_discard_info just plays with debugging sections, 381*56bb7041Schristos ie. doesn't affect any code, so we can delay resizing the 382*56bb7041Schristos sections. It's likely we'll resize everything in the process of 383*56bb7041Schristos adding stubs. */ 384*56bb7041Schristos ret = bfd_elf_discard_info (link_info.output_bfd, & link_info); 385*56bb7041Schristos if (ret < 0) 386*56bb7041Schristos { 387*56bb7041Schristos einfo (_("%X%P: .eh_frame/.stab edit: %E\n")); 388*56bb7041Schristos return; 389*56bb7041Schristos } 390*56bb7041Schristos else if (ret > 0) 391*56bb7041Schristos need_laying_out = 1; 392*56bb7041Schristos 393*56bb7041Schristos /* If generating a relocatable output file, then we don't 394*56bb7041Schristos have to examine the relocs. */ 395*56bb7041Schristos if (stub_file != NULL && !bfd_link_relocatable (&link_info)) 396*56bb7041Schristos { 397*56bb7041Schristos ret = elf32_arm_setup_section_lists (link_info.output_bfd, &link_info); 398*56bb7041Schristos if (ret != 0) 399*56bb7041Schristos { 400*56bb7041Schristos if (ret < 0) 401*56bb7041Schristos { 402*56bb7041Schristos einfo (_("%X%P: could not compute sections lists " 403*56bb7041Schristos "for stub generation: %E\n")); 404*56bb7041Schristos return; 405*56bb7041Schristos } 406*56bb7041Schristos 407*56bb7041Schristos lang_for_each_statement (build_section_lists); 408*56bb7041Schristos 409*56bb7041Schristos /* Call into the BFD backend to do the real work. */ 410*56bb7041Schristos if (! elf32_arm_size_stubs (link_info.output_bfd, 411*56bb7041Schristos stub_file->the_bfd, 412*56bb7041Schristos & link_info, 413*56bb7041Schristos group_size, 414*56bb7041Schristos & elf32_arm_add_stub_section, 415*56bb7041Schristos & gldarm_layout_sections_again)) 416*56bb7041Schristos { 417*56bb7041Schristos einfo (_("%X%P: can not size stub section: %E\n")); 418*56bb7041Schristos return; 419*56bb7041Schristos } 420*56bb7041Schristos } 421*56bb7041Schristos } 422*56bb7041Schristos 423*56bb7041Schristos if (need_laying_out != -1) 424*56bb7041Schristos ldelf_map_segments (need_laying_out); 425*56bb7041Schristos} 426*56bb7041Schristos 427*56bb7041Schristosstatic void 428*56bb7041Schristosgld${EMULATION_NAME}_finish (void) 429*56bb7041Schristos{ 430*56bb7041Schristos struct bfd_link_hash_entry * h; 431*56bb7041Schristos 432*56bb7041Schristos { 433*56bb7041Schristos LANG_FOR_EACH_INPUT_STATEMENT (is) 434*56bb7041Schristos { 435*56bb7041Schristos /* Figure out where VFP11 erratum veneers (and the labels returning 436*56bb7041Schristos from same) have been placed. */ 437*56bb7041Schristos bfd_elf32_arm_vfp11_fix_veneer_locations (is->the_bfd, &link_info); 438*56bb7041Schristos 439*56bb7041Schristos /* Figure out where STM32L4XX erratum veneers (and the labels returning 440*56bb7041Schristos from them) have been placed. */ 441*56bb7041Schristos bfd_elf32_arm_stm32l4xx_fix_veneer_locations (is->the_bfd, &link_info); 442*56bb7041Schristos } 443*56bb7041Schristos } 444*56bb7041Schristos 445*56bb7041Schristos if (!bfd_link_relocatable (&link_info)) 446*56bb7041Schristos { 447*56bb7041Schristos /* Now build the linker stubs. */ 448*56bb7041Schristos if (stub_file->the_bfd->sections != NULL) 449*56bb7041Schristos { 450*56bb7041Schristos if (! elf32_arm_build_stubs (& link_info)) 451*56bb7041Schristos einfo (_("%X%P: can not build stubs: %E\n")); 452*56bb7041Schristos } 453*56bb7041Schristos } 454*56bb7041Schristos 455*56bb7041Schristos finish_default (); 456*56bb7041Schristos 457*56bb7041Schristos if (params.thumb_entry_symbol) 458*56bb7041Schristos { 459*56bb7041Schristos h = bfd_link_hash_lookup (link_info.hash, params.thumb_entry_symbol, 460*56bb7041Schristos FALSE, FALSE, TRUE); 461*56bb7041Schristos } 462*56bb7041Schristos else 463*56bb7041Schristos { 464*56bb7041Schristos struct elf_link_hash_entry * eh; 465*56bb7041Schristos 466*56bb7041Schristos if (!entry_symbol.name) 467*56bb7041Schristos return; 468*56bb7041Schristos 469*56bb7041Schristos h = bfd_link_hash_lookup (link_info.hash, entry_symbol.name, 470*56bb7041Schristos FALSE, FALSE, TRUE); 471*56bb7041Schristos eh = (struct elf_link_hash_entry *)h; 472*56bb7041Schristos if (!h || ARM_GET_SYM_BRANCH_TYPE (eh->target_internal) 473*56bb7041Schristos != ST_BRANCH_TO_THUMB) 474*56bb7041Schristos return; 475*56bb7041Schristos } 476*56bb7041Schristos 477*56bb7041Schristos 478*56bb7041Schristos if (h != (struct bfd_link_hash_entry *) NULL 479*56bb7041Schristos && (h->type == bfd_link_hash_defined 480*56bb7041Schristos || h->type == bfd_link_hash_defweak) 481*56bb7041Schristos && h->u.def.section->output_section != NULL) 482*56bb7041Schristos { 483*56bb7041Schristos static char buffer[32]; 484*56bb7041Schristos bfd_vma val; 485*56bb7041Schristos 486*56bb7041Schristos /* Special procesing is required for a Thumb entry symbol. The 487*56bb7041Schristos bottom bit of its address must be set. */ 488*56bb7041Schristos val = (h->u.def.value 489*56bb7041Schristos + bfd_section_vma (h->u.def.section->output_section) 490*56bb7041Schristos + h->u.def.section->output_offset); 491*56bb7041Schristos 492*56bb7041Schristos val |= 1; 493*56bb7041Schristos 494*56bb7041Schristos /* Now convert this value into a string and store it in entry_symbol 495*56bb7041Schristos where the lang_finish() function will pick it up. */ 496*56bb7041Schristos buffer[0] = '0'; 497*56bb7041Schristos buffer[1] = 'x'; 498*56bb7041Schristos 499*56bb7041Schristos sprintf_vma (buffer + 2, val); 500*56bb7041Schristos 501*56bb7041Schristos if (params.thumb_entry_symbol != NULL && entry_symbol.name != NULL 502*56bb7041Schristos && entry_from_cmdline) 503*56bb7041Schristos einfo (_("%P: warning: '--thumb-entry %s' is overriding '-e %s'\n"), 504*56bb7041Schristos params.thumb_entry_symbol, entry_symbol.name); 505*56bb7041Schristos entry_symbol.name = buffer; 506*56bb7041Schristos } 507*56bb7041Schristos else 508*56bb7041Schristos einfo (_("%P: warning: cannot find thumb start symbol %s\n"), 509*56bb7041Schristos h->root.string); 510*56bb7041Schristos} 511*56bb7041Schristos 512*56bb7041Schristos/* This is a convenient point to tell BFD about target specific flags. 513*56bb7041Schristos After the output has been created, but before inputs are read. */ 514*56bb7041Schristosstatic void 515*56bb7041Schristosarm_elf_create_output_section_statements (void) 516*56bb7041Schristos{ 517*56bb7041Schristos if (strstr (bfd_get_target (link_info.output_bfd), "arm") == NULL) 518*56bb7041Schristos { 519*56bb7041Schristos /* The arm backend needs special fields in the output hash structure. 520*56bb7041Schristos These will only be created if the output format is an arm format, 521*56bb7041Schristos hence we do not support linking and changing output formats at the 522*56bb7041Schristos same time. Use a link followed by objcopy to change output formats. */ 523*56bb7041Schristos einfo (_("%F%P: error: cannot change output format " 524*56bb7041Schristos "whilst linking %s binaries\n"), "ARM"); 525*56bb7041Schristos return; 526*56bb7041Schristos } 527*56bb7041Schristos 528*56bb7041Schristos if (in_implib_filename) 529*56bb7041Schristos { 530*56bb7041Schristos params.in_implib_bfd = bfd_openr (in_implib_filename, 531*56bb7041Schristos bfd_get_target (link_info.output_bfd)); 532*56bb7041Schristos 533*56bb7041Schristos if (params.in_implib_bfd == NULL) 534*56bb7041Schristos einfo (_("%F%P: %s: can't open: %E\n"), in_implib_filename); 535*56bb7041Schristos 536*56bb7041Schristos if (!bfd_check_format (params.in_implib_bfd, bfd_object)) 537*56bb7041Schristos einfo (_("%F%P: %s: not a relocatable file: %E\n"), in_implib_filename); 538*56bb7041Schristos } 539*56bb7041Schristos 540*56bb7041Schristos bfd_elf32_arm_set_target_params (link_info.output_bfd, &link_info, ¶ms); 541*56bb7041Schristos 542*56bb7041Schristos stub_file = lang_add_input_file ("linker stubs", 543*56bb7041Schristos lang_input_file_is_fake_enum, 544*56bb7041Schristos NULL); 545*56bb7041Schristos stub_file->the_bfd = bfd_create ("linker stubs", link_info.output_bfd); 546*56bb7041Schristos if (stub_file->the_bfd == NULL 547*56bb7041Schristos || ! bfd_set_arch_mach (stub_file->the_bfd, 548*56bb7041Schristos bfd_get_arch (link_info.output_bfd), 549*56bb7041Schristos bfd_get_mach (link_info.output_bfd))) 550*56bb7041Schristos { 551*56bb7041Schristos einfo (_("%F%P: can not create BFD: %E\n")); 552*56bb7041Schristos return; 553*56bb7041Schristos } 554*56bb7041Schristos 555*56bb7041Schristos stub_file->the_bfd->flags |= BFD_LINKER_CREATED; 556*56bb7041Schristos ldlang_add_file (stub_file); 557*56bb7041Schristos 558*56bb7041Schristos /* Also use the stub file for stubs placed in a single output section. */ 559*56bb7041Schristos bfd_elf32_arm_add_glue_sections_to_bfd (stub_file->the_bfd, &link_info); 560*56bb7041Schristos bfd_elf32_arm_get_bfd_for_interworking (stub_file->the_bfd, &link_info); 561*56bb7041Schristos} 562*56bb7041Schristos 563*56bb7041SchristosEOF 564*56bb7041Schristos 565*56bb7041Schristos# Define some shell vars to insert bits of code into the standard elf 566*56bb7041Schristos# parse_args and list_options functions. 567*56bb7041Schristos# 568*56bb7041SchristosPARSE_AND_LIST_PROLOGUE=' 569*56bb7041Schristos#define OPTION_THUMB_ENTRY 301 570*56bb7041Schristos#define OPTION_BE8 302 571*56bb7041Schristos#define OPTION_TARGET1_REL 303 572*56bb7041Schristos#define OPTION_TARGET1_ABS 304 573*56bb7041Schristos#define OPTION_TARGET2 305 574*56bb7041Schristos#define OPTION_FIX_V4BX 306 575*56bb7041Schristos#define OPTION_USE_BLX 307 576*56bb7041Schristos#define OPTION_VFP11_DENORM_FIX 308 577*56bb7041Schristos#define OPTION_NO_ENUM_SIZE_WARNING 309 578*56bb7041Schristos#define OPTION_PIC_VENEER 310 579*56bb7041Schristos#define OPTION_FIX_V4BX_INTERWORKING 311 580*56bb7041Schristos#define OPTION_STUBGROUP_SIZE 312 581*56bb7041Schristos#define OPTION_NO_WCHAR_SIZE_WARNING 313 582*56bb7041Schristos#define OPTION_FIX_CORTEX_A8 314 583*56bb7041Schristos#define OPTION_NO_FIX_CORTEX_A8 315 584*56bb7041Schristos#define OPTION_NO_MERGE_EXIDX_ENTRIES 316 585*56bb7041Schristos#define OPTION_FIX_ARM1176 317 586*56bb7041Schristos#define OPTION_NO_FIX_ARM1176 318 587*56bb7041Schristos#define OPTION_LONG_PLT 319 588*56bb7041Schristos#define OPTION_STM32L4XX_FIX 320 589*56bb7041Schristos#define OPTION_CMSE_IMPLIB 321 590*56bb7041Schristos#define OPTION_IN_IMPLIB 322 591*56bb7041Schristos' 592*56bb7041Schristos 593*56bb7041SchristosPARSE_AND_LIST_SHORTOPTS=p 594*56bb7041Schristos 595*56bb7041SchristosPARSE_AND_LIST_LONGOPTS=' 596*56bb7041Schristos { "no-pipeline-knowledge", no_argument, NULL, '\'p\''}, 597*56bb7041Schristos { "thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY}, 598*56bb7041Schristos { "be8", no_argument, NULL, OPTION_BE8}, 599*56bb7041Schristos { "target1-rel", no_argument, NULL, OPTION_TARGET1_REL}, 600*56bb7041Schristos { "target1-abs", no_argument, NULL, OPTION_TARGET1_ABS}, 601*56bb7041Schristos { "target2", required_argument, NULL, OPTION_TARGET2}, 602*56bb7041Schristos { "fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX}, 603*56bb7041Schristos { "fix-v4bx-interworking", no_argument, NULL, OPTION_FIX_V4BX_INTERWORKING}, 604*56bb7041Schristos { "use-blx", no_argument, NULL, OPTION_USE_BLX}, 605*56bb7041Schristos { "vfp11-denorm-fix", required_argument, NULL, OPTION_VFP11_DENORM_FIX}, 606*56bb7041Schristos { "fix-stm32l4xx-629360", optional_argument, NULL, OPTION_STM32L4XX_FIX}, 607*56bb7041Schristos { "no-enum-size-warning", no_argument, NULL, OPTION_NO_ENUM_SIZE_WARNING}, 608*56bb7041Schristos { "pic-veneer", no_argument, NULL, OPTION_PIC_VENEER}, 609*56bb7041Schristos { "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE }, 610*56bb7041Schristos { "no-wchar-size-warning", no_argument, NULL, OPTION_NO_WCHAR_SIZE_WARNING}, 611*56bb7041Schristos { "fix-cortex-a8", no_argument, NULL, OPTION_FIX_CORTEX_A8 }, 612*56bb7041Schristos { "no-fix-cortex-a8", no_argument, NULL, OPTION_NO_FIX_CORTEX_A8 }, 613*56bb7041Schristos { "no-merge-exidx-entries", no_argument, NULL, OPTION_NO_MERGE_EXIDX_ENTRIES }, 614*56bb7041Schristos { "fix-arm1176", no_argument, NULL, OPTION_FIX_ARM1176 }, 615*56bb7041Schristos { "no-fix-arm1176", no_argument, NULL, OPTION_NO_FIX_ARM1176 }, 616*56bb7041Schristos { "long-plt", no_argument, NULL, OPTION_LONG_PLT }, 617*56bb7041Schristos { "cmse-implib", no_argument, NULL, OPTION_CMSE_IMPLIB }, 618*56bb7041Schristos { "in-implib", required_argument, NULL, OPTION_IN_IMPLIB }, 619*56bb7041Schristos' 620*56bb7041Schristos 621*56bb7041SchristosPARSE_AND_LIST_OPTIONS=' 622*56bb7041Schristos fprintf (file, _(" --thumb-entry=<sym> Set the entry point to be Thumb symbol <sym>\n")); 623*56bb7041Schristos fprintf (file, _(" --be8 Output BE8 format image\n")); 624*56bb7041Schristos fprintf (file, _(" --target1-rel Interpret R_ARM_TARGET1 as R_ARM_REL32\n")); 625*56bb7041Schristos fprintf (file, _(" --target1-abs Interpret R_ARM_TARGET1 as R_ARM_ABS32\n")); 626*56bb7041Schristos fprintf (file, _(" --target2=<type> Specify definition of R_ARM_TARGET2\n")); 627*56bb7041Schristos fprintf (file, _(" --fix-v4bx Rewrite BX rn as MOV pc, rn for ARMv4\n")); 628*56bb7041Schristos fprintf (file, _(" --fix-v4bx-interworking Rewrite BX rn branch to ARMv4 interworking veneer\n")); 629*56bb7041Schristos fprintf (file, _(" --use-blx Enable use of BLX instructions\n")); 630*56bb7041Schristos fprintf (file, _(" --vfp11-denorm-fix Specify how to fix VFP11 denorm erratum\n")); 631*56bb7041Schristos fprintf (file, _(" --fix-stm32l4xx-629360 Specify how to fix STM32L4XX 629360 erratum\n")); 632*56bb7041Schristos fprintf (file, _(" --no-enum-size-warning Don'\''t warn about objects with incompatible\n" 633*56bb7041Schristos " enum sizes\n")); 634*56bb7041Schristos fprintf (file, _(" --no-wchar-size-warning Don'\''t warn about objects with incompatible\n" 635*56bb7041Schristos " wchar_t sizes\n")); 636*56bb7041Schristos fprintf (file, _(" --pic-veneer Always generate PIC interworking veneers\n")); 637*56bb7041Schristos fprintf (file, _(" --long-plt Generate long .plt entries\n" 638*56bb7041Schristos " to handle large .plt/.got displacements\n")); 639*56bb7041Schristos fprintf (file, _(" --cmse-implib Make import library to be a secure gateway import\n" 640*56bb7041Schristos " library as per ARMv8-M Security Extensions\n")); 641*56bb7041Schristos fprintf (file, _(" --in-implib Import library whose symbols address must\n" 642*56bb7041Schristos " remain stable\n")); 643*56bb7041Schristos fprintf (file, _("\ 644*56bb7041Schristos --stub-group-size=N Maximum size of a group of input sections that\n\ 645*56bb7041Schristos can be handled by one stub section. A negative\n\ 646*56bb7041Schristos value locates all stubs after their branches\n\ 647*56bb7041Schristos (with a group size of -N), while a positive\n\ 648*56bb7041Schristos value allows two groups of input sections, one\n\ 649*56bb7041Schristos before, and one after each stub section.\n\ 650*56bb7041Schristos Values of +/-1 indicate the linker should\n\ 651*56bb7041Schristos choose suitable defaults.\n")); 652*56bb7041Schristos fprintf (file, _(" --[no-]fix-cortex-a8 Disable/enable Cortex-A8 Thumb-2 branch erratum fix\n")); 653*56bb7041Schristos fprintf (file, _(" --no-merge-exidx-entries Disable merging exidx entries\n")); 654*56bb7041Schristos fprintf (file, _(" --[no-]fix-arm1176 Disable/enable ARM1176 BLX immediate erratum fix\n")); 655*56bb7041Schristos' 656*56bb7041Schristos 657*56bb7041SchristosPARSE_AND_LIST_ARGS_CASES=' 658*56bb7041Schristos case '\'p\'': 659*56bb7041Schristos /* Only here for backwards compatibility. */ 660*56bb7041Schristos break; 661*56bb7041Schristos 662*56bb7041Schristos case OPTION_THUMB_ENTRY: 663*56bb7041Schristos params.thumb_entry_symbol = optarg; 664*56bb7041Schristos break; 665*56bb7041Schristos 666*56bb7041Schristos case OPTION_BE8: 667*56bb7041Schristos params.byteswap_code = 1; 668*56bb7041Schristos break; 669*56bb7041Schristos 670*56bb7041Schristos case OPTION_TARGET1_REL: 671*56bb7041Schristos params.target1_is_rel = 1; 672*56bb7041Schristos break; 673*56bb7041Schristos 674*56bb7041Schristos case OPTION_TARGET1_ABS: 675*56bb7041Schristos params.target1_is_rel = 0; 676*56bb7041Schristos break; 677*56bb7041Schristos 678*56bb7041Schristos case OPTION_TARGET2: 679*56bb7041Schristos params.target2_type = optarg; 680*56bb7041Schristos break; 681*56bb7041Schristos 682*56bb7041Schristos case OPTION_FIX_V4BX: 683*56bb7041Schristos params.fix_v4bx = 1; 684*56bb7041Schristos break; 685*56bb7041Schristos 686*56bb7041Schristos case OPTION_FIX_V4BX_INTERWORKING: 687*56bb7041Schristos params.fix_v4bx = 2; 688*56bb7041Schristos break; 689*56bb7041Schristos 690*56bb7041Schristos case OPTION_USE_BLX: 691*56bb7041Schristos params.use_blx = 1; 692*56bb7041Schristos break; 693*56bb7041Schristos 694*56bb7041Schristos case OPTION_VFP11_DENORM_FIX: 695*56bb7041Schristos if (strcmp (optarg, "none") == 0) 696*56bb7041Schristos params.vfp11_denorm_fix = BFD_ARM_VFP11_FIX_NONE; 697*56bb7041Schristos else if (strcmp (optarg, "scalar") == 0) 698*56bb7041Schristos params.vfp11_denorm_fix = BFD_ARM_VFP11_FIX_SCALAR; 699*56bb7041Schristos else if (strcmp (optarg, "vector") == 0) 700*56bb7041Schristos params.vfp11_denorm_fix = BFD_ARM_VFP11_FIX_VECTOR; 701*56bb7041Schristos else 702*56bb7041Schristos einfo (_("%P: unrecognized VFP11 fix type '\''%s'\''\n"), optarg); 703*56bb7041Schristos break; 704*56bb7041Schristos 705*56bb7041Schristos case OPTION_STM32L4XX_FIX: 706*56bb7041Schristos if (!optarg) 707*56bb7041Schristos params.stm32l4xx_fix = BFD_ARM_STM32L4XX_FIX_DEFAULT; 708*56bb7041Schristos else if (strcmp (optarg, "none") == 0) 709*56bb7041Schristos params.stm32l4xx_fix = BFD_ARM_STM32L4XX_FIX_NONE; 710*56bb7041Schristos else if (strcmp (optarg, "default") == 0) 711*56bb7041Schristos params.stm32l4xx_fix = BFD_ARM_STM32L4XX_FIX_DEFAULT; 712*56bb7041Schristos else if (strcmp (optarg, "all") == 0) 713*56bb7041Schristos params.stm32l4xx_fix = BFD_ARM_STM32L4XX_FIX_ALL; 714*56bb7041Schristos else 715*56bb7041Schristos einfo (_("%P: unrecognized STM32L4XX fix type '\''%s'\''\n"), optarg); 716*56bb7041Schristos break; 717*56bb7041Schristos 718*56bb7041Schristos case OPTION_NO_ENUM_SIZE_WARNING: 719*56bb7041Schristos params.no_enum_size_warning = 1; 720*56bb7041Schristos break; 721*56bb7041Schristos 722*56bb7041Schristos case OPTION_NO_WCHAR_SIZE_WARNING: 723*56bb7041Schristos params.no_wchar_size_warning = 1; 724*56bb7041Schristos break; 725*56bb7041Schristos 726*56bb7041Schristos case OPTION_PIC_VENEER: 727*56bb7041Schristos params.pic_veneer = 1; 728*56bb7041Schristos break; 729*56bb7041Schristos 730*56bb7041Schristos case OPTION_STUBGROUP_SIZE: 731*56bb7041Schristos { 732*56bb7041Schristos const char *end; 733*56bb7041Schristos 734*56bb7041Schristos group_size = bfd_scan_vma (optarg, &end, 0); 735*56bb7041Schristos if (*end) 736*56bb7041Schristos einfo (_("%F%P: invalid number `%s'\''\n"), optarg); 737*56bb7041Schristos } 738*56bb7041Schristos break; 739*56bb7041Schristos 740*56bb7041Schristos case OPTION_FIX_CORTEX_A8: 741*56bb7041Schristos params.fix_cortex_a8 = 1; 742*56bb7041Schristos break; 743*56bb7041Schristos 744*56bb7041Schristos case OPTION_NO_FIX_CORTEX_A8: 745*56bb7041Schristos params.fix_cortex_a8 = 0; 746*56bb7041Schristos break; 747*56bb7041Schristos 748*56bb7041Schristos case OPTION_NO_MERGE_EXIDX_ENTRIES: 749*56bb7041Schristos params.merge_exidx_entries = 0; 750*56bb7041Schristos break; 751*56bb7041Schristos 752*56bb7041Schristos case OPTION_FIX_ARM1176: 753*56bb7041Schristos params.fix_arm1176 = 1; 754*56bb7041Schristos break; 755*56bb7041Schristos 756*56bb7041Schristos case OPTION_NO_FIX_ARM1176: 757*56bb7041Schristos params.fix_arm1176 = 0; 758*56bb7041Schristos break; 759*56bb7041Schristos 760*56bb7041Schristos case OPTION_LONG_PLT: 761*56bb7041Schristos bfd_elf32_arm_use_long_plt (); 762*56bb7041Schristos break; 763*56bb7041Schristos 764*56bb7041Schristos case OPTION_CMSE_IMPLIB: 765*56bb7041Schristos params.cmse_implib = 1; 766*56bb7041Schristos break; 767*56bb7041Schristos 768*56bb7041Schristos case OPTION_IN_IMPLIB: 769*56bb7041Schristos in_implib_filename = optarg; 770*56bb7041Schristos break; 771*56bb7041Schristos' 772*56bb7041Schristos 773*56bb7041Schristos# We have our own before_allocation etc. functions, but they call 774*56bb7041Schristos# the standard routines, so give them a different name. 775*56bb7041SchristosLDEMUL_BEFORE_ALLOCATION=arm_elf_before_allocation 776*56bb7041SchristosLDEMUL_AFTER_ALLOCATION=gld${EMULATION_NAME}_after_allocation 777*56bb7041SchristosLDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=arm_elf_create_output_section_statements 778*56bb7041Schristos 779*56bb7041Schristos# Replace the elf before_parse function with our own. 780*56bb7041SchristosLDEMUL_BEFORE_PARSE=gld"${EMULATION_NAME}"_before_parse 781*56bb7041SchristosLDEMUL_SET_SYMBOLS=gld"${EMULATION_NAME}"_set_symbols 782*56bb7041Schristos 783*56bb7041Schristos# Call the extra arm-elf function 784*56bb7041SchristosLDEMUL_FINISH=gld${EMULATION_NAME}_finish 785