X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;ds=sidebyside;f=ld%2Femultempl%2Flnk960.em;h=6d52801028510598f46ca420b7d07d9e51b7991d;hb=b90efa5b79ac1524ec260f8eb89d1be37e0219a7;hp=066d46bb32863974237ea02d52dd0a16c14c1b1b;hpb=dc9e099fc0eced486ae2b49455c9da113c11f4ff;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/emultempl/lnk960.em b/ld/emultempl/lnk960.em index 066d46bb32..6d52801028 100644 --- a/ld/emultempl/lnk960.em +++ b/ld/emultempl/lnk960.em @@ -1,39 +1,40 @@ # This shell script emits a C file. -*- C -*- # It does some substitutions. -cat >e${EMULATION_NAME}.c <name = name; - element->next = (lib_list_type *)NULL; + element->next = (lib_list_type *) NULL; **list = element; *list = &element->next; } -static boolean had_hll = false; -static boolean had_hll_name = false; +static bfd_boolean had_hll = FALSE; +static bfd_boolean had_hll_name = FALSE; static void -lnk960_hll(name) - char *name; +lnk960_hll (char *name) { - had_hll = true; - if (name != (char *)NULL) { - had_hll_name = true; - append(&hll_list_tail, name); - } + had_hll = TRUE; + if (name != (char *) NULL) + { + had_hll_name = TRUE; + append (&hll_list_tail, name); + } } -static void -lnk960_syslib(name) - char *name; +static void +lnk960_syslib (char *name) { - append(&syslib_list_tail,name); + append (&syslib_list_tail, name); } -#ifdef GNU960 - -static void -lnk960_before_parse() +static void +lnk960_before_parse (void) { - static char *env_variables[] = { "G960LIB", "G960BASE", 0 }; - char **p; - char *env ; - - for ( p = env_variables; *p; p++ ){ - env = (char *) getenv(*p); - if (env) { - ldfile_add_library_path(concat(env,"/lib/libcoff",""), false); - } - } + char *name = getenv ("I960BASE"); - env= (char *) getenv("I960BASE"); - if ( env ) { - ldfile_add_library_path(concat(env,"/lib",""), false); - } + if (name == (char *) NULL) + { + name = getenv("G960BASE"); + if (name == (char *) NULL) + einfo ("%P%F I960BASE and G960BASE not set\n"); + } + ldfile_add_library_path (concat (name, "/lib", (const char *) NULL), FALSE); ldfile_output_architecture = bfd_arch_i960; ldfile_output_machine = bfd_mach_i960_core; } -#else /* not GNU960 */ +static void +add_on (lib_list_type *list, lang_input_file_enum_type search) +{ + while (list) + { + lang_add_input_file (list->name, search, (char *) NULL); + list = list->next; + } +} -static void -lnk960_before_parse() +static void +lnk960_after_parse (void) { - char *name = getenv("I960BASE"); + /* If there has been no arch, default to -KB */ + if (ldfile_output_machine_name[0] == 0) + ldfile_add_arch ("KB"); - if (name == (char *)NULL) { - name = getenv("G960BASE"); - if (name == (char *)NULL) { - einfo("%P%F I960BASE and G960BASE not set\n"); - } - } + /* if there has been no hll list then add our own */ + if (had_hll && !had_hll_name) + { + append (&hll_list_tail, "cg"); + if (ldfile_output_machine == bfd_mach_i960_ka_sa + || ldfile_output_machine == bfd_mach_i960_ca) + append (&hll_list_tail, "fpg"); + } - ldfile_add_library_path(concat(name,"/lib",""), false); - ldfile_output_architecture = bfd_arch_i960; - ldfile_output_machine = bfd_mach_i960_core; + add_on (hll_list, lang_input_file_is_l_enum); + add_on (syslib_list, lang_input_file_is_search_file_enum); } -#endif /* GNU960 */ +/* Create a symbol with the given name with the value of the + address of first byte of the section named. + If the symbol already exists, then do nothing. */ static void -add_on(list, search) - lib_list_type *list; - lang_input_file_enum_type search; -{ - while (list) { - lang_add_input_file(list->name, - search, - (char *)NULL); - list = list->next; - } -} -static void -lnk960_after_parse() +symbol_at_beginning_of (const char *secname, const char *name) { - /* If there has been no arch, default to -KB */ - if (ldfile_output_machine_name[0] ==0) { - ldfile_add_arch("KB"); - } + struct bfd_link_hash_entry *h; - /* if there has been no hll list then add our own */ - - if(had_hll && !had_hll_name) { - append(&hll_list_tail,"cg"); - if (ldfile_output_machine == bfd_mach_i960_ka_sa || - ldfile_output_machine == bfd_mach_i960_ca) { - { - append(&hll_list_tail,"fpg"); - } + h = bfd_link_hash_lookup (link_info.hash, name, TRUE, TRUE, TRUE); + if (h == NULL) + einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n")); + + if (h->type == bfd_link_hash_new + || h->type == bfd_link_hash_undefined) + { + asection *sec; + + h->type = bfd_link_hash_defined; + + sec = bfd_get_section_by_name (link_info.output_bfd, secname); + if (sec == NULL) + sec = bfd_abs_section_ptr; + h->u.def.value = 0; + h->u.def.section = sec; } - } - - add_on(hll_list, lang_input_file_is_l_enum); - add_on(syslib_list, lang_input_file_is_search_file_enum); } +/* Create a symbol with the given name with the value of the + address of the first byte after the end of the section named. + + If the symbol already exists, then do nothing. */ + static void -lnk960_before_allocation() +symbol_at_end_of (const char *secname, const char *name) { + struct bfd_link_hash_entry *h; + + h = bfd_link_hash_lookup (link_info.hash, name, TRUE, TRUE, TRUE); + if (h == NULL) + einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n")); + + if (h->type == bfd_link_hash_new + || h->type == bfd_link_hash_undefined) + { + asection *sec; + + h->type = bfd_link_hash_defined; + + sec = bfd_get_section_by_name (link_info.output_bfd, secname); + if (sec == NULL) + sec = bfd_abs_section_ptr; + h->u.def.value = sec->size; + h->u.def.section = sec; + } } static void -lnk960_after_allocation() +lnk960_after_allocation (void) { - if (link_info.relocateable == false) { - lang_abs_symbol_at_end_of(".text","_etext"); - lang_abs_symbol_at_end_of(".data","_edata"); - lang_abs_symbol_at_beginning_of(".bss","_bss_start"); - lang_abs_symbol_at_end_of(".bss","_end"); - } + if (!link_info.relocatable) + { + symbol_at_end_of (".text", "_etext"); + symbol_at_end_of (".data", "_edata"); + symbol_at_beginning_of (".bss", "_bss_start"); + symbol_at_end_of (".bss", "_end"); + } } static struct { unsigned long number; - char *name; + char *name; } machine_table[] = { @@ -218,83 +233,75 @@ machine_table[] = }; static void -lnk960_set_output_arch() +lnk960_set_output_arch (void) { /* Set the output architecture and machine if possible */ unsigned int i; ldfile_output_machine = bfd_mach_i960_core; - for (i= 0; machine_table[i].name != (char*)NULL; i++) { - if (strcmp(ldfile_output_machine_name,machine_table[i].name)==0) { - ldfile_output_machine = machine_table[i].number; - break; + for (i= 0; machine_table[i].name != (char*) NULL; i++) + { + if (strcmp (ldfile_output_machine_name, machine_table[i].name) == 0) + { + ldfile_output_machine = machine_table[i].number; + break; + } } - } - bfd_set_arch_mach(output_bfd, ldfile_output_architecture, ldfile_output_machine); + bfd_set_arch_mach (link_info.output_bfd, ldfile_output_architecture, + ldfile_output_machine); } static char * -lnk960_choose_target() +lnk960_choose_target (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { -#ifdef GNU960 - - return bfd_make_targ_name(BFD_COFF_FORMAT, 0); - -#else - - char *from_outside = getenv(TARGET_ENVIRON); - if (from_outside != (char *)NULL) + char *from_outside = getenv (TARGET_ENVIRON); + if (from_outside != (char *) NULL) return from_outside; #ifdef LNK960_LITTLE return "coff-Intel-little"; #else return "coff-Intel-big"; #endif -#endif - } static char * -lnk960_get_script(isfile) - int *isfile; +lnk960_get_script (int *isfile) EOF -if test -n "$COMPILE_IN" +if test x"$COMPILE_IN" = xyes then # Scripts compiled in. # sed commands to quote an ld script as a C string. -sc='s/["\\]/\\&/g -s/$/\\n\\/ -1s/^/"/ -$s/$/n"/ -' +sc="-f stringify.sed" -cat >>e${EMULATION_NAME}.c <> e${EMULATION_NAME}.c +echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c +echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c +echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c +echo ' ; else return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c +echo '; }' >> e${EMULATION_NAME}.c else # Scripts read from the filesystem. -cat >>e${EMULATION_NAME}.c <>e${EMULATION_NAME}.c <