WIP MachO binutils port assisted by AI I may consider upstreaming this in the future.
0

Configure Feed

Select the types of activity you want to include in your feed.

xgate cleanup

elf32-xgate.c contains many functions that are only stubs and
elf32-xgate.h contains unused declarations. While this might be
reasonable for the initial commit of a port with subsequent work
fleshing out the stubs, xgate has only had two minor target specific
patches since the initial commit over six years ago. The rest of the
changes have been general maintenance work applied to all ELF targets,
and some of this work could have been avoided if the stubs hadn't been
there. So this patch removes all the stubs.

I've kept the functionality of the old elf32_xgate_add_symbol_hook,
implemented in elf32_xgate_backend_symbol_processing. Presumably,
that's to set the symbol st_target_internal flag for use in
elf32-m68hc1x.c:elf32_m68hc11_relocate_section.

The empty elf32_xgate_relocate_section meant that xgate had no linker.
Or at least, no linker relocation processing. Deleting the
elf_backend_relocate_section define means the target will now use the
generic linker reloc processing. How good that is will depend on the
accuracy of the reloc howtos..

I haven't updated the ld testsuite to xfail tests expected to fail
for generic elf targets.

bfd/
* elf32-xgate.h: Delete.
* elf32-xgate.c: Delete unnecessary forward declarations, add two
that are now needed.
(xgate_elf_bfd_link_hash_table_create)
(xgate_elf_bfd_link_hash_table_free)
(xgate_elf_set_mach_from_flags, struct xgate_scan_param)
(stub_hash_newfunc, elf32_xgate_add_symbol_hook)
(elf32_xgate_setup_section_lists, elf32_xgate_size_stubs)
(elf32_xgate_build_stubs, elf32_xgate_check_relocs)
(elf32_xgate_relocate_section, _bfd_xgate_elf_set_private_flags)
(elf32_xgate_post_process_headers): Delete.
(elf32_xgate_backend_symbol_processing): New function.
(xgate_elf_ignore_reloc, xgate_elf_special_reloc)
(_bfd_xgate_elf_print_private_bfd_data): Make static.
(ELF_TARGET_ID, elf_info_to_howto, elf_backend_check_relocs)
(elf_backend_relocate_section, elf_backend_object_p)
(elf_backend_final_write_processing, elf_backend_can_gc_sections)
(elf_backend_post_process_headers, elf_backend_add_symbol_hook)
(bfd_elf32_bfd_link_hash_table_create)
(bfd_elf32_bfd_set_private_flags)
(xgate_stub_hash_lookup): Don't define.
(elf_backend_symbol_processing): Define.
* elf-bfd.h (elf_target_id): Delete XGATE_ELF_DATA.
ld/
* emulparams/xgateelf.sh (TEMPLATE_NAME) Set to generic.
(EXTRA_EM_FILE): Set to genelf.

Alan Modra (Jul 10, 2018, 11:59 PM +0930) 1594e052 62494068

