/* This file is is generated by a shell script. DO NOT EDIT! */ /* emulate the original gld for the given amiga Copyright (C) 1991, 1993 Free Software Foundation, Inc. Written by Steve Chamberlain steve@cygnus.com This file is part of GLD, the Gnu Linker. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #define TARGET_IS_amiga #include "sysdep.h" #include "bfd.h" #include "bfdlink.h" #include "getopt.h" #include "ctf-api.h" #include "ld.h" #include "ldmain.h" #include "ldmisc.h" #include "ldexp.h" #include "ldlang.h" #include "ldfile.h" #include "ldemul.h" #include "ldctor.h" #include "libamiga.h" #ifndef PARAMS #define PARAMS(a) a #endif /* shared functions */ void amiga_add_options PARAMS ((int, char **, int, struct option **, int, struct option **)); bool amiga_handle_option PARAMS ((int)); void amiga_after_parse PARAMS ((void)); void amiga_after_open PARAMS ((void)); void amiga_after_allocation PARAMS ((void)); /* amigaoslink.c variables */ /* 1 means, write out debug hunk, when producing a load file */ extern int write_debug_hunk; /* This is the attribute to use for the next file */ extern int amiga_attribute; /* generate a combined data+bss hunk */ extern int amiga_base_relative; /* generate a resident executable */ extern int amiga_resident; static void gldamiga_before_parse PARAMS ((void)); static char *gldamiga_get_script PARAMS ((int *isfile)); #if defined(TARGET_IS_amiga) /* Handle amiga specific options */ enum { OPTION_IGNORE = 300, OPTION_AMIGA_CHIP, OPTION_AMIGA_FAST, OPTION_AMIGA_ATTRIBUTE, OPTION_AMIGA_DEBUG, OPTION_AMIGA_DATABSS_TOGETHER, OPTION_AMIGA_DATADATA_RELOC, OPTION_FLAVOR }; void amiga_add_options (ns, shortopts, nl, longopts, nrl, really_longopts) int ns ATTRIBUTE_UNUSED; char **shortopts ATTRIBUTE_UNUSED; int nl; struct option **longopts; int nrl ATTRIBUTE_UNUSED; struct option **really_longopts ATTRIBUTE_UNUSED; { static const struct option xtra_long[] = { {"flavor", required_argument, NULL, OPTION_FLAVOR}, {"amiga-datadata-reloc", no_argument, NULL, OPTION_AMIGA_DATADATA_RELOC}, {"amiga-databss-together", no_argument, NULL, OPTION_AMIGA_DATABSS_TOGETHER}, {"amiga-debug-hunk", no_argument, NULL, OPTION_AMIGA_DEBUG}, {"attribute", required_argument, NULL, OPTION_AMIGA_ATTRIBUTE}, {"fast", no_argument, NULL, OPTION_AMIGA_FAST}, {"chip", no_argument, NULL, OPTION_AMIGA_CHIP}, {"fl", required_argument, NULL, OPTION_FLAVOR}, {NULL, no_argument, NULL, 0} }; *longopts = (struct option *) xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long)); memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long)); } bool amiga_handle_option (optc) int optc; { switch (optc) { default: return false; case 0: /* Long option which just sets a flag. */ break; case OPTION_AMIGA_CHIP: amiga_attribute = MEMF_CHIP; break; case OPTION_AMIGA_FAST: amiga_attribute = MEMF_FAST; break; case OPTION_AMIGA_ATTRIBUTE: { char *end; amiga_attribute = strtoul (optarg, &end, 0); if (*end) einfo ("%P%F: invalid number `%s\'\n", optarg); } break; case OPTION_AMIGA_DEBUG: write_debug_hunk = 1; /* Write out debug hunk */ break; case OPTION_AMIGA_DATABSS_TOGETHER: amiga_base_relative = 1; /* Combine data and bss */ break; case OPTION_AMIGA_DATADATA_RELOC: amiga_resident = 1; /* Write out datadata_reloc array */ break; case OPTION_FLAVOR: ldfile_add_flavor (optarg); break; } return true; } void amiga_after_parse () { extern struct bfd_link_info link_info; extern void amiga_set_link_info(struct bfd_link_info * link_info); amiga_set_link_info(&link_info); ldfile_sort_flavors(); } void amiga_after_open () { ldctor_build_sets (); } static void amiga_assign_attribute (lang_input_statement_type *inp) { asection *s; if (bfd_get_flavour(inp->the_bfd)==bfd_target_amiga_flavour) { for (s=inp->the_bfd->sections;s!=NULL;s=s->next) amiga_per_section(s)->attribute=inp->amiga_attribute; } } void amiga_after_allocation () { if (0) /* Does not work at the moment */ lang_for_each_input_file (amiga_assign_attribute); } #endif static void gldamiga_before_parse () { write_debug_hunk = 0; #if defined(TARGET_IS_amiga_bss) amiga_base_relative = 1; config.has_shared = true; #endif #ifndef TARGET_ /* I.e., if not generic. */ ldfile_output_architecture = bfd_arch_m68k; #endif /* not TARGET_ */ } static char * gldamiga_get_script (isfile) int *isfile; { *isfile = 0; if (link_info.type == 1 && config.build_constructors == true) return "/* Script for -Ur */\n\ OUTPUT_FORMAT(\"amiga\")\n\ OUTPUT_ARCH(m68k)\n\ SECTIONS\n\ {\n\ .text :\n\ {\n\ *(.text)\n\ *(.text.main)\n\ *(.text*)\n\ *(_*)\n\ *(.rodata*)\n\ *(.data.rel.ro*)\n\ *(.gnu.linkonce.t.*)\n\ *(.gnu.linkonce.r.*)\n\ *(.gcc_except_table*)\n\ *(SORT_BY_NAME(.list___EH_FRAME*))\n\ *(SORT_BY_NAME(.list_*))\n\ *(.end_of_lists)\n\ }\n\ .data :\n\ {\n\ *(.data)\n\ *(SORT_BY_NAME(.data.*))\n\ CONSTRUCTORS\n" " *(SORT_BY_NAME(.dlist___EH_FRAME_OBJECT*))\n\ *(SORT_BY_NAME(.dlist_*))\n\ *(.end_of_dlists)\n\ *(.data.__EH_FRAME_OBJECT__*)\n\ *(.gnu.linkonce.d.*)\n\ }\n\ .bss :\n\ {\n\ *(.bss)\n\ *(.bss.*)\n\ *(COMMON)\n\ }\n\ .datachip :\n\ {\n\ *(.datachip)\n\ }\n\ .bsschip :\n\ {\n\ *(.bsschip)\n\ }\n\ .dwarf :\n\ {\n\ *(.debug_frame)\n\ *(.debug_info)\n\ *(.debug_abbrev)\n" " *(.debug_loclists)\n\ *(.debug_aranges)\n\ *(.debug_rnglists)\n\ *(.debug_line)\n\ *(.debug_str)\n\ *(.debug_line_str)\n\ }\n\ }\n\n" ; else if (link_info.type == 1) return "/* Script for -r */\n\ OUTPUT_FORMAT(\"amiga\")\n\ OUTPUT_ARCH(m68k)\n\ SECTIONS\n\ {\n\ .text :\n\ {\n\ *(.text)\n\ *(.text.main)\n\ *(.text*)\n\ *(_*)\n\ *(.rodata*)\n\ *(.data.rel.ro*)\n\ *(.gnu.linkonce.t.*)\n\ *(.gnu.linkonce.r.*)\n\ *(.gcc_except_table*)\n\ *(SORT_BY_NAME(.list___EH_FRAME*))\n\ *(SORT_BY_NAME(.list_*))\n\ *(.end_of_lists)\n\ }\n\ .data :\n\ {\n\ *(.data)\n\ *(SORT_BY_NAME(.data.*))\n\ *(SORT_BY_NAME(.dlist___EH_FRAME_OBJECT*))\n" " *(SORT_BY_NAME(.dlist_*))\n\ *(.end_of_dlists)\n\ *(.data.__EH_FRAME_OBJECT__*)\n\ *(.gnu.linkonce.d.*)\n\ }\n\ .bss :\n\ {\n\ *(.bss)\n\ *(.bss.*)\n\ *(COMMON)\n\ }\n\ .datachip :\n\ {\n\ *(.datachip)\n\ }\n\ .bsschip :\n\ {\n\ *(.bsschip)\n\ }\n\ .dwarf :\n\ {\n\ *(.debug_frame)\n\ *(.debug_info)\n\ *(.debug_abbrev)\n\ *(.debug_loclists)\n" " *(.debug_aranges)\n\ *(.debug_rnglists)\n\ *(.debug_line)\n\ *(.debug_str)\n\ *(.debug_line_str)\n\ }\n\ }\n\n" ; else if (!config.text_read_only) return "/* Script for -N */\n\ OUTPUT_FORMAT(\"amiga\")\n\ OUTPUT_ARCH(m68k)\n\ SEARCH_DIR(\"/opt/amiga/m68k-amigaos/lib\");\n\ SECTIONS\n\ {\n\ PROVIDE(___machtype = 0x0);\n\ . = 0x0;\n\ .text :\n\ {\n\ __stext = .;\n\ *(.text)\n\ *(.text.main)\n\ *(.text*)\n\ *(_*)\n\ *(.rodata*)\n\ *(.data.rel.ro*)\n\ *(.gnu.linkonce.t.*)\n\ *(.gnu.linkonce.r.*)\n\ *(.gcc_except_table*)\n\ *(SORT_BY_NAME(.list___EH_FRAME*))\n\ *(SORT_BY_NAME(.list_*))\n\ *(.end_of_lists)\n\ ___datadata_relocs = .;\n\ __etext = .;\n" " }\n\ ___text_size = SIZEOF(.text);\n\ . = .;\n\ .data :\n\ {\n\ __sdata = .;\n\ *(.data)\n\ *(SORT_BY_NAME(.data.*))\n\ CONSTRUCTORS\n\ *(SORT_BY_NAME(.dlist___EH_FRAME_OBJECT*))\n\ *(SORT_BY_NAME(.dlist_*))\n\ *(.end_of_dlists)\n\ *(.data.__EH_FRAME_OBJECT__*)\n\ *(.gnu.linkonce.d.*)\n\ __edata = .;\n\ }\n\ ___data_size = SIZEOF(.data);\n\ .bss :\n\ {\n\ __bss_start = .;\n\ *(.bss)\n\ *(.bss.*)\n\ *(COMMON)\n\ __end = .;\n\ }\n" " ___bss_size = SIZEOF(.bss);\n\ .datachip :\n\ {\n\ *(.datachip)\n\ }\n\ .bsschip :\n\ {\n\ *(.bsschip)\n\ }\n\ .dwarf :\n\ {\n\ __debug_frame_start = .;\n\ *(.debug_frame)\n\ __debug_info_start = .;\n\ *(.debug_info)\n\ __debug_abbrev_start = .;\n\ *(.debug_abbrev)\n\ __debug_loclists_start = .;\n\ *(.debug_loclists)\n\ __debug_aranges_start = .;\n\ *(.debug_aranges)\n\ __debug_rgnlists_start = .;\n\ *(.debug_rnglists)\n\ __debug_line_start = .;\n\ *(.debug_line)\n" " __debug_str_start = .;\n\ *(.debug_str)\n\ __debug_line_str_start = .;\n\ *(.debug_line_str)\n\ }\n\ }\n\n" ; else if (!config.magic_demand_paged) return "/* Script for -n */\n\ OUTPUT_FORMAT(\"amiga\")\n\ OUTPUT_ARCH(m68k)\n\ SEARCH_DIR(\"/opt/amiga/m68k-amigaos/lib\");\n\ SECTIONS\n\ {\n\ PROVIDE(___machtype = 0x0);\n\ . = 0x0;\n\ .text :\n\ {\n\ __stext = .;\n\ *(.text)\n\ *(.text.main)\n\ *(.text*)\n\ *(_*)\n\ *(.rodata*)\n\ *(.data.rel.ro*)\n\ *(.gnu.linkonce.t.*)\n\ *(.gnu.linkonce.r.*)\n\ *(.gcc_except_table*)\n\ *(SORT_BY_NAME(.list___EH_FRAME*))\n\ *(SORT_BY_NAME(.list_*))\n\ *(.end_of_lists)\n\ ___datadata_relocs = .;\n\ __etext = .;\n" " }\n\ ___text_size = SIZEOF(.text);\n\ . = ALIGN(0x0);\n\ .data :\n\ {\n\ __sdata = .;\n\ *(.data)\n\ *(SORT_BY_NAME(.data.*))\n\ CONSTRUCTORS\n\ *(SORT_BY_NAME(.dlist___EH_FRAME_OBJECT*))\n\ *(SORT_BY_NAME(.dlist_*))\n\ *(.end_of_dlists)\n\ *(.data.__EH_FRAME_OBJECT__*)\n\ *(.gnu.linkonce.d.*)\n\ __edata = .;\n\ }\n\ ___data_size = SIZEOF(.data);\n\ .bss :\n\ {\n\ __bss_start = .;\n\ *(.bss)\n\ *(.bss.*)\n\ *(COMMON)\n\ __end = .;\n\ }\n" " ___bss_size = SIZEOF(.bss);\n\ .datachip :\n\ {\n\ *(.datachip)\n\ }\n\ .bsschip :\n\ {\n\ *(.bsschip)\n\ }\n\ .dwarf :\n\ {\n\ __debug_frame_start = .;\n\ *(.debug_frame)\n\ __debug_info_start = .;\n\ *(.debug_info)\n\ __debug_abbrev_start = .;\n\ *(.debug_abbrev)\n\ __debug_loclists_start = .;\n\ *(.debug_loclists)\n\ __debug_aranges_start = .;\n\ *(.debug_aranges)\n\ __debug_rgnlists_start = .;\n\ *(.debug_rnglists)\n\ __debug_line_start = .;\n\ *(.debug_line)\n" " __debug_str_start = .;\n\ *(.debug_str)\n\ __debug_line_str_start = .;\n\ *(.debug_line_str)\n\ }\n\ }\n\n" ; else return "/* Default linker script, for normal executables */\n\ OUTPUT_FORMAT(\"amiga\")\n\ OUTPUT_ARCH(m68k)\n\ SEARCH_DIR(\"/opt/amiga/m68k-amigaos/lib\");\n\ SECTIONS\n\ {\n\ PROVIDE(___machtype = 0x0);\n\ . = 0x0;\n\ .text :\n\ {\n\ __stext = .;\n\ *(.text)\n\ *(.text.main)\n\ *(.text*)\n\ *(_*)\n\ *(.rodata*)\n\ *(.data.rel.ro*)\n\ *(.gnu.linkonce.t.*)\n\ *(.gnu.linkonce.r.*)\n\ *(.gcc_except_table*)\n\ *(SORT_BY_NAME(.list___EH_FRAME*))\n\ *(SORT_BY_NAME(.list_*))\n\ *(.end_of_lists)\n\ ___datadata_relocs = .;\n\ __etext = .;\n" " }\n\ ___text_size = SIZEOF(.text);\n\ . = ALIGN(0x0);\n\ .data :\n\ {\n\ __sdata = .;\n\ *(.data)\n\ *(SORT_BY_NAME(.data.*))\n\ CONSTRUCTORS\n\ *(SORT_BY_NAME(.dlist___EH_FRAME_OBJECT*))\n\ *(SORT_BY_NAME(.dlist_*))\n\ *(.end_of_dlists)\n\ *(.data.__EH_FRAME_OBJECT__*)\n\ *(.gnu.linkonce.d.*)\n\ __edata = .;\n\ }\n\ ___data_size = SIZEOF(.data);\n\ .bss :\n\ {\n\ __bss_start = .;\n\ *(.bss)\n\ *(.bss.*)\n\ *(COMMON)\n\ __end = .;\n\ }\n" " ___bss_size = SIZEOF(.bss);\n\ .datachip :\n\ {\n\ *(.datachip)\n\ }\n\ .bsschip :\n\ {\n\ *(.bsschip)\n\ }\n\ .dwarf :\n\ {\n\ __debug_frame_start = .;\n\ *(.debug_frame)\n\ __debug_info_start = .;\n\ *(.debug_info)\n\ __debug_abbrev_start = .;\n\ *(.debug_abbrev)\n\ __debug_loclists_start = .;\n\ *(.debug_loclists)\n\ __debug_aranges_start = .;\n\ *(.debug_aranges)\n\ __debug_rgnlists_start = .;\n\ *(.debug_rnglists)\n\ __debug_line_start = .;\n\ *(.debug_line)\n" " __debug_str_start = .;\n\ *(.debug_str)\n\ __debug_line_str_start = .;\n\ *(.debug_line_str)\n\ }\n\ }\n\n" ; } struct ld_emulation_xfer_struct ld_amiga_emulation = { gldamiga_before_parse, /* before_parse */ syslib_default, /* syslib */ hll_default, /* hll */ amiga_after_parse, /* after_parse */ NULL, /* LDEMUL_BEFORE_PLUGIN_ALL_SYMBOLS_READ */ amiga_after_open, /* after_open */ after_check_relocs_default, before_place_orphans_default, amiga_after_allocation, /* after_allocation */ set_output_arch_default, /* set_output_arch */ ldemul_default_target, /* choose_target */ before_allocation_default, /* before_allocation */ gldamiga_get_script, /* get_script */ "amiga", /* emulation_name */ "amiga", /* target_name */ finish_default, /* finish */ NULL, /* create_output_section_statements */ NULL, /* open_dynamic_library */ NULL, /* place_orphan */ NULL, /* set_symbols */ NULL, /* parse_args */ amiga_add_options, /* add_options */ amiga_handle_option, /* handle_option */ NULL, /* unrecognized file */ NULL, /* list_options */ NULL, /* recognized_file */ NULL, /* find potential_libraries */ NULL, /* new_vers_pattern */ NULL, /* extra_map_file_text */ NULL, /* emit_ctf_early */ NULL, /* examine_strtab_for_ctf */ NULL /* print_symbol */ };