diff --git a/ld/ChangeLog b/ld/ChangeLog index 2b30359b96..b719d456fb 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,27 @@ +2020-05-18 Douglas B Rupp + + * ldemul.h (ldemul_print_symbol): New. + (ld_emulation_xfer_type) * ldmain.c (add_archive_element): Fix s/claimi/claim/ typo diff --git a/ld/emultempl/aix.em b/ld/emultempl/aix.em index 5b73c3e7e5..de313e1f17 100644 --- a/ld/emultempl/aix.em +++ b/ld/emultempl/aix.em @@ -1534,6 +1534,36 @@ gld${EMULATION_NAME}_open_dynamic_archive (const char *arch, return TRUE; } +static bfd_boolean +gld${EMULATION_NAME}_print_symbol (struct bfd_link_hash_entry *hash_entry, + void *ptr) +{ + asection *sec = (asection *) ptr; + + if ((hash_entry->type == bfd_link_hash_defined + || hash_entry->type == bfd_link_hash_defweak) + && sec == hash_entry->u.def.section) + { + int i; + struct xcoff_link_hash_entry *h; + + for (i = 0; i < SECTION_NAME_MAP_LENGTH; i++) + print_space (); + minfo ("0x%V ", + (hash_entry->u.def.value + + hash_entry->u.def.section->output_offset + + hash_entry->u.def.section->output_section->vma)); + + /* Flag symbol if it has been garbage collected. */ + h = (struct xcoff_link_hash_entry *) hash_entry; + if ((h != NULL) && !(h->flags & XCOFF_MARK)) + minfo (" -->gc"); + minfo (" %pT\n", hash_entry->root.string); + } + + return TRUE; +} + struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = { gld${EMULATION_NAME}_before_parse, syslib_default, @@ -1564,6 +1594,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = { NULL, /* new_vers_pattern */ NULL, /* extra_map_file_text */ ${LDEMUL_EMIT_CTF_EARLY-NULL}, - ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL} + ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL}, + gld${EMULATION_NAME}_print_symbol }; EOF diff --git a/ld/emultempl/armcoff.em b/ld/emultempl/armcoff.em index c539e2facc..ff22af4eb3 100644 --- a/ld/emultempl/armcoff.em +++ b/ld/emultempl/armcoff.em @@ -286,6 +286,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = NULL, /* new_vers_pattern */ NULL, /* extra_map_file_text */ ${LDEMUL_EMIT_CTF_EARLY-NULL}, - ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL} + ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL}, + ${LDEMUL_PRINT_SYMBOL-NULL} }; EOF diff --git a/ld/emultempl/beos.em b/ld/emultempl/beos.em index 2c3e5e5370..442ff1222c 100644 --- a/ld/emultempl/beos.em +++ b/ld/emultempl/beos.em @@ -786,6 +786,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = NULL, /* new_vers_pattern */ NULL, /* extra_map_file_text */ ${LDEMUL_EMIT_CTF_EARLY-NULL}, - ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL} + ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL}, + ${LDEMUL_PRINT_SYMBOL-NULL} }; EOF diff --git a/ld/emultempl/elf.em b/ld/emultempl/elf.em index 899030016c..eac2ce2f4c 100644 --- a/ld/emultempl/elf.em +++ b/ld/emultempl/elf.em @@ -903,6 +903,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = ${LDEMUL_NEW_VERS_PATTERN-NULL}, ${LDEMUL_EXTRA_MAP_FILE_TEXT-NULL}, ${LDEMUL_EMIT_CTF_EARLY-NULL}, - ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL} + ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL}, + ${LDEMUL_PRINT_SYMBOL-NULL} }; EOF diff --git a/ld/emultempl/generic.em b/ld/emultempl/generic.em index a39c933207..24d3c1d9c6 100644 --- a/ld/emultempl/generic.em +++ b/ld/emultempl/generic.em @@ -161,6 +161,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = ${LDEMUL_NEW_VERS_PATTERN-NULL}, ${LDEMUL_EXTRA_MAP_FILE_TEXT-NULL}, ${LDEMUL_EMIT_CTF_EARLY-NULL}, - ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL} + ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL}, + ${LDEMUL_PRINT_SYMBOL-NULL} }; EOF diff --git a/ld/emultempl/linux.em b/ld/emultempl/linux.em index f4ae6cfba2..e9d802c657 100644 --- a/ld/emultempl/linux.em +++ b/ld/emultempl/linux.em @@ -213,6 +213,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = NULL, /* new_vers_pattern */ NULL, /* extra_map_file_text */ ${LDEMUL_EMIT_CTF_EARLY-NULL}, - ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL} + ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL}, + ${LDEMUL_PRINT_SYMBOL-NULL} }; EOF diff --git a/ld/emultempl/msp430.em b/ld/emultempl/msp430.em index 861c1dcda0..850c3a836c 100644 --- a/ld/emultempl/msp430.em +++ b/ld/emultempl/msp430.em @@ -848,7 +848,8 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = ${LDEMUL_NEW_VERS_PATTERN-NULL}, ${LDEMUL_EXTRA_MAP_FILE_TEXT-NULL}, ${LDEMUL_EMIT_CTF_EARLY-NULL}, - ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL} + ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL}, + ${LDEMUL_PRINT_SYMBOL-NULL} }; EOF # diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em index ad5d65d024..3dd36de373 100644 --- a/ld/emultempl/pe.em +++ b/ld/emultempl/pe.em @@ -2394,6 +2394,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = NULL, /* new_vers_pattern. */ NULL, /* extra_map_file_text. */ ${LDEMUL_EMIT_CTF_EARLY-NULL}, - ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL} + ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL}, + ${LDEMUL_PRINT_SYMBOL-NULL} }; EOF diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em index aa8bac5f81..39ddd8f23e 100644 --- a/ld/emultempl/pep.em +++ b/ld/emultempl/pep.em @@ -2192,6 +2192,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = NULL, /* new_vers_pattern. */ NULL, /* extra_map_file_text */ ${LDEMUL_EMIT_CTF_EARLY-NULL}, - ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL} + ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL}, + ${LDEMUL_PRINT_SYMBOL-NULL} }; EOF diff --git a/ld/emultempl/ticoff.em b/ld/emultempl/ticoff.em index 60c0da9f1b..11ddd0c9ba 100644 --- a/ld/emultempl/ticoff.em +++ b/ld/emultempl/ticoff.em @@ -186,6 +186,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = NULL, /* new_vers_pattern */ NULL, /* extra_map_file_text */ ${LDEMUL_EMIT_CTF_EARLY-NULL}, - ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL} + ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL}, + ${LDEMUL_PRINT_SYMBOL-NULL} }; EOF diff --git a/ld/emultempl/vanilla.em b/ld/emultempl/vanilla.em index ae6f6e4175..70d193c2c7 100644 --- a/ld/emultempl/vanilla.em +++ b/ld/emultempl/vanilla.em @@ -87,6 +87,7 @@ struct ld_emulation_xfer_struct ld_vanilla_emulation = NULL, /* new_vers_pattern */ NULL, /* extra_map_file_text */ NULL, /* emit_ctf_early */ - NULL /* examine_strtab_for_ctf */ + NULL, /* examine_strtab_for_ctf */ + NULL /* print_symbol */ }; EOF diff --git a/ld/ldemul.c b/ld/ldemul.c index fa6dfdd18e..00a6a5ad13 100644 --- a/ld/ldemul.c +++ b/ld/ldemul.c @@ -428,3 +428,11 @@ ldemul_examine_strtab_for_ctf (struct ctf_file *ctf_output, ld_emulation->examine_strtab_for_ctf (ctf_output, syms, symcount, symstrtab); } + +bfd_boolean +ldemul_print_symbol (struct bfd_link_hash_entry *hash_entry, void *ptr) +{ + if (ld_emulation->print_symbol) + return ld_emulation->print_symbol (hash_entry, ptr); + return print_one_symbol (hash_entry, ptr); +} diff --git a/ld/ldemul.h b/ld/ldemul.h index 44e3a92aa7..ca165ac957 100644 --- a/ld/ldemul.h +++ b/ld/ldemul.h @@ -112,6 +112,8 @@ extern int ldemul_emit_ctf_early extern void ldemul_examine_strtab_for_ctf (struct ctf_file *, struct elf_sym_strtab *, bfd_size_type, struct elf_strtab_hash *); +extern bfd_boolean ldemul_print_symbol + (struct bfd_link_hash_entry *hash_entry, void *ptr); typedef struct ld_emulation_xfer_struct { /* Run before parsing the command line and script file. @@ -236,6 +238,12 @@ typedef struct ld_emulation_xfer_struct { bfd_link_callback is invoked by per-target code. */ void (*examine_strtab_for_ctf) (struct ctf_file *, struct elf_sym_strtab *, bfd_size_type, struct elf_strtab_hash *); + + /* Called when printing a symbol to the map file. AIX uses this + hook to flag gc'd symbols. */ + bfd_boolean (*print_symbol) + (struct bfd_link_hash_entry *hash_entry, void *ptr); + } ld_emulation_xfer_type; typedef enum { diff --git a/ld/ldlang.c b/ld/ldlang.c index b2cdb3603a..35791e4e2c 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -155,8 +155,6 @@ static int lang_sizing_iteration = 0; #define outside_symbol_address(q) \ ((q)->value + outside_section_address (q->section)) -#define SECTION_NAME_MAP_LENGTH (16) - /* CTF sections smaller than this are not compressed: compression of dictionaries this small doesn't gain much, and this lets consumers mmap the sections directly out of the ELF file and use them with no decompression @@ -4619,7 +4617,7 @@ print_input_statement (lang_input_statement_type *statm) /* Print all symbols defined in a particular section. This is called via bfd_link_hash_traverse, or by print_all_symbols. */ -static bfd_boolean +bfd_boolean print_one_symbol (struct bfd_link_hash_entry *hash_entry, void *ptr) { asection *sec = (asection *) ptr; @@ -4683,7 +4681,7 @@ print_all_symbols (asection *sec) /* Print the symbols. */ for (i = 0; i < ud->map_symbol_def_count; i++) - print_one_symbol (entries[i], sec); + ldemul_print_symbol (entries[i], sec); obstack_free (&map_obstack, entries); } @@ -4747,7 +4745,7 @@ print_input_section (asection *i, bfd_boolean is_discarded) && i->output_section->owner == link_info.output_bfd) { if (link_info.reduce_memory_overheads) - bfd_link_hash_traverse (link_info.hash, print_one_symbol, i); + bfd_link_hash_traverse (link_info.hash, ldemul_print_symbol, i); else print_all_symbols (i); diff --git a/ld/ldlang.h b/ld/ldlang.h index 2aa3930f95..3018c3e2ba 100644 --- a/ld/ldlang.h +++ b/ld/ldlang.h @@ -23,6 +23,8 @@ #define DEFAULT_MEMORY_REGION "*default*" +#define SECTION_NAME_MAP_LENGTH (16) + typedef enum { lang_input_file_is_l_enum, @@ -701,4 +703,7 @@ lang_print_memory_usage (void); extern void lang_add_gc_name (const char *); +extern bfd_boolean +print_one_symbol (struct bfd_link_hash_entry *hash_entry, void *ptr); + #endif