From ad247e3c7de719151c02516afc9c682a32a181cc Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Fri, 10 Dec 1999 01:41:22 +0000 Subject: [PATCH] Change AR for ELF so that common symbols are not included in archive map. Change LD for ELF so that archive elements whoes archive map contains a reference to a common symbol will get linkled in. Add new field to bfd_target structure and initialise it for all bfd targets. --- bfd/ChangeLog | 35 +++++++++++++++++++++++++++++++++++ bfd/aout-target.h | 3 +++ bfd/aout-tic30.c | 3 +++ bfd/archive.c | 20 +++++++++++--------- bfd/bfd-in2.h | 11 ++++++++--- bfd/bfd.c | 3 +++ bfd/coff-alpha.c | 2 ++ bfd/coff-rs6000.c | 1 + bfd/elf64-mips.c | 1 + bfd/elflink.h | 21 ++++++++++++++++++++- bfd/elfxx-target.h | 9 +++++++++ bfd/ieee.c | 1 + bfd/libbfd-in.h | 3 +++ bfd/libbfd.h | 3 +++ bfd/libecoff.h | 1 + bfd/oasys.c | 1 + bfd/som.c | 1 + bfd/targets.c | 6 ++++-- bfd/vms.c | 1 + 19 files changed, 111 insertions(+), 15 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 4355d51533..c4c6aa86a6 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,38 @@ +1999-12-09 Nick Clifton + + * elflink.h (elf_link_add_archive_symbols): Add an archive + element even if contains a symbol which is currently only + considered to be a common. + + * targets.c (struct bfd_target): Add new field + _bfd_allow_commons_in_armap. + * bfd-in2.h:Regenerate. + + * libbfd-in2.h (_bfd_noarchive_allow_commons_in_armap): + Define. + (_bfd_archive_bsd_allow_commons_in_armap): Define. + * libbfd.h: Regenerate. + + * elfxx-target.h: If using COFF archive map, override + definition of allow_commons_in_armap and replace with + bfd_false. + + * archive.c (bfd_compute_and_write_armap): Do not place common + symbols into the archive map unless _bfd_allow_commons_in_armap + returns true. + + * aout-target.h (MY_allow_commons_in_armap): Define. + * aout-tic30.h (MY_allow_commons_in_armap): Define. + * bfd.c (bfd_allow_commons_in_armap): Define. + * coff-alpha.h (alpha_ecoff_allow_commons_in_armap): Define. + * coff-rs6000.h (xcoff_allow_commons_in_armap): Define. + * elf64-mips.c (bfd_elf64_allow_commons_in_armap): Define. + * ieee.c (ieee_ecoff_allow_commons_in_armap): Define. + * libecoff.h (_bfd_ecoff_allow_commons_in_armap): Define. + * oasys.c (oasys_allow_commons_in_armap): Define. + * som.c (som_allow_commons_in_armap): Define. + * vms.c (vms_allow_commons_in_armap): Define. + 1999-12-07 Jim Blandy Add support for SSE registers in ELF core files. diff --git a/bfd/aout-target.h b/bfd/aout-target.h index 5ca50ac568..0650c4c2fe 100644 --- a/bfd/aout-target.h +++ b/bfd/aout-target.h @@ -421,6 +421,9 @@ MY_bfd_final_link (abfd, info) #ifndef MY_update_armap_timestamp #define MY_update_armap_timestamp _bfd_archive_bsd_update_armap_timestamp #endif +#ifndef MY_allow_commons_in_armap +#define MY_allow_commons_in_armap _bfd_archive_bsd_allow_commons_in_armap +#endif /* No core file defined here -- configure in trad-core.c separately. */ #ifndef MY_core_file_failing_command diff --git a/bfd/aout-tic30.c b/bfd/aout-tic30.c index 0dcae0c25b..f39e5c3931 100644 --- a/bfd/aout-tic30.c +++ b/bfd/aout-tic30.c @@ -851,6 +851,9 @@ tic30_aout_set_arch_mach (abfd, arch, machine) #ifndef MY_update_armap_timestamp #define MY_update_armap_timestamp _bfd_archive_bsd_update_armap_timestamp #endif +#ifndef MY_allow_commons_in_armap +#define MY_allow_commons_in_armap _bfd_archive_bsd_allow_commons_in_armap +#endif /* No core file defined here -- configure in trad-core.c separately. */ #ifndef MY_core_file_failing_command diff --git a/bfd/archive.c b/bfd/archive.c index 19293af457..3390a1c263 100644 --- a/bfd/archive.c +++ b/bfd/archive.c @@ -1804,16 +1804,19 @@ _bfd_compute_and_write_armap (arch, elength) { flagword flags = (syms[src_count])->flags; asection *sec = syms[src_count]->section; + size_t namelen; + struct orl *new_map; - if ((flags & BSF_GLOBAL || - flags & BSF_WEAK || - flags & BSF_INDIRECT || - bfd_is_com_section (sec)) - && ! bfd_is_und_section (sec)) + if (bfd_is_und_section (sec)) + continue; + else if (bfd_is_com_section (sec)) { - size_t namelen; - struct orl *new_map; - + if (! bfd_allow_commons_in_armap (arch)) + continue; + } + else if ((flags & (BSF_GLOBAL | BSF_WEAK | BSF_INDIRECT)) == 0) + continue; + /* This symbol will go into the archive header */ if (orl_count == orl_max) { @@ -1842,7 +1845,6 @@ _bfd_compute_and_write_armap (arch, elength) stridx += namelen + 1; ++orl_count; - } } } diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 93c9b7e815..8a6cbd361c 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -2713,6 +2713,9 @@ bfd_set_private_flags PARAMS ((bfd *abfd, flagword flags)); #define bfd_update_armap_timestamp(abfd) \ BFD_SEND (abfd, _bfd_update_armap_timestamp, (abfd)) +#define bfd_allow_commons_in_armap(abfd) \ + BFD_SEND (abfd, _bfd_allow_commons_in_armap, (abfd)) + #define bfd_set_arch_mach(abfd, arch, mach)\ BFD_SEND ( abfd, _bfd_set_arch_mach, (abfd, arch, mach)) @@ -2920,7 +2923,8 @@ CAT(NAME,_read_ar_hdr),\ CAT(NAME,_openr_next_archived_file),\ CAT(NAME,_get_elt_at_index),\ CAT(NAME,_generic_stat_arch_elt),\ -CAT(NAME,_update_armap_timestamp) +CAT(NAME,_update_armap_timestamp), \ +CAT(NAME,_allow_commons_in_armap) boolean (*_bfd_slurp_armap) PARAMS ((bfd *)); boolean (*_bfd_slurp_extended_name_table) PARAMS ((bfd *)); boolean (*_bfd_construct_extended_name_table) @@ -2931,13 +2935,14 @@ CAT(NAME,_update_armap_timestamp) struct orl *map, unsigned int orl_count, int stridx)); - PTR (*_bfd_read_ar_hdr_fn) PARAMS ((bfd *)); + PTR (*_bfd_read_ar_hdr_fn) PARAMS ((bfd *)); bfd * (*openr_next_archived_file) PARAMS ((bfd *arch, bfd *prev)); #define bfd_get_elt_at_index(b,i) BFD_SEND(b, _bfd_get_elt_at_index, (b,i)) bfd * (*_bfd_get_elt_at_index) PARAMS ((bfd *, symindex)); int (*_bfd_stat_arch_elt) PARAMS ((bfd *, struct stat *)); boolean (*_bfd_update_armap_timestamp) PARAMS ((bfd *)); - + boolean (*_bfd_allow_commons_in_armap) PARAMS ((bfd *)); + /* Entry points used for symbols. */ #define BFD_JUMP_TABLE_SYMBOLS(NAME)\ CAT(NAME,_get_symtab_upper_bound),\ diff --git a/bfd/bfd.c b/bfd/bfd.c index e04172fb01..f804f324b2 100644 --- a/bfd/bfd.c +++ b/bfd/bfd.c @@ -1063,6 +1063,9 @@ DESCRIPTION .#define bfd_update_armap_timestamp(abfd) \ . BFD_SEND (abfd, _bfd_update_armap_timestamp, (abfd)) . +.#define bfd_allow_commons_in_armap(abfd) \ +. BFD_SEND (abfd, _bfd_allow_commons_in_armap, (abfd)) +. .#define bfd_set_arch_mach(abfd, arch, mach)\ . BFD_SEND ( abfd, _bfd_set_arch_mach, (abfd, arch, mach)) . diff --git a/bfd/coff-alpha.c b/bfd/coff-alpha.c index bc25319f4a..76ef5e2cff 100644 --- a/bfd/coff-alpha.c +++ b/bfd/coff-alpha.c @@ -2036,6 +2036,8 @@ alpha_adjust_headers (abfd, fhdr, ahdr) #define alpha_ecoff_write_armap _bfd_ecoff_write_armap #define alpha_ecoff_generic_stat_arch_elt _bfd_ecoff_generic_stat_arch_elt #define alpha_ecoff_update_armap_timestamp _bfd_ecoff_update_armap_timestamp +#define alpha_ecoff_allow_commons_in_armap _bfd_true + /* A compressed file uses this instead of ARFMAG. */ diff --git a/bfd/coff-rs6000.c b/bfd/coff-rs6000.c index 69230001e4..0ceb7a92c0 100644 --- a/bfd/coff-rs6000.c +++ b/bfd/coff-rs6000.c @@ -694,6 +694,7 @@ struct xcoff_ar_hdr /* XCOFF archives do not have a timestamp. */ #define xcoff_update_armap_timestamp bfd_true +#define xcoff_allow_commons_in_armap bfd_true /* Read in the armap of an XCOFF archive. */ diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c index 6fc0dcdf0e..cbc69b271e 100644 --- a/bfd/elf64-mips.c +++ b/bfd/elf64-mips.c @@ -2186,5 +2186,6 @@ const struct elf_size_info mips_elf64_size_info = _bfd_archive_coff_generic_stat_arch_elt #define bfd_elf64_archive_update_armap_timestamp \ _bfd_archive_coff_update_armap_timestamp +#define _bfd_elf64_allow_commons_in_armap bfd_false #include "elf64-target.h" diff --git a/bfd/elflink.h b/bfd/elflink.h index ab679a70d0..2a8c3db1e1 100644 --- a/bfd/elflink.h +++ b/bfd/elflink.h @@ -200,7 +200,26 @@ elf_link_add_archive_symbols (abfd, info) if (h == NULL) continue; - if (h->root.type != bfd_link_hash_undefined) + /* We have changed the GNU archiver so that it will only place + non-common symbols into its archive map. Thus if we come across + a symbol in the archive map, which is currently considered to be + a common symbol, we can safely assume that we should link the + element in, in order to get in the definition of the symbol. + + Previous versions of the archiver would place common symbols into + the archive map. This meant that in order to only link in an + element if it contained a *definition* of a common symbol, it + would be necessary to read in the element and scan its symbol + table - a slow and wasteful process. + + In fact previous versions of this code did not even do that, + instead it just unilaterally ignored any symbols in the archive + map which were currently marked as common. So in order to link + in an archive element containing the definition of a common + symbol it was necessary to have that element also contain the + defintion of a currently undefined symbol. */ + if (h->root.type != bfd_link_hash_undefined + && h->root.type != bfd_link_hash_common) { if (h->root.type != bfd_link_hash_undefweak) defined[i] = true; diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h index 0a69dd80ee..6963d4e582 100644 --- a/bfd/elfxx-target.h +++ b/bfd/elfxx-target.h @@ -485,6 +485,13 @@ const bfd_target TARGET_BIG_SYM = #ifdef bfd_elfNN_archive_functions BFD_JUMP_TABLE_ARCHIVE (bfd_elfNN_archive), #else + /* For ELF based targets we do not want to put common symbols into the + archive map. This is a change from the old behaviour, and it is + being done because of a corresponding change in the linker, whereby + it will link in any archive element that contains a symbol which is + currently common. (See elflink.h:elf_link_add_archive_symbol). */ +#undef _bfd_archive_coff_allow_commons_in_armap +#define _bfd_archive_coff_allow_commons_in_armap bfd_false BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), #endif BFD_JUMP_TABLE_SYMBOLS (bfd_elfNN), @@ -580,6 +587,8 @@ const bfd_target TARGET_LITTLE_SYM = #ifdef bfd_elfNN_archive_functions BFD_JUMP_TABLE_ARCHIVE (bfd_elfNN_archive), #else +#undef _bfd_archive_coff_allow_commons_in_armap +#define _bfd_archive_coff_allow_commons_in_armap bfd_false BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), #endif BFD_JUMP_TABLE_SYMBOLS (bfd_elfNN), diff --git a/bfd/ieee.c b/bfd/ieee.c index 989d7243cb..f9c9a284bf 100644 --- a/bfd/ieee.c +++ b/bfd/ieee.c @@ -3900,6 +3900,7 @@ ieee_bfd_debug_info_accumulate (abfd, section) bfd_true) #define ieee_read_ar_hdr bfd_nullvoidptr #define ieee_update_armap_timestamp bfd_true +#define ieee_allow_commons_in_armap bfd_true #define ieee_get_elt_at_index _bfd_generic_get_elt_at_index #define ieee_bfd_is_local_label_name bfd_generic_is_local_label_name diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h index 79a176d063..3ea4e8ac49 100644 --- a/bfd/libbfd-in.h +++ b/bfd/libbfd-in.h @@ -211,6 +211,7 @@ extern boolean _bfd_nocore_core_file_matches_executable_p ((bfd *(*) PARAMS ((bfd *, symindex))) bfd_nullvoidptr) #define _bfd_noarchive_generic_stat_arch_elt bfd_generic_stat_arch_elt #define _bfd_noarchive_update_armap_timestamp bfd_false +#define _bfd_noarchive_allow_commons_in_armap bfd_true /* Routines to use for BFD_JUMP_TABLE_ARCHIVE to get BSD style archives. Use BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd). */ @@ -229,6 +230,7 @@ extern boolean _bfd_archive_bsd_construct_extended_name_table #define _bfd_archive_bsd_generic_stat_arch_elt \ bfd_generic_stat_arch_elt extern boolean _bfd_archive_bsd_update_armap_timestamp PARAMS ((bfd *)); +#define _bfd_archive_bsd_allow_commons_in_armap bfd_true /* Routines to use for BFD_JUMP_TABLE_ARCHIVE to get COFF style archives. Use BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff). */ @@ -247,6 +249,7 @@ extern boolean _bfd_archive_coff_construct_extended_name_table #define _bfd_archive_coff_generic_stat_arch_elt \ bfd_generic_stat_arch_elt #define _bfd_archive_coff_update_armap_timestamp bfd_true +#define _bfd_archive_coff_allow_commons_in_armap bfd_true /* Routines to use for BFD_JUMP_TABLE_SYMBOLS where there is no symbol support. Use BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols). */ diff --git a/bfd/libbfd.h b/bfd/libbfd.h index 26bf7efded..6063dd5618 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -211,6 +211,7 @@ extern boolean _bfd_nocore_core_file_matches_executable_p ((bfd *(*) PARAMS ((bfd *, symindex))) bfd_nullvoidptr) #define _bfd_noarchive_generic_stat_arch_elt bfd_generic_stat_arch_elt #define _bfd_noarchive_update_armap_timestamp bfd_false +#define _bfd_noarchive_allow_commons_in_armap bfd_true /* Routines to use for BFD_JUMP_TABLE_ARCHIVE to get BSD style archives. Use BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd). */ @@ -229,6 +230,7 @@ extern boolean _bfd_archive_bsd_construct_extended_name_table #define _bfd_archive_bsd_generic_stat_arch_elt \ bfd_generic_stat_arch_elt extern boolean _bfd_archive_bsd_update_armap_timestamp PARAMS ((bfd *)); +#define _bfd_archive_bsd_allow_commons_in_armap bfd_true /* Routines to use for BFD_JUMP_TABLE_ARCHIVE to get COFF style archives. Use BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff). */ @@ -247,6 +249,7 @@ extern boolean _bfd_archive_coff_construct_extended_name_table #define _bfd_archive_coff_generic_stat_arch_elt \ bfd_generic_stat_arch_elt #define _bfd_archive_coff_update_armap_timestamp bfd_true +#define _bfd_archive_coff_allow_commons_in_armap bfd_true /* Routines to use for BFD_JUMP_TABLE_SYMBOLS where there is no symbol support. Use BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols). */ diff --git a/bfd/libecoff.h b/bfd/libecoff.h index 456180544c..cd5dc49233 100644 --- a/bfd/libecoff.h +++ b/bfd/libecoff.h @@ -295,6 +295,7 @@ extern boolean _bfd_ecoff_write_armap #define _bfd_ecoff_get_elt_at_index _bfd_generic_get_elt_at_index #define _bfd_ecoff_generic_stat_arch_elt bfd_generic_stat_arch_elt #define _bfd_ecoff_update_armap_timestamp bfd_true +#define _bfd_ecoff_allow_commons_in_armap bfd_true extern long _bfd_ecoff_get_symtab_upper_bound PARAMS ((bfd *abfd)); extern long _bfd_ecoff_get_symtab PARAMS ((bfd *abfd, asymbol **alocation)); diff --git a/bfd/oasys.c b/bfd/oasys.c index e69053b828..c654b562c2 100644 --- a/bfd/oasys.c +++ b/bfd/oasys.c @@ -1458,6 +1458,7 @@ oasys_sizeof_headers (abfd, exec) #define oasys_read_ar_hdr bfd_nullvoidptr #define oasys_get_elt_at_index _bfd_generic_get_elt_at_index #define oasys_update_armap_timestamp bfd_true +#define oasys_allow_commons_in_armap bfd_true #define oasys_bfd_is_local_label_name bfd_generic_is_local_label_name #define oasys_get_lineno _bfd_nosymbols_get_lineno diff --git a/bfd/som.c b/bfd/som.c index 6f2b6c3abd..ef7de6d9f5 100644 --- a/bfd/som.c +++ b/bfd/som.c @@ -6229,6 +6229,7 @@ som_bfd_link_split_section (abfd, sec) #define som_construct_extended_name_table \ _bfd_archive_coff_construct_extended_name_table #define som_update_armap_timestamp bfd_true +#define som_allow_commons_in_armap bfd_true #define som_bfd_print_private_bfd_data _bfd_generic_bfd_print_private_bfd_data #define som_get_lineno _bfd_nosymbols_get_lineno diff --git a/bfd/targets.c b/bfd/targets.c index a50cc59536..e621856904 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -318,7 +318,8 @@ BFD_JUMP_TABLE macros. .CAT(NAME,_openr_next_archived_file),\ .CAT(NAME,_get_elt_at_index),\ .CAT(NAME,_generic_stat_arch_elt),\ -.CAT(NAME,_update_armap_timestamp) +.CAT(NAME,_update_armap_timestamp), \ +.CAT(NAME,_allow_commons_in_armap) . boolean (*_bfd_slurp_armap) PARAMS ((bfd *)); . boolean (*_bfd_slurp_extended_name_table) PARAMS ((bfd *)); . boolean (*_bfd_construct_extended_name_table) @@ -329,12 +330,13 @@ BFD_JUMP_TABLE macros. . struct orl *map, . unsigned int orl_count, . int stridx)); -. PTR (*_bfd_read_ar_hdr_fn) PARAMS ((bfd *)); +. PTR (*_bfd_read_ar_hdr_fn) PARAMS ((bfd *)); . bfd * (*openr_next_archived_file) PARAMS ((bfd *arch, bfd *prev)); .#define bfd_get_elt_at_index(b,i) BFD_SEND(b, _bfd_get_elt_at_index, (b,i)) . bfd * (*_bfd_get_elt_at_index) PARAMS ((bfd *, symindex)); . int (*_bfd_stat_arch_elt) PARAMS ((bfd *, struct stat *)); . boolean (*_bfd_update_armap_timestamp) PARAMS ((bfd *)); +. boolean (*_bfd_allow_commons_in_armap) PARAMS ((bfd *)); . . {* Entry points used for symbols. *} .#define BFD_JUMP_TABLE_SYMBOLS(NAME)\ diff --git a/bfd/vms.c b/bfd/vms.c index f0ea63ff92..9f85249791 100644 --- a/bfd/vms.c +++ b/bfd/vms.c @@ -127,6 +127,7 @@ static boolean vms_bfd_merge_private_bfd_data PARAMS ((bfd *ibfd, bfd *obfd)); static boolean vms_bfd_set_private_flags PARAMS ((bfd *abfd, flagword flags)); #define vms_make_empty_symbol _bfd_vms_make_empty_symbol +#define vms_allow_commons_in_armap bfd_true /*===========================================================================*/ -- 2.34.1