X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bfd%2Ftargets.c;h=0bfc104dbbf89403b6b1ae3ee3213d386de20d51;hb=7a9068fe16462c35cdccd371fe588111dd1866ea;hp=ba56a44a7c32794f02735df6905fb512cb658a9c;hpb=154a1ee56c0283227aa6268ddbefe372c34e642a;p=external%2Fbinutils.git diff --git a/bfd/targets.c b/bfd/targets.c index ba56a44..0bfc104 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -1,6 +1,6 @@ /* Generic target-file-type support for the BFD library. Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 + 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Written by Cygnus Support. @@ -176,6 +176,10 @@ DESCRIPTION . .{* Forward declaration. *} .typedef struct bfd_link_info _bfd_link_info; +.struct already_linked; +. +.{* Forward declaration. *} +.typedef struct flag_info flag_info; . .typedef struct bfd_target .{ @@ -208,7 +212,11 @@ DESCRIPTION . char ar_pad_char; . . {* The maximum number of characters in an archive header. *} -. unsigned short ar_max_namelen; +. unsigned char ar_max_namelen; +. +. {* How well this target matches, used to select between various +. possible targets when more than one target matches. *} +. unsigned char match_priority; . . {* Entries for byte swapping for data. These are different from the . other entry points, since they don't take a BFD as the first argument. @@ -314,11 +322,13 @@ BFD_JUMP_TABLE macros. .#define BFD_JUMP_TABLE_CORE(NAME) \ . NAME##_core_file_failing_command, \ . NAME##_core_file_failing_signal, \ -. NAME##_core_file_matches_executable_p +. NAME##_core_file_matches_executable_p, \ +. NAME##_core_file_pid . . char * (*_core_file_failing_command) (bfd *); . int (*_core_file_failing_signal) (bfd *); . bfd_boolean (*_core_file_matches_executable_p) (bfd *, bfd *); +. int (*_core_file_pid) (bfd *); . . {* Archive entry points. *} .#define BFD_JUMP_TABLE_ARCHIVE(NAME) \ @@ -328,6 +338,7 @@ BFD_JUMP_TABLE macros. . NAME##_truncate_arname, \ . NAME##_write_armap, \ . NAME##_read_ar_hdr, \ +. NAME##_write_ar_hdr, \ . NAME##_openr_next_archived_file, \ . NAME##_get_elt_at_index, \ . NAME##_generic_stat_arch_elt, \ @@ -341,6 +352,7 @@ BFD_JUMP_TABLE macros. . bfd_boolean (*write_armap) . (bfd *, unsigned int, struct orl *, unsigned int, int); . void * (*_bfd_read_ar_hdr_fn) (bfd *); +. bfd_boolean (*_bfd_write_ar_hdr_fn) (bfd *, bfd *); . bfd * (*openr_next_archived_file) (bfd *, bfd *); .#define bfd_get_elt_at_index(b,i) BFD_SEND (b, _bfd_get_elt_at_index, (b,i)) . bfd * (*_bfd_get_elt_at_index) (bfd *, symindex); @@ -436,9 +448,11 @@ BFD_JUMP_TABLE macros. . NAME##_bfd_link_hash_table_free, \ . NAME##_bfd_link_add_symbols, \ . NAME##_bfd_link_just_syms, \ +. NAME##_bfd_copy_link_hash_symbol_type, \ . NAME##_bfd_final_link, \ . NAME##_bfd_link_split_section, \ . NAME##_bfd_gc_sections, \ +. NAME##_bfd_lookup_section_flags, \ . NAME##_bfd_merge_sections, \ . NAME##_bfd_is_group_section, \ . NAME##_bfd_discard_group, \ @@ -467,6 +481,12 @@ BFD_JUMP_TABLE macros. . {* Indicate that we are only retrieving symbol values from this section. *} . void (*_bfd_link_just_syms) (asection *, struct bfd_link_info *); . +. {* Copy the symbol type of a linker hash table entry. *} +.#define bfd_copy_link_hash_symbol_type(b, t, f) \ +. BFD_SEND (b, _bfd_copy_link_hash_symbol_type, (b, t, f)) +. void (*_bfd_copy_link_hash_symbol_type) +. (bfd *, struct bfd_link_hash_entry *, struct bfd_link_hash_entry *); +. . {* Do a link based on the link_order structures attached to each . section of the BFD. *} . bfd_boolean (*_bfd_final_link) (bfd *, struct bfd_link_info *); @@ -477,6 +497,10 @@ BFD_JUMP_TABLE macros. . {* Remove sections that are not referenced from the output. *} . bfd_boolean (*_bfd_gc_sections) (bfd *, struct bfd_link_info *); . +. {* Sets the bitmask of allowed and disallowed section flags. *} +. void (*_bfd_lookup_section_flags) (struct bfd_link_info *, +. struct flag_info *); +. . {* Attempt to merge SEC_MERGE sections. *} . bfd_boolean (*_bfd_merge_sections) (bfd *, struct bfd_link_info *); . @@ -488,7 +512,7 @@ BFD_JUMP_TABLE macros. . . {* Check if SEC has been already linked during a reloceatable or . final link. *} -. void (*_section_already_linked) (bfd *, struct bfd_section *, +. void (*_section_already_linked) (bfd *, struct already_linked *, . struct bfd_link_info *); . . {* Define a common symbol. *} @@ -594,6 +618,7 @@ extern const bfd_target bfd_elf32_hppa_nbsd_vec; extern const bfd_target bfd_elf32_hppa_vec; extern const bfd_target bfd_elf32_i370_vec; extern const bfd_target bfd_elf32_i386_freebsd_vec; +extern const bfd_target bfd_elf32_i386_sol2_vec; extern const bfd_target bfd_elf32_i386_vxworks_vec; extern const bfd_target bfd_elf32_i386_vec; extern const bfd_target bfd_elf32_i860_little_vec; @@ -625,6 +650,7 @@ extern const bfd_target bfd_elf32_mcore_big_vec; extern const bfd_target bfd_elf32_mcore_little_vec; extern const bfd_target bfd_elf32_mep_vec; extern const bfd_target bfd_elf32_mep_little_vec; +extern const bfd_target bfd_elf32_microblaze_vec; extern const bfd_target bfd_elf32_mn10200_vec; extern const bfd_target bfd_elf32_mn10300_vec; extern const bfd_target bfd_elf32_mt_vec; @@ -633,6 +659,8 @@ extern const bfd_target bfd_elf32_nbigmips_vec; extern const bfd_target bfd_elf32_nlittlemips_vec; extern const bfd_target bfd_elf32_ntradbigmips_vec; extern const bfd_target bfd_elf32_ntradlittlemips_vec; +extern const bfd_target bfd_elf32_ntradbigmips_freebsd_vec; +extern const bfd_target bfd_elf32_ntradlittlemips_freebsd_vec; extern const bfd_target bfd_elf32_openrisc_vec; extern const bfd_target bfd_elf32_or32_big_vec; extern const bfd_target bfd_elf32_pj_vec; @@ -640,6 +668,9 @@ extern const bfd_target bfd_elf32_pjl_vec; extern const bfd_target bfd_elf32_powerpc_vec; extern const bfd_target bfd_elf32_powerpcle_vec; extern const bfd_target bfd_elf32_powerpc_vxworks_vec; +extern const bfd_target bfd_elf32_rx_le_vec; +extern const bfd_target bfd_elf32_rx_be_vec; +extern const bfd_target bfd_elf32_rx_be_ns_vec; extern const bfd_target bfd_elf32_s390_vec; extern const bfd_target bfd_elf32_bigscore_vec; extern const bfd_target bfd_elf32_littlescore_vec; @@ -650,7 +681,9 @@ extern const bfd_target bfd_elf32_sh64blin_vec; extern const bfd_target bfd_elf32_sh64lnbsd_vec; extern const bfd_target bfd_elf32_sh64nbsd_vec; extern const bfd_target bfd_elf32_sh_vec; +extern const bfd_target bfd_elf32_shbfd_vec; extern const bfd_target bfd_elf32_shblin_vec; +extern const bfd_target bfd_elf32_shfd_vec; extern const bfd_target bfd_elf32_shl_vec; extern const bfd_target bfd_elf32_shl_symbian_vec; extern const bfd_target bfd_elf32_shlin_vec; @@ -659,10 +692,21 @@ extern const bfd_target bfd_elf32_shlvxworks_vec; extern const bfd_target bfd_elf32_shnbsd_vec; extern const bfd_target bfd_elf32_shvxworks_vec; extern const bfd_target bfd_elf32_sparc_vec; +extern const bfd_target bfd_elf32_sparc_sol2_vec; extern const bfd_target bfd_elf32_sparc_vxworks_vec; extern const bfd_target bfd_elf32_spu_vec; +extern const bfd_target bfd_elf32_tic6x_be_vec; +extern const bfd_target bfd_elf32_tic6x_le_vec; +extern const bfd_target bfd_elf32_tic6x_elf_be_vec; +extern const bfd_target bfd_elf32_tic6x_elf_le_vec; +extern const bfd_target bfd_elf32_tic6x_linux_be_vec; +extern const bfd_target bfd_elf32_tic6x_linux_le_vec; +extern const bfd_target bfd_elf32_tilegx_vec; +extern const bfd_target bfd_elf32_tilepro_vec; extern const bfd_target bfd_elf32_tradbigmips_vec; extern const bfd_target bfd_elf32_tradlittlemips_vec; +extern const bfd_target bfd_elf32_tradbigmips_freebsd_vec; +extern const bfd_target bfd_elf32_tradlittlemips_freebsd_vec; extern const bfd_target bfd_elf32_us_cris_vec; extern const bfd_target bfd_elf32_v850_vec; extern const bfd_target bfd_elf32_vax_vec; @@ -694,10 +738,20 @@ extern const bfd_target bfd_elf64_sh64lnbsd_vec; extern const bfd_target bfd_elf64_sh64nbsd_vec; extern const bfd_target bfd_elf64_sparc_vec; extern const bfd_target bfd_elf64_sparc_freebsd_vec; +extern const bfd_target bfd_elf64_sparc_sol2_vec; +extern const bfd_target bfd_elf64_tilegx_vec; extern const bfd_target bfd_elf64_tradbigmips_vec; extern const bfd_target bfd_elf64_tradlittlemips_vec; +extern const bfd_target bfd_elf64_tradbigmips_freebsd_vec; +extern const bfd_target bfd_elf64_tradlittlemips_freebsd_vec; extern const bfd_target bfd_elf64_x86_64_freebsd_vec; +extern const bfd_target bfd_elf64_x86_64_sol2_vec; extern const bfd_target bfd_elf64_x86_64_vec; +extern const bfd_target bfd_elf32_x86_64_vec; +extern const bfd_target bfd_elf64_l1om_freebsd_vec; +extern const bfd_target bfd_elf64_l1om_vec; +extern const bfd_target bfd_elf64_k1om_freebsd_vec; +extern const bfd_target bfd_elf64_k1om_vec; extern const bfd_target bfd_mmo_vec; extern const bfd_target bfd_powerpc_pe_vec; extern const bfd_target bfd_powerpc_pei_vec; @@ -748,7 +802,7 @@ extern const bfd_target mach_o_be_vec; extern const bfd_target mach_o_le_vec; extern const bfd_target mach_o_fat_vec; extern const bfd_target mach_o_i386_vec; -extern const bfd_target maxqcoff_vec; +extern const bfd_target mach_o_x86_64_vec; extern const bfd_target mcore_pe_big_vec; extern const bfd_target mcore_pe_little_vec; extern const bfd_target mcore_pei_big_vec; @@ -808,7 +862,7 @@ extern const bfd_target vaxnetbsd_vec; extern const bfd_target vax1knetbsd_vec; extern const bfd_target versados_vec; extern const bfd_target vms_alpha_vec; -extern const bfd_target vms_vax_vec; +extern const bfd_target vms_lib_txt_vec; extern const bfd_target w65_vec; extern const bfd_target we32kcoff_vec; extern const bfd_target x86_64pe_vec; @@ -924,6 +978,7 @@ static const bfd_target * const _bfd_target_vector[] = &bfd_elf32_hppa_vec, &bfd_elf32_i370_vec, &bfd_elf32_i386_freebsd_vec, + &bfd_elf32_i386_sol2_vec, &bfd_elf32_i386_vxworks_vec, &bfd_elf32_i386_vec, &bfd_elf32_i860_little_vec, @@ -957,6 +1012,7 @@ static const bfd_target * const _bfd_target_vector[] = &bfd_elf32_mcore_big_vec, &bfd_elf32_mcore_little_vec, &bfd_elf32_mep_vec, + &bfd_elf32_microblaze_vec, &bfd_elf32_mn10200_vec, &bfd_elf32_mn10300_vec, &bfd_elf32_mt_vec, @@ -966,6 +1022,8 @@ static const bfd_target * const _bfd_target_vector[] = &bfd_elf32_nlittlemips_vec, &bfd_elf32_ntradbigmips_vec, &bfd_elf32_ntradlittlemips_vec, + &bfd_elf32_ntradbigmips_freebsd_vec, + &bfd_elf32_ntradlittlemips_freebsd_vec, #endif &bfd_elf32_openrisc_vec, &bfd_elf32_or32_big_vec, @@ -974,13 +1032,18 @@ static const bfd_target * const _bfd_target_vector[] = &bfd_elf32_powerpc_vec, &bfd_elf32_powerpc_vxworks_vec, &bfd_elf32_powerpcle_vec, + &bfd_elf32_rx_be_vec, + &bfd_elf32_rx_be_ns_vec, + &bfd_elf32_rx_le_vec, &bfd_elf32_s390_vec, #ifdef BFD64 &bfd_elf32_bigscore_vec, &bfd_elf32_littlescore_vec, #endif &bfd_elf32_sh_vec, + &bfd_elf32_shbfd_vec, &bfd_elf32_shblin_vec, + &bfd_elf32_shfd_vec, &bfd_elf32_shl_vec, &bfd_elf32_shl_symbian_vec, &bfd_elf32_shlin_vec, @@ -997,10 +1060,17 @@ static const bfd_target * const _bfd_target_vector[] = &bfd_elf32_sh64blin_vec, #endif &bfd_elf32_sparc_vec, + &bfd_elf32_sparc_sol2_vec, &bfd_elf32_sparc_vxworks_vec, &bfd_elf32_spu_vec, + &bfd_elf32_tic6x_be_vec, + &bfd_elf32_tic6x_le_vec, + &bfd_elf32_tilegx_vec, + &bfd_elf32_tilepro_vec, &bfd_elf32_tradbigmips_vec, &bfd_elf32_tradlittlemips_vec, + &bfd_elf32_tradbigmips_freebsd_vec, + &bfd_elf32_tradlittlemips_freebsd_vec, &bfd_elf32_us_cris_vec, &bfd_elf32_v850_vec, &bfd_elf32_vax_vec, @@ -1033,10 +1103,20 @@ static const bfd_target * const _bfd_target_vector[] = &bfd_elf64_sh64blin_vec, &bfd_elf64_sparc_vec, &bfd_elf64_sparc_freebsd_vec, + &bfd_elf64_sparc_sol2_vec, + &bfd_elf64_tilegx_vec, &bfd_elf64_tradbigmips_vec, &bfd_elf64_tradlittlemips_vec, + &bfd_elf64_tradbigmips_freebsd_vec, + &bfd_elf64_tradlittlemips_freebsd_vec, &bfd_elf64_x86_64_freebsd_vec, + &bfd_elf64_x86_64_sol2_vec, &bfd_elf64_x86_64_vec, + &bfd_elf32_x86_64_vec, + &bfd_elf64_l1om_freebsd_vec, + &bfd_elf64_l1om_vec, + &bfd_elf64_k1om_freebsd_vec, + &bfd_elf64_k1om_vec, &bfd_mmo_vec, #endif &bfd_powerpc_pe_vec, @@ -1117,7 +1197,9 @@ static const bfd_target * const _bfd_target_vector[] = &mach_o_le_vec, &mach_o_fat_vec, &mach_o_i386_vec, - &maxqcoff_vec, +#ifdef BFD64 + &mach_o_x86_64_vec, +#endif &mcore_pe_big_vec, &mcore_pe_little_vec, &mcore_pei_big_vec, @@ -1169,9 +1251,7 @@ static const bfd_target * const _bfd_target_vector[] = &shlcoff_vec, &shlpe_vec, &shlpei_vec, -#if defined (HOST_HPPAHPUX) || defined (HOST_HPPABSD) || defined (HOST_HPPAOSF) &som_vec, -#endif &sparccoff_vec, &sparcle_aout_vec, &sparclinux_vec, @@ -1196,7 +1276,7 @@ static const bfd_target * const _bfd_target_vector[] = #ifdef BFD64 &vms_alpha_vec, #endif - &vms_vax_vec, + &vms_lib_txt_vec, &w65_vec, &we32kcoff_vec, &z80coff_vec, @@ -1418,6 +1498,122 @@ bfd_find_target (const char *target_name, bfd *abfd) return target; } +/* Helper function for bfd_get_target_info to determine the target's + architecture. This method handles bfd internal target names as + tuples and triplets. */ +static bfd_boolean +_bfd_find_arch_match (const char *tname, const char **arch, + const char **def_target_arch) +{ + if (!arch) + return FALSE; + + while (*arch != NULL) + { + const char *in_a = strstr (*arch, tname); + char end_ch = (in_a ? in_a[strlen (tname)] : 0); + + if (in_a && (in_a == *arch || in_a[-1] == ':') + && end_ch == 0) + { + *def_target_arch = *arch; + return TRUE; + } + arch++; + } + return FALSE; +} + +/* +FUNCTION + bfd_get_target_info +SYNOPSIS + const bfd_target *bfd_get_target_info (const char *target_name, + bfd *abfd, + bfd_boolean *is_bigendian, + int *underscoring, + const char **def_target_arch); +DESCRIPTION + Return a pointer to the transfer vector for the object target + named @var{target_name}. If @var{target_name} is <>, + choose the one in the environment variable <>; if + that is null or not defined, then choose the first entry in the + target list. Passing in the string "default" or setting the + environment variable to "default" will cause the first entry in + the target list to be returned, and "target_defaulted" will be + set in the BFD if @var{abfd} isn't <>. This causes + <> to loop over all the targets to find the + one that matches the file being read. + If @var{is_bigendian} is not <>, then set this value to target's + endian mode. True for big-endian, FALSE for little-endian or for + invalid target. + If @var{underscoring} is not <>, then set this value to target's + underscoring mode. Zero for none-underscoring, -1 for invalid target, + else the value of target vector's symbol underscoring. + If @var{def_target_arch} is not <>, then set it to the architecture + string specified by the target_name. +*/ +const bfd_target * +bfd_get_target_info (const char *target_name, bfd *abfd, + bfd_boolean *is_bigendian, + int *underscoring, const char **def_target_arch) +{ + const bfd_target *target_vec; + + if (is_bigendian) + *is_bigendian = FALSE; + if (underscoring) + *underscoring = -1; + if (def_target_arch) + *def_target_arch = NULL; + target_vec = bfd_find_target (target_name, abfd); + if (! target_vec) + return NULL; + if (is_bigendian) + *is_bigendian = ((target_vec->byteorder == BFD_ENDIAN_BIG) ? TRUE + : FALSE); + if (underscoring) + *underscoring = ((int) target_vec->symbol_leading_char) & 0xff; + + if (def_target_arch) + { + const char *tname = target_vec->name; + const char **arches = bfd_arch_list (); + + if (arches && tname) + { + char *hyp = strchr (tname, '-'); + + if (hyp != NULL) + { + tname = ++hyp; + + /* Make sure we detect architecture names + for triplets like "pe-arm-wince-little". */ + if (!_bfd_find_arch_match (tname, arches, def_target_arch)) + { + char new_tname[50]; + + strcpy (new_tname, hyp); + while ((hyp = strrchr (new_tname, '-')) != NULL) + { + *hyp = 0; + if (_bfd_find_arch_match (new_tname, arches, + def_target_arch)) + break; + } + } + } + else + _bfd_find_arch_match (tname, arches, def_target_arch); + } + + if (arches) + free (arches); + } + return target_vec; +} + /* FUNCTION bfd_target_list @@ -1437,11 +1633,6 @@ bfd_target_list (void) { int vec_length = 0; bfd_size_type amt; -#if defined (HOST_HPPAHPUX) && ! defined (__STDC__) - /* The native compiler on the HP9000/700 has a bug which causes it - to loop endlessly when compiling this file. This avoids it. */ - volatile -#endif const bfd_target * const *target; const char **name_list, **name_ptr; @@ -1449,7 +1640,7 @@ bfd_target_list (void) vec_length++; amt = (vec_length + 1) * sizeof (char **); - name_ptr = name_list = bfd_malloc (amt); + name_ptr = name_list = (const char **) bfd_malloc (amt); if (name_list == NULL) return NULL;