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