+48 -359
+26
bfd/ChangeLog
··· 1 + 2018-07-10 Alan Modra <amodra@gmail.com> 2 + 3 + * elf32-xgate.h: Delete. 4 + * elf32-xgate.c: Delete unnecessary forward declarations, add two 5 + that are now needed. 6 + (xgate_elf_bfd_link_hash_table_create) 7 + (xgate_elf_bfd_link_hash_table_free) 8 + (xgate_elf_set_mach_from_flags, struct xgate_scan_param) 9 + (stub_hash_newfunc, elf32_xgate_add_symbol_hook) 10 + (elf32_xgate_setup_section_lists, elf32_xgate_size_stubs) 11 + (elf32_xgate_build_stubs, elf32_xgate_check_relocs) 12 + (elf32_xgate_relocate_section, _bfd_xgate_elf_set_private_flags) 13 + (elf32_xgate_post_process_headers): Delete. 14 + (elf32_xgate_backend_symbol_processing): New function. 15 + (xgate_elf_ignore_reloc, xgate_elf_special_reloc) 16 + (_bfd_xgate_elf_print_private_bfd_data): Make static. 17 + (ELF_TARGET_ID, elf_info_to_howto, elf_backend_check_relocs) 18 + (elf_backend_relocate_section, elf_backend_object_p) 19 + (elf_backend_final_write_processing, elf_backend_can_gc_sections) 20 + (elf_backend_post_process_headers, elf_backend_add_symbol_hook) 21 + (bfd_elf32_bfd_link_hash_table_create) 22 + (bfd_elf32_bfd_set_private_flags) 23 + (xgate_stub_hash_lookup): Don't define. 24 + (elf_backend_symbol_processing): Define. 25 + * elf-bfd.h (elf_target_id): Delete XGATE_ELF_DATA. 26 + 1 27 2018-07-09 Maciej W. Rozycki <macro@mips.com> 2 28 3 29 * elfxx-mips.c (_bfd_mips_elf_adjust_dynamic_symbol): Don't set
-1
bfd/elf-bfd.h
··· 515 515 TIC6X_ELF_DATA, 516 516 X86_64_ELF_DATA, 517 517 XTENSA_ELF_DATA, 518 - XGATE_ELF_DATA, 519 518 TILEGX_ELF_DATA, 520 519 TILEPRO_ELF_DATA, 521 520 RISCV_ELF_DATA,
+15 -214
bfd/elf32-xgate.c
··· 24 24 #include "bfdlink.h" 25 25 #include "libbfd.h" 26 26 #include "elf-bfd.h" 27 - #include "elf32-xgate.h" 28 27 #include "elf/xgate.h" 29 28 #include "opcode/xgate.h" 30 29 #include "libiberty.h" 31 30 32 - /* Relocation functions. */ 33 - static reloc_howto_type * 34 - bfd_elf32_bfd_reloc_type_lookup (bfd *, bfd_reloc_code_real_type); 35 - static reloc_howto_type * 36 - bfd_elf32_bfd_reloc_name_lookup (bfd *, const char *); 37 - static bfd_boolean 38 - xgate_info_to_howto_rel (bfd *, arelent *, Elf_Internal_Rela *); 39 - static bfd_boolean 40 - xgate_elf_set_mach_from_flags (bfd *); 41 - static struct bfd_hash_entry * 42 - stub_hash_newfunc (struct bfd_hash_entry *, struct bfd_hash_table *, 43 - const char *); 44 - static struct bfd_link_hash_table* 45 - xgate_elf_bfd_link_hash_table_create (bfd *); 31 + /* Forward declarations. */ 32 + static bfd_reloc_status_type xgate_elf_ignore_reloc 33 + (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 34 + static bfd_reloc_status_type xgate_elf_special_reloc 35 + (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 46 36 47 37 /* Use REL instead of RELA to save space */ 48 38 #define USE_REL 1 ··· 434 424 return TRUE; 435 425 } 436 426 437 - /* Destroy an XGATE ELF linker hash table. */ 438 - 439 - static void 440 - xgate_elf_bfd_link_hash_table_free (bfd *obfd) 441 - { 442 - struct xgate_elf_link_hash_table *ret = 443 - (struct xgate_elf_link_hash_table *) obfd->link.hash; 444 - 445 - bfd_hash_table_free (ret->stub_hash_table); 446 - free (ret->stub_hash_table); 447 - _bfd_elf_link_hash_table_free (obfd); 448 - } 449 - 450 - /* Create an XGATE ELF linker hash table. */ 451 - 452 - static struct bfd_link_hash_table* 453 - xgate_elf_bfd_link_hash_table_create (bfd *abfd) 454 - { 455 - struct xgate_elf_link_hash_table *ret; 456 - bfd_size_type amt = sizeof(struct xgate_elf_link_hash_table); 457 - 458 - ret = (struct xgate_elf_link_hash_table *) bfd_zmalloc (amt); 459 - if (ret == (struct xgate_elf_link_hash_table *) NULL) 460 - return NULL; 461 - 462 - if (!_bfd_elf_link_hash_table_init (&ret->root, abfd, 463 - _bfd_elf_link_hash_newfunc, sizeof(struct elf_link_hash_entry), 464 - XGATE_ELF_DATA)) 465 - { 466 - free (ret); 467 - return NULL; 468 - } 469 - 470 - /* Init the stub hash table too. */ 471 - amt = sizeof(struct bfd_hash_table); 472 - ret->stub_hash_table = (struct bfd_hash_table*) bfd_zmalloc (amt); 473 - if (ret->stub_hash_table == NULL) 474 - { 475 - _bfd_elf_link_hash_table_free (abfd); 476 - return NULL; 477 - } 478 - 479 - if (!bfd_hash_table_init (ret->stub_hash_table, stub_hash_newfunc, 480 - sizeof(struct elf32_xgate_stub_hash_entry))) 481 - { 482 - free (ret->stub_hash_table); 483 - _bfd_elf_link_hash_table_free (abfd); 484 - return NULL; 485 - } 486 - ret->root.root.hash_table_free = xgate_elf_bfd_link_hash_table_free; 487 - 488 - return &ret->root.root; 489 - } 490 - 491 - static bfd_boolean 492 - xgate_elf_set_mach_from_flags (bfd *abfd ATTRIBUTE_UNUSED) 493 - { 494 - return TRUE; 495 - } 496 - 497 427 /* Specific sections: 498 428 - The .page0 is a data section that is mapped in [0x0000..0x00FF]. 499 429 Page0 accesses are faster on the M68HC12. ··· 511 441 { NULL, 0, 0, 0, 0 } 512 442 }; 513 443 514 - struct xgate_scan_param 515 - { 516 - struct xgate_page_info* pinfo; 517 - bfd_boolean use_memory_banks; 518 - }; 519 - 520 - /* Assorted hash table functions. */ 521 - 522 - /* Initialize an entry in the stub hash table. */ 523 - 524 - static struct bfd_hash_entry * 525 - stub_hash_newfunc (struct bfd_hash_entry *entry, 526 - struct bfd_hash_table *table ATTRIBUTE_UNUSED, 527 - const char *string ATTRIBUTE_UNUSED) 528 - { 529 - return entry; 530 - } 531 - 532 - /* Hook called by the linker routine which adds symbols from an object 533 - file. */ 444 + /* Hook called when reading symbols. */ 534 445 535 - bfd_boolean 536 - elf32_xgate_add_symbol_hook (bfd *abfd ATTRIBUTE_UNUSED, 537 - struct bfd_link_info *info ATTRIBUTE_UNUSED, 538 - Elf_Internal_Sym *sym, 539 - const char **namep ATTRIBUTE_UNUSED, 540 - flagword *flagsp ATTRIBUTE_UNUSED, 541 - asection **secp ATTRIBUTE_UNUSED, 542 - bfd_vma *valp ATTRIBUTE_UNUSED) 446 + static void 447 + elf32_xgate_backend_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED, 448 + asymbol *sym) 543 449 { 544 - /* For some reason the st_target_internal value is not retained 545 - after xgate_frob_symbol is called, hence this temp hack. */ 546 - sym->st_target_internal = 1; 547 - return TRUE; 548 - } 549 - 550 - /* External entry points for sizing and building linker stubs. */ 551 - 552 - /* Set up various things so that we can make a list of input sections 553 - for each output section included in the link. Returns -1 on error, 554 - 0 when no stubs will be needed, and 1 on success. */ 555 - 556 - int 557 - elf32_xgate_setup_section_lists (bfd *output_bfd ATTRIBUTE_UNUSED, 558 - struct bfd_link_info *info ATTRIBUTE_UNUSED) 559 - { 560 - return 1; 561 - } 562 - 563 - /* Determine and set the size of the stub section for a final link. 564 - The basic idea here is to examine all the relocations looking for 565 - PC-relative calls to a target that is unreachable with any "9-bit PC-REL" 566 - instruction. */ 567 - 568 - bfd_boolean 569 - elf32_xgate_size_stubs (bfd *output_bfd ATTRIBUTE_UNUSED, 570 - bfd *stub_bfd ATTRIBUTE_UNUSED, 571 - struct bfd_link_info *info ATTRIBUTE_UNUSED, 572 - asection * (*add_stub_section) (const char*, asection*) ATTRIBUTE_UNUSED) 573 - { 574 - return FALSE; 575 - } 576 - 577 - /* Build all the stubs associated with the current output file. The 578 - stubs are kept in a hash table attached to the main linker hash 579 - table. This function is called via xgateelf_finish in the 580 - linker. */ 581 - 582 - bfd_boolean 583 - elf32_xgate_build_stubs (bfd *abfd ATTRIBUTE_UNUSED, 584 - struct bfd_link_info *info ATTRIBUTE_UNUSED) 585 - { 586 - return TRUE; 587 - } 588 - 589 - void 590 - xgate_elf_get_bank_parameters (struct bfd_link_info *info ATTRIBUTE_UNUSED) 591 - { 592 - return; 450 + /* Mark xgate symbols. */ 451 + ((elf_symbol_type *) sym)->internal_elf_sym.st_target_internal = 1; 593 452 } 594 453 595 454 /* This function is used for relocs which are only used for relaxing, 596 455 which the linker should otherwise ignore. */ 597 456 598 - bfd_reloc_status_type 457 + static bfd_reloc_status_type 599 458 xgate_elf_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, 600 459 arelent *reloc_entry, 601 460 asymbol *symbol ATTRIBUTE_UNUSED, ··· 609 468 return bfd_reloc_ok; 610 469 } 611 470 612 - bfd_reloc_status_type 471 + static bfd_reloc_status_type 613 472 xgate_elf_special_reloc (bfd *abfd ATTRIBUTE_UNUSED, 614 473 arelent *reloc_entry ATTRIBUTE_UNUSED, 615 474 asymbol *symbol ATTRIBUTE_UNUSED, ··· 621 480 abort (); 622 481 } 623 482 624 - /* Look through the relocs for a section during the first phase. 625 - Since we don't do .gots or .plts, we just need to consider the 626 - virtual table relocs for gc. */ 627 - 628 - bfd_boolean 629 - elf32_xgate_check_relocs (bfd *abfd ATTRIBUTE_UNUSED, 630 - struct bfd_link_info *info ATTRIBUTE_UNUSED, 631 - asection *sec ATTRIBUTE_UNUSED, 632 - const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED) 633 - { 634 - return TRUE; 635 - } 636 - 637 - /* Relocate a XGATE/S12x ELF section. */ 638 - 639 - bfd_boolean 640 - elf32_xgate_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, 641 - struct bfd_link_info *info ATTRIBUTE_UNUSED, 642 - bfd *input_bfd ATTRIBUTE_UNUSED, 643 - asection *input_section ATTRIBUTE_UNUSED, 644 - bfd_byte *contents ATTRIBUTE_UNUSED, 645 - Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED, 646 - Elf_Internal_Sym *local_syms ATTRIBUTE_UNUSED, 647 - asection **local_sections ATTRIBUTE_UNUSED) 648 - { 649 - return TRUE; 650 - } 651 - 652 - /* Set and control ELF flags in ELF header. */ 653 - 654 - bfd_boolean 655 - _bfd_xgate_elf_set_private_flags (bfd *abfd ATTRIBUTE_UNUSED, 656 - flagword flags ATTRIBUTE_UNUSED) 657 - { 658 - return TRUE; 659 - } 660 - 661 - bfd_boolean 483 + static bfd_boolean 662 484 _bfd_xgate_elf_print_private_bfd_data (bfd *abfd, void *ptr) 663 485 { 664 486 FILE *file = (FILE *) ptr; ··· 689 511 return TRUE; 690 512 } 691 513 692 - void 693 - elf32_xgate_post_process_headers (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *link_info ATTRIBUTE_UNUSED) 694 - { 695 - 696 - } 697 - 698 514 #define ELF_ARCH bfd_arch_xgate 699 515 #define ELF_MACHINE_CODE EM_XGATE 700 - #define ELF_TARGET_ID XGATE_ELF_DATA 701 516 702 517 #define ELF_MAXPAGESIZE 0x1000 703 518 704 519 #define TARGET_BIG_SYM xgate_elf32_vec 705 520 #define TARGET_BIG_NAME "elf32-xgate" 706 521 707 - #define elf_info_to_howto NULL 708 522 #define elf_info_to_howto_rel xgate_info_to_howto_rel 709 - #define elf_backend_check_relocs elf32_xgate_check_relocs 710 - #define elf_backend_relocate_section elf32_xgate_relocate_section 711 - #define elf_backend_object_p xgate_elf_set_mach_from_flags 712 - #define elf_backend_final_write_processing NULL 713 - #define elf_backend_can_gc_sections 1 714 523 #define elf_backend_special_sections elf32_xgate_special_sections 715 - #define elf_backend_post_process_headers elf32_xgate_post_process_headers 716 - #define elf_backend_add_symbol_hook elf32_xgate_add_symbol_hook 717 - 718 - #define bfd_elf32_bfd_link_hash_table_create xgate_elf_bfd_link_hash_table_create 719 - #define bfd_elf32_bfd_set_private_flags _bfd_xgate_elf_set_private_flags 524 + #define elf_backend_symbol_processing elf32_xgate_backend_symbol_processing 720 525 #define bfd_elf32_bfd_print_private_bfd_data _bfd_xgate_elf_print_private_bfd_data 721 - 722 - #define xgate_stub_hash_lookup(table, string, create, copy) \ 723 - ((struct elf32_xgate_stub_hash_entry *) \ 724 - bfd_hash_lookup ((table), (string), (create), (copy))) 725 526 726 527 #include "elf32-target.h"
-142
bfd/elf32-xgate.h
··· 1 - /* Freescale XGATE-specific support for 32-bit ELF 2 - Copyright (C) 2012-2018 Free Software Foundation, Inc. 3 - 4 - Contributed by Sean Keys (skeys@ipdatasys.com) 5 - (Heavily copied from the HC11 port by Stephane Carrez (stcarrez@nerim.fr)) 6 - 7 - This file is part of BFD, the Binary File Descriptor library. 8 - 9 - This program is free software; you can redistribute it and/or modify 10 - it under the terms of the GNU General Public License as published by 11 - the Free Software Foundation; either version 3 of the License, or 12 - (at your option) any later version. 13 - 14 - This program is distributed in the hope that it will be useful, 15 - but WITHOUT ANY WARRANTY; without even the implied warranty of 16 - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 - GNU General Public License for more details. 18 - 19 - You should have received a copy of the GNU General Public License 20 - along with this program; if not, write to the Free Software 21 - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 22 - MA 02110-1301, USA. */ 23 - 24 - #ifndef _ELF32_XGATE_H 25 - #define _ELF32_XGATE_H 26 - 27 - #include "elf-bfd.h" 28 - #include "bfdlink.h" 29 - #include "elf/xgate.h" 30 - 31 - /* Set and control ELF flags in ELF header. */ 32 - extern bfd_boolean _bfd_xgate_elf_set_private_flags (bfd*,flagword); 33 - extern bfd_boolean _bfd_xgate_elf_print_private_bfd_data (bfd*, void*); 34 - 35 - struct elf32_xgate_stub_hash_entry 36 - { 37 - /* Base hash table entry structure. */ 38 - struct bfd_hash_entry root; 39 - 40 - /* The stub section. */ 41 - asection *stub_sec; 42 - 43 - /* Offset within stub_sec of the beginning of this stub. */ 44 - bfd_vma stub_offset; 45 - 46 - /* Given the symbol's value and its section we can determine its final 47 - value when building the stubs (so the stub knows where to jump. */ 48 - bfd_vma target_value; 49 - asection *target_section; 50 - }; 51 - 52 - struct xgate_page_info 53 - { 54 - bfd_vma bank_virtual; 55 - bfd_vma bank_physical; 56 - bfd_vma bank_physical_end; 57 - bfd_vma bank_mask; 58 - bfd_vma bank_size; 59 - int bank_shift; 60 - int bank_param_initialized; 61 - bfd_vma trampoline_addr; 62 - }; 63 - 64 - struct xgate_elf_link_hash_table 65 - { 66 - struct elf_link_hash_table root; 67 - struct xgate_page_info pinfo; 68 - 69 - /* The stub hash table. */ 70 - struct bfd_hash_table* stub_hash_table; 71 - 72 - /* Linker stub bfd. */ 73 - bfd *stub_bfd; 74 - 75 - asection* stub_section; 76 - asection* tramp_section; 77 - 78 - /* Linker call-backs. */ 79 - asection * (*add_stub_section) (const char *, asection *); 80 - 81 - /* Assorted information used by elf32_hppa_size_stubs. */ 82 - unsigned int bfd_count; 83 - int top_index; 84 - asection ** input_list; 85 - 86 - /* Small local sym cache. */ 87 - struct sym_cache sym_cache; 88 - 89 - bfd_boolean (*size_one_stub) (struct bfd_hash_entry*, void*); 90 - bfd_boolean (*build_one_stub) (struct bfd_hash_entry*, void*); 91 - }; 92 - 93 - /* Get the XGate ELF linker hash table from a link_info structure. */ 94 - 95 - #define xgate_elf_hash_table(p) \ 96 - ((struct xgate_elf_link_hash_table *) ((p)->hash)) 97 - 98 - /* Create a XGATE ELF linker hash table. */ 99 - 100 - extern struct xgate_elf_link_hash_table* xgate_elf_hash_table_create 101 - (bfd *); 102 - 103 - extern void xgate_elf_get_bank_parameters (struct bfd_link_info *); 104 - 105 - /* Return 1 if the address is in banked memory. 106 - This can be applied to a virtual address and to a physical address. */ 107 - extern int xgate_addr_is_banked (struct xgate_page_info *, bfd_vma); 108 - 109 - /* Return the physical address seen by the processor, taking 110 - into account banked memory. */ 111 - extern bfd_vma xgate_phys_addr (struct xgate_page_info *, bfd_vma); 112 - 113 - /* Return the page number corresponding to an address in banked memory. */ 114 - extern bfd_vma xgate_phys_page (struct xgate_page_info *, bfd_vma); 115 - 116 - bfd_reloc_status_type xgate_elf_ignore_reloc 117 - (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 118 - bfd_reloc_status_type xgate_elf_special_reloc 119 - (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 120 - 121 - bfd_boolean elf32_xgate_check_relocs 122 - (bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *); 123 - bfd_boolean elf32_xgate_relocate_section 124 - (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, 125 - Elf_Internal_Rela *, Elf_Internal_Sym *, asection **); 126 - 127 - bfd_boolean elf32_xgate_add_symbol_hook 128 - (bfd *, struct bfd_link_info *, Elf_Internal_Sym *, const char **, 129 - flagword *, asection **, bfd_vma *); 130 - 131 - /* Tweak the OSABI field of the elf header. */ 132 - extern void elf32_xgate_post_process_headers (bfd *, struct bfd_link_info *); 133 - 134 - int elf32_xgate_setup_section_lists (bfd *, struct bfd_link_info *); 135 - 136 - bfd_boolean elf32_xgate_size_stubs 137 - (bfd *, bfd *, struct bfd_link_info *, 138 - asection * (*) (const char *, asection *)); 139 - 140 - bfd_boolean elf32_xgate_build_stubs (bfd * abfd, struct bfd_link_info *); 141 - 142 - #endif /* _ELF32_XGATE_H */
+5
ld/ChangeLog
··· 1 + 2018-07-10 Alan Modra <amodra@gmail.com> 2 + 3 + * emulparams/xgateelf.sh (TEMPLATE_NAME) Set to generic. 4 + (EXTRA_EM_FILE): Set to genelf. 5 + 1 6 2018-07-10 Alan Modra <amodra@gmail.com> 2 7 3 8 * testsuite/ld-elf/attributes.d: Use xfail rather than notarget.
+2 -2
ld/emulparams/xgateelf.sh
··· 1 1 MACHINE= 2 + TEMPLATE_NAME=generic 3 + EXTRA_EM_FILE=genelf 2 4 SCRIPT_NAME=elfxgate 3 5 OUTPUT_FORMAT="elf32-xgate" 4 6 ROM_START_ADDR=0x08000 ··· 14 16 MAXPAGESIZE=32 15 17 EMBEDDED=yes 16 18 GENERIC_BOARD=no 17 - TEMPLATE_NAME=elf32 18 - EXTRA_EM_FILE=