From 34a87bb07a4a3b2202fc25167a6b0f12575edc87 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Mon, 21 May 2018 20:39:09 -0700 Subject: [PATCH] ld: Hide symbols defined by HIDDEN/PROVIDE_HIDDEN There should be no difference in output for symbols defined by HIDDEN or PROVIDE_HIDDEN assignments whether they are explicitly marked as hidden or not. This patch adds a new BFD function, bfd_link_hide_symbol, to hide symbols defined by HIDDEN and PROVIDE_HIDDEN assignments. bfd PR ld/23201 * aout-target.h (MY_bfd_link_hide_symbol): New. * aout-tic30.c (MY_bfd_link_hide_symbol): Likewise. * binary.c (binary_bfd_link_hide_symbol): Likewise. * coff-alpha.c (_bfd_ecoff_bfd_link_hide_symbol): Likewise. * coff-mips.c (_bfd_ecoff_bfd_link_hide_symbol): Likewise. * coff-rs6000.c (_bfd_xcoff_bfd_link_hide_symbol): Likewise. * coffcode.h (coff_bfd_link_hide_symbol): Likewise. * elf-bfd.h (_bfd_elf_link_hide_symbol): Likewise. * elfxx-target.h (bfd_elfNN_bfd_link_hide_symbol): Likewise. * i386msdos.c (msdos_bfd_link_hide_symbol): Likewise. * ihex.c (ihex_bfd_link_hide_symbol): Likewise. * libbfd-in.h (_bfd_nolink_bfd_link_hide_symbol): Likewise. * linker.c (_bfd_generic_link_hide_symbol): Likewise. (bfd_link_hide_symbol): Likewise. * mach-o-target.c (bfd_mach_o_bfd_link_hide_symbol): Likewise. * mmo.c (mmo_bfd_link_hide_symbol): Likewise. * pef.c (bfd_pef_bfd_link_hide_symbol): Likewise. * plugin.c (bfd_plugin_bfd_link_hide_symbol): Likewise. * ppcboot.c (ppcboot_bfd_link_hide_symbol): Likewise. * som.c (som_bfd_link_hide_symbol): Likewise. * srec.c (srec_bfd_link_hide_symbol): Likewise. * tekhex.c (tekhex_bfd_link_hide_symbol): Likewise. * vms-alpha.c (vms_bfd_link_hide_symbol): Likewise. (alpha_vms_bfd_link_hide_symbol): Likewise. * xsym.c (bfd_sym_bfd_link_hide_symbol): Likewise. * coff64-rs6000.c (rs6000_xcoff64_vec): Add _bfd_generic_link_hide_symbol. (rs6000_xcoff64_aix_vec): Likewise. * elflink.c (bfd_elf_record_link_assignment): Don't make forced local symbol dynamic. (_bfd_elf_link_hide_symbol): New function. * elfxx-x86.c (_bfd_x86_elf_link_symbol_references_local): Don't check root.ldscript_def. * targets.c (bfd_target): Add _bfd_link_hide_symbol. (BFD_JUMP_TABLE_LINK): Add NAME##_bfd_link_hide_symbol. * bfd-in2.h: Regenerated. * libbfd.h: Likewise. ld/ PR ld/23201 * ldexp.c (exp_fold_tree_1): Call bfd_link_hide_symbol to hide a symbol. * testsuite/ld-elf/provide-hidden-dynabs.nd: Removed. * testsuite/ld-elf/provide-hidden-dynsec.nd: Likewise. * testsuite/ld-elf/provide-hidden.exp: Replace provide-hidden-dynsec.nd with provide-hidden-sec.nd and provide-hidden-dyn.nd. Replace provide-hidden-dynabs.nd with provide-hidden-abs.nd and provide-hidden-dyn.nd. * testsuite/ld-i386/pr23189.d: Expect no dynamic relocation. * testsuite/ld-x86-64/pr23189.d: Likewise. --- bfd/ChangeLog | 41 ++++++++++++++++++++ bfd/aout-target.h | 3 ++ bfd/aout-tic30.c | 3 ++ bfd/bfd-in2.h | 12 ++++++ bfd/binary.c | 1 + bfd/coff-alpha.c | 1 + bfd/coff-mips.c | 1 + bfd/coff-rs6000.c | 1 + bfd/coff64-rs6000.c | 2 + bfd/coffcode.h | 4 ++ bfd/elf-bfd.h | 2 + bfd/elflink.c | 21 ++++++++++ bfd/elfxx-target.h | 4 ++ bfd/elfxx-x86.c | 10 ++--- bfd/i386msdos.c | 1 + bfd/ihex.c | 1 + bfd/libbfd-in.h | 2 + bfd/libbfd.h | 2 + bfd/linker.c | 26 +++++++++++++ bfd/mach-o-target.c | 1 + bfd/mmo.c | 1 + bfd/pef.c | 1 + bfd/plugin.c | 1 + bfd/ppcboot.c | 1 + bfd/som.c | 1 + bfd/srec.c | 1 + bfd/targets.c | 5 +++ bfd/tekhex.c | 1 + bfd/vms-alpha.c | 2 + bfd/xsym.c | 1 + ld/ChangeLog | 14 +++++++ ld/ldexp.c | 3 ++ ld/testsuite/ld-elf/provide-hidden-dynabs.nd | 8 ---- ld/testsuite/ld-elf/provide-hidden-dynsec.nd | 8 ---- ld/testsuite/ld-elf/provide-hidden.exp | 8 +++- ld/testsuite/ld-i386/pr23189.d | 4 +- ld/testsuite/ld-x86-64/pr23189.d | 4 +- 37 files changed, 173 insertions(+), 30 deletions(-) delete mode 100644 ld/testsuite/ld-elf/provide-hidden-dynabs.nd delete mode 100644 ld/testsuite/ld-elf/provide-hidden-dynsec.nd diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 7233851acd..0af7a24623 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,44 @@ +2018-05-21 H.J. Lu + + PR ld/23201 + * aout-target.h (MY_bfd_link_hide_symbol): New. + * aout-tic30.c (MY_bfd_link_hide_symbol): Likewise. + * binary.c (binary_bfd_link_hide_symbol): Likewise. + * coff-alpha.c (_bfd_ecoff_bfd_link_hide_symbol): Likewise. + * coff-mips.c (_bfd_ecoff_bfd_link_hide_symbol): Likewise. + * coff-rs6000.c (_bfd_xcoff_bfd_link_hide_symbol): Likewise. + * coffcode.h (coff_bfd_link_hide_symbol): Likewise. + * elf-bfd.h (_bfd_elf_link_hide_symbol): Likewise. + * elfxx-target.h (bfd_elfNN_bfd_link_hide_symbol): Likewise. + * i386msdos.c (msdos_bfd_link_hide_symbol): Likewise. + * ihex.c (ihex_bfd_link_hide_symbol): Likewise. + * libbfd-in.h (_bfd_nolink_bfd_link_hide_symbol): Likewise. + * linker.c (_bfd_generic_link_hide_symbol): Likewise. + (bfd_link_hide_symbol): Likewise. + * mach-o-target.c (bfd_mach_o_bfd_link_hide_symbol): Likewise. + * mmo.c (mmo_bfd_link_hide_symbol): Likewise. + * pef.c (bfd_pef_bfd_link_hide_symbol): Likewise. + * plugin.c (bfd_plugin_bfd_link_hide_symbol): Likewise. + * ppcboot.c (ppcboot_bfd_link_hide_symbol): Likewise. + * som.c (som_bfd_link_hide_symbol): Likewise. + * srec.c (srec_bfd_link_hide_symbol): Likewise. + * tekhex.c (tekhex_bfd_link_hide_symbol): Likewise. + * vms-alpha.c (vms_bfd_link_hide_symbol): Likewise. + (alpha_vms_bfd_link_hide_symbol): Likewise. + * xsym.c (bfd_sym_bfd_link_hide_symbol): Likewise. + * coff64-rs6000.c (rs6000_xcoff64_vec): Add + _bfd_generic_link_hide_symbol. + (rs6000_xcoff64_aix_vec): Likewise. + * elflink.c (bfd_elf_record_link_assignment): Don't make forced + local symbol dynamic. + (_bfd_elf_link_hide_symbol): New function. + * elfxx-x86.c (_bfd_x86_elf_link_symbol_references_local): Don't + check root.ldscript_def. + * targets.c (bfd_target): Add _bfd_link_hide_symbol. + (BFD_JUMP_TABLE_LINK): Add NAME##_bfd_link_hide_symbol. + * bfd-in2.h: Regenerated. + * libbfd.h: Likewise. + 2018-05-21 H.J. Lu PR binutils/23199 diff --git a/bfd/aout-target.h b/bfd/aout-target.h index f245b1e885..9123afcef6 100644 --- a/bfd/aout-target.h +++ b/bfd/aout-target.h @@ -512,6 +512,9 @@ MY_bfd_final_link (bfd *abfd, struct bfd_link_info *info) #ifndef MY_bfd_define_common_symbol #define MY_bfd_define_common_symbol bfd_generic_define_common_symbol #endif +#ifndef MY_bfd_link_hide_symbol +#define MY_bfd_link_hide_symbol _bfd_generic_link_hide_symbol +#endif #ifndef MY_bfd_define_start_stop #define MY_bfd_define_start_stop bfd_generic_define_start_stop #endif diff --git a/bfd/aout-tic30.c b/bfd/aout-tic30.c index 31248ecd91..ddeaaaa98f 100644 --- a/bfd/aout-tic30.c +++ b/bfd/aout-tic30.c @@ -967,6 +967,9 @@ tic30_aout_set_arch_mach (bfd *abfd, #ifndef MY_bfd_define_common_symbol #define MY_bfd_define_common_symbol bfd_generic_define_common_symbol #endif +#ifndef MY_bfd_link_hide_symbol +#define MY_bfd_link_hide_symbol _bfd_generic_link_hide_symbol +#endif #ifndef MY_bfd_define_start_stop #define MY_bfd_define_start_stop bfd_generic_define_start_stop #endif diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index c64eee1fe1..9d643f3ed3 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -7647,6 +7647,7 @@ typedef struct bfd_target NAME##_bfd_discard_group, \ NAME##_section_already_linked, \ NAME##_bfd_define_common_symbol, \ + NAME##_bfd_link_hide_symbol, \ NAME##_bfd_define_start_stop int (*_bfd_sizeof_headers) (bfd *, struct bfd_link_info *); @@ -7713,6 +7714,10 @@ typedef struct bfd_target bfd_boolean (*_bfd_define_common_symbol) (bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *); + /* Hide a symbol. */ + void (*_bfd_link_hide_symbol) (bfd *, struct bfd_link_info *, + struct bfd_link_hash_entry *); + /* Define a __start, __stop, .startof. or .sizeof. symbol. */ struct bfd_link_hash_entry * (*_bfd_define_start_stop) (struct bfd_link_info *, const char *, @@ -7796,6 +7801,13 @@ bfd_boolean bfd_generic_define_common_symbol #define bfd_define_common_symbol(output_bfd, info, h) \ BFD_SEND (output_bfd, _bfd_define_common_symbol, (output_bfd, info, h)) +void _bfd_generic_link_hide_symbol + (bfd *output_bfd, struct bfd_link_info *info, + struct bfd_link_hash_entry *h); + +#define bfd_link_hide_symbol(output_bfd, info, h) \ + BFD_SEND (output_bfd, _bfd_link_hide_symbol, (output_bfd, info, h)) + struct bfd_link_hash_entry *bfd_generic_define_start_stop (struct bfd_link_info *info, const char *symbol, asection *sec); diff --git a/bfd/binary.c b/bfd/binary.c index 0713f5a496..c467b429f6 100644 --- a/bfd/binary.c +++ b/bfd/binary.c @@ -310,6 +310,7 @@ binary_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED, #define binary_bfd_discard_group bfd_generic_discard_group #define binary_section_already_linked _bfd_generic_section_already_linked #define binary_bfd_define_common_symbol bfd_generic_define_common_symbol +#define binary_bfd_link_hide_symbol _bfd_generic_link_hide_symbol #define binary_bfd_define_start_stop bfd_generic_define_start_stop #define binary_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define binary_bfd_link_just_syms _bfd_generic_link_just_syms diff --git a/bfd/coff-alpha.c b/bfd/coff-alpha.c index 0e39f317ed..699398f494 100644 --- a/bfd/coff-alpha.c +++ b/bfd/coff-alpha.c @@ -2394,6 +2394,7 @@ static const struct ecoff_backend_data alpha_ecoff_backend_data = #define _bfd_ecoff_section_already_linked \ _bfd_coff_section_already_linked #define _bfd_ecoff_bfd_define_common_symbol bfd_generic_define_common_symbol +#define _bfd_ecoff_bfd_link_hide_symbol _bfd_generic_link_hide_symbol #define _bfd_ecoff_bfd_define_start_stop bfd_generic_define_start_stop #define _bfd_ecoff_bfd_link_check_relocs _bfd_generic_link_check_relocs diff --git a/bfd/coff-mips.c b/bfd/coff-mips.c index 3a0163a256..d83e10d4b7 100644 --- a/bfd/coff-mips.c +++ b/bfd/coff-mips.c @@ -1420,6 +1420,7 @@ static const struct ecoff_backend_data mips_ecoff_backend_data = #define _bfd_ecoff_section_already_linked \ _bfd_coff_section_already_linked #define _bfd_ecoff_bfd_define_common_symbol bfd_generic_define_common_symbol +#define _bfd_ecoff_bfd_link_hide_symbol _bfd_generic_link_hide_symbol #define _bfd_ecoff_bfd_define_start_stop bfd_generic_define_start_stop #define _bfd_ecoff_set_reloc _bfd_generic_set_reloc diff --git a/bfd/coff-rs6000.c b/bfd/coff-rs6000.c index d8db1f3894..053ab18940 100644 --- a/bfd/coff-rs6000.c +++ b/bfd/coff-rs6000.c @@ -4045,6 +4045,7 @@ const struct xcoff_dwsect_name xcoff_dwsect_names[] = { #define _bfd_xcoff_bfd_discard_group bfd_generic_discard_group #define _bfd_xcoff_section_already_linked _bfd_generic_section_already_linked #define _bfd_xcoff_bfd_define_common_symbol _bfd_xcoff_define_common_symbol +#define _bfd_xcoff_bfd_link_hide_symbol _bfd_generic_link_hide_symbol #define _bfd_xcoff_bfd_define_start_stop bfd_generic_define_start_stop #define _bfd_xcoff_bfd_link_check_relocs _bfd_generic_link_check_relocs diff --git a/bfd/coff64-rs6000.c b/bfd/coff64-rs6000.c index 78f14a09f4..2135001f19 100644 --- a/bfd/coff64-rs6000.c +++ b/bfd/coff64-rs6000.c @@ -2786,6 +2786,7 @@ const bfd_target rs6000_xcoff64_vec = bfd_generic_discard_group, _bfd_generic_section_already_linked, _bfd_xcoff_define_common_symbol, + _bfd_generic_link_hide_symbol, bfd_generic_define_start_stop, /* Dynamic */ @@ -3047,6 +3048,7 @@ const bfd_target rs6000_xcoff64_aix_vec = bfd_generic_discard_group, _bfd_generic_section_already_linked, _bfd_xcoff_define_common_symbol, + _bfd_generic_link_hide_symbol, bfd_generic_define_start_stop, /* Dynamic */ diff --git a/bfd/coffcode.h b/bfd/coffcode.h index 6ad991cf9d..2ca32059cb 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -5749,6 +5749,10 @@ static bfd_coff_backend_data bigobj_swap_table = #define coff_bfd_define_common_symbol bfd_generic_define_common_symbol #endif +#ifndef coff_bfd_link_hide_symbol +#define coff_bfd_link_hide_symbol _bfd_generic_link_hide_symbol +#endif + #ifndef coff_bfd_define_start_stop #define coff_bfd_define_start_stop bfd_generic_define_start_stop #endif diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 7b746900ba..e051c9c089 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -2086,6 +2086,8 @@ extern void _bfd_elf_link_hash_copy_indirect struct elf_link_hash_entry *); extern void _bfd_elf_link_hash_hide_symbol (struct bfd_link_info *, struct elf_link_hash_entry *, bfd_boolean); +extern void _bfd_elf_link_hide_symbol + (bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *); extern bfd_boolean _bfd_elf_link_hash_fixup_symbol (struct bfd_link_info *, struct elf_link_hash_entry *); extern bfd_boolean _bfd_elf_link_hash_table_init diff --git a/bfd/elflink.c b/bfd/elflink.c index ce3765e45b..0383e4e370 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -720,6 +720,7 @@ bfd_elf_record_link_assignment (bfd *output_bfd, || h->ref_dynamic || bfd_link_dll (info) || elf_hash_table (info)->is_relocatable_executable) + && !h->forced_local && h->dynindx == -1) { if (! bfd_elf_link_record_dynamic_symbol (info, h)) @@ -7429,6 +7430,26 @@ _bfd_elf_link_hash_hide_symbol (struct bfd_link_info *info, } } +/* Hide a symbol. */ + +void +_bfd_elf_link_hide_symbol (bfd *output_bfd, + struct bfd_link_info *info, + struct bfd_link_hash_entry *h) +{ + if (is_elf_hash_table (info->hash)) + { + const struct elf_backend_data *bed + = get_elf_backend_data (output_bfd); + struct elf_link_hash_entry *eh + = (struct elf_link_hash_entry *) h; + bed->elf_backend_hide_symbol (info, eh, TRUE); + eh->def_dynamic = 0; + eh->ref_dynamic = 0; + eh->dynamic_def = 0; + } +} + /* Initialize an ELF linker hash table. *TABLE has been zeroed by our caller. */ diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h index 89efed3a5e..a86ea587a2 100644 --- a/bfd/elfxx-target.h +++ b/bfd/elfxx-target.h @@ -205,6 +205,10 @@ #define bfd_elfNN_bfd_define_common_symbol bfd_generic_define_common_symbol #endif +#ifndef bfd_elfNN_bfd_link_hide_symbol +#define bfd_elfNN_bfd_link_hide_symbol _bfd_elf_link_hide_symbol +#endif + #ifndef bfd_elfNN_bfd_lookup_section_flags #define bfd_elfNN_bfd_lookup_section_flags bfd_elf_lookup_section_flags #endif diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c index 29d92d288a..710417f90c 100644 --- a/bfd/elfxx-x86.c +++ b/bfd/elfxx-x86.c @@ -2047,12 +2047,10 @@ _bfd_x86_elf_link_symbol_references_local (struct bfd_link_info *info, return TRUE; } - /* Symbols created by HIDDEN and PROVIDE_HIDDEN assignments in linker - script aren't forced local here yet. bfd_hide_sym_by_version - can't be used to check if a versioned symbol is hidden. It has to - be syncd with _bfd_elf_link_assign_sym_version to get the correct - answer. */ - if (!h->root.ldscript_def && h->versioned == unversioned) + /* bfd_hide_sym_by_version can't be used to check if a versioned symbol + is hidden. It has to be syncd with _bfd_elf_link_assign_sym_version + to get the correct answer. */ + if (h->versioned == unversioned) eh->local_ref = 1; return FALSE; diff --git a/bfd/i386msdos.c b/bfd/i386msdos.c index a47acf4953..77e9880ced 100644 --- a/bfd/i386msdos.c +++ b/bfd/i386msdos.c @@ -230,6 +230,7 @@ msdos_set_section_contents (bfd *abfd, #define msdos_section_already_linked \ _bfd_generic_section_already_linked #define msdos_bfd_define_common_symbol bfd_generic_define_common_symbol +#define msdos_bfd_link_hide_symbol _bfd_generic_link_hide_symbol #define msdos_bfd_define_start_stop bfd_generic_define_start_stop #define msdos_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define msdos_bfd_link_add_symbols _bfd_generic_link_add_symbols diff --git a/bfd/ihex.c b/bfd/ihex.c index 096c19ce2e..80bcbe9f90 100644 --- a/bfd/ihex.c +++ b/bfd/ihex.c @@ -943,6 +943,7 @@ ihex_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED, #define ihex_bfd_discard_group bfd_generic_discard_group #define ihex_section_already_linked _bfd_generic_section_already_linked #define ihex_bfd_define_common_symbol bfd_generic_define_common_symbol +#define ihex_bfd_link_hide_symbol _bfd_generic_link_hide_symbol #define ihex_bfd_define_start_stop bfd_generic_define_start_stop #define ihex_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define ihex_bfd_link_add_symbols _bfd_generic_link_add_symbols diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h index bb3cf48f70..9796f2d67e 100644 --- a/bfd/libbfd-in.h +++ b/bfd/libbfd-in.h @@ -534,6 +534,8 @@ extern bfd_boolean _bfd_nolink_section_already_linked extern bfd_boolean _bfd_nolink_bfd_define_common_symbol (bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *) ATTRIBUTE_HIDDEN; +#define _bfd_nolink_bfd_link_hide_symbol \ + _bfd_generic_link_hide_symbol extern struct bfd_link_hash_entry *_bfd_nolink_bfd_define_start_stop (struct bfd_link_info *, const char *, asection *) ATTRIBUTE_HIDDEN; #define _bfd_nolink_bfd_link_check_relocs \ diff --git a/bfd/libbfd.h b/bfd/libbfd.h index b810c40c40..f357e0e4ab 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -539,6 +539,8 @@ extern bfd_boolean _bfd_nolink_section_already_linked extern bfd_boolean _bfd_nolink_bfd_define_common_symbol (bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *) ATTRIBUTE_HIDDEN; +#define _bfd_nolink_bfd_link_hide_symbol \ + _bfd_generic_link_hide_symbol extern struct bfd_link_hash_entry *_bfd_nolink_bfd_define_start_stop (struct bfd_link_info *, const char *, asection *) ATTRIBUTE_HIDDEN; #define _bfd_nolink_bfd_link_check_relocs \ diff --git a/bfd/linker.c b/bfd/linker.c index 3019919a91..6b4c8e57e1 100644 --- a/bfd/linker.c +++ b/bfd/linker.c @@ -3110,6 +3110,32 @@ bfd_generic_define_common_symbol (bfd *output_bfd, return TRUE; } +/* +FUNCTION + _bfd_generic_link_hide_symbol + +SYNOPSIS + void _bfd_generic_link_hide_symbol + (bfd *output_bfd, struct bfd_link_info *info, + struct bfd_link_hash_entry *h); + +DESCRIPTION + Hide symbol @var{h}. + This is an internal function. It should not be called from + outside the BFD library. + +.#define bfd_link_hide_symbol(output_bfd, info, h) \ +. BFD_SEND (output_bfd, _bfd_link_hide_symbol, (output_bfd, info, h)) +. +*/ + +void +_bfd_generic_link_hide_symbol (bfd *output_bfd ATTRIBUTE_UNUSED, + struct bfd_link_info *info ATTRIBUTE_UNUSED, + struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED) +{ +} + /* FUNCTION bfd_generic_define_start_stop diff --git a/bfd/mach-o-target.c b/bfd/mach-o-target.c index 8859b23907..9f3b487b8d 100644 --- a/bfd/mach-o-target.c +++ b/bfd/mach-o-target.c @@ -55,6 +55,7 @@ #define bfd_mach_o_bfd_discard_group bfd_generic_discard_group #define bfd_mach_o_section_already_linked _bfd_generic_section_already_linked #define bfd_mach_o_bfd_define_common_symbol bfd_generic_define_common_symbol +#define bfd_mach_o_bfd_link_hide_symbol _bfd_generic_link_hide_symbol #define bfd_mach_o_bfd_define_start_stop bfd_generic_define_start_stop #define bfd_mach_o_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data #define bfd_mach_o_core_file_matches_executable_p generic_core_file_matches_executable_p diff --git a/bfd/mmo.c b/bfd/mmo.c index 4b969c2c03..6a3e255803 100644 --- a/bfd/mmo.c +++ b/bfd/mmo.c @@ -3318,6 +3318,7 @@ mmo_write_object_contents (bfd *abfd) #define mmo_section_already_linked \ _bfd_generic_section_already_linked #define mmo_bfd_define_common_symbol bfd_generic_define_common_symbol +#define mmo_bfd_link_hide_symbol _bfd_generic_link_hide_symbol #define mmo_bfd_define_start_stop bfd_generic_define_start_stop /* We want to copy time of creation, otherwise we'd use diff --git a/bfd/pef.c b/bfd/pef.c index a55ca0693a..5746b96b43 100644 --- a/bfd/pef.c +++ b/bfd/pef.c @@ -59,6 +59,7 @@ #define bfd_pef_bfd_discard_group bfd_generic_discard_group #define bfd_pef_section_already_linked _bfd_generic_section_already_linked #define bfd_pef_bfd_define_common_symbol bfd_generic_define_common_symbol +#define bfd_pef_bfd_link_hide_symbol _bfd_generic_link_hide_symbol #define bfd_pef_bfd_define_start_stop bfd_generic_define_start_stop #define bfd_pef_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define bfd_pef_bfd_link_add_symbols _bfd_generic_link_add_symbols diff --git a/bfd/plugin.c b/bfd/plugin.c index a2c1bd5776..16a706a548 100644 --- a/bfd/plugin.c +++ b/bfd/plugin.c @@ -105,6 +105,7 @@ dlerror (void) #define bfd_plugin_bfd_discard_group bfd_generic_discard_group #define bfd_plugin_section_already_linked _bfd_generic_section_already_linked #define bfd_plugin_bfd_define_common_symbol bfd_generic_define_common_symbol +#define bfd_plugin_bfd_link_hide_symbol _bfd_generic_link_hide_symbol #define bfd_plugin_bfd_define_start_stop bfd_generic_define_start_stop #define bfd_plugin_bfd_copy_link_hash_symbol_type _bfd_generic_copy_link_hash_symbol_type #define bfd_plugin_bfd_link_check_relocs _bfd_generic_link_check_relocs diff --git a/bfd/ppcboot.c b/bfd/ppcboot.c index bbb2cc77d4..0d92fd1c82 100644 --- a/bfd/ppcboot.c +++ b/bfd/ppcboot.c @@ -460,6 +460,7 @@ ppcboot_bfd_print_private_bfd_data (bfd *abfd, void * farg) #define ppcboot_section_already_linked \ _bfd_generic_section_already_linked #define ppcboot_bfd_define_common_symbol bfd_generic_define_common_symbol +#define ppcboot_bfd_link_hide_symbol _bfd_generic_link_hide_symbol #define ppcboot_bfd_define_start_stop bfd_generic_define_start_stop #define ppcboot_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define ppcboot_bfd_link_add_symbols _bfd_generic_link_add_symbols diff --git a/bfd/som.c b/bfd/som.c index 6220df7eb8..d2bdc6f5c4 100644 --- a/bfd/som.c +++ b/bfd/som.c @@ -6759,6 +6759,7 @@ som_bfd_link_split_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec) #define som_bfd_discard_group bfd_generic_discard_group #define som_section_already_linked _bfd_generic_section_already_linked #define som_bfd_define_common_symbol bfd_generic_define_common_symbol +#define som_bfd_link_hide_symbol _bfd_generic_link_hide_symbol #define som_bfd_define_start_stop bfd_generic_define_start_stop #define som_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data #define som_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data diff --git a/bfd/srec.c b/bfd/srec.c index 4996109ed1..66cc72fea8 100644 --- a/bfd/srec.c +++ b/bfd/srec.c @@ -1278,6 +1278,7 @@ srec_print_symbol (bfd *abfd, #define srec_bfd_discard_group bfd_generic_discard_group #define srec_section_already_linked _bfd_generic_section_already_linked #define srec_bfd_define_common_symbol bfd_generic_define_common_symbol +#define srec_bfd_link_hide_symbol _bfd_generic_link_hide_symbol #define srec_bfd_define_start_stop bfd_generic_define_start_stop #define srec_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define srec_bfd_link_add_symbols _bfd_generic_link_add_symbols diff --git a/bfd/targets.c b/bfd/targets.c index 5a2a684bc8..531703d226 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -465,6 +465,7 @@ BFD_JUMP_TABLE macros. . NAME##_bfd_discard_group, \ . NAME##_section_already_linked, \ . NAME##_bfd_define_common_symbol, \ +. NAME##_bfd_link_hide_symbol, \ . NAME##_bfd_define_start_stop . . int (*_bfd_sizeof_headers) (bfd *, struct bfd_link_info *); @@ -531,6 +532,10 @@ BFD_JUMP_TABLE macros. . bfd_boolean (*_bfd_define_common_symbol) (bfd *, struct bfd_link_info *, . struct bfd_link_hash_entry *); . +. {* Hide a symbol. *} +. void (*_bfd_link_hide_symbol) (bfd *, struct bfd_link_info *, +. struct bfd_link_hash_entry *); +. . {* Define a __start, __stop, .startof. or .sizeof. symbol. *} . struct bfd_link_hash_entry * . (*_bfd_define_start_stop) (struct bfd_link_info *, const char *, diff --git a/bfd/tekhex.c b/bfd/tekhex.c index 6a00c9f773..893d06def6 100644 --- a/bfd/tekhex.c +++ b/bfd/tekhex.c @@ -981,6 +981,7 @@ tekhex_print_symbol (bfd *abfd, #define tekhex_bfd_discard_group bfd_generic_discard_group #define tekhex_section_already_linked _bfd_generic_section_already_linked #define tekhex_bfd_define_common_symbol bfd_generic_define_common_symbol +#define tekhex_bfd_link_hide_symbol _bfd_generic_link_hide_symbol #define tekhex_bfd_define_start_stop bfd_generic_define_start_stop #define tekhex_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define tekhex_bfd_link_add_symbols _bfd_generic_link_add_symbols diff --git a/bfd/vms-alpha.c b/bfd/vms-alpha.c index b52f580ad3..11817cfbec 100644 --- a/bfd/vms-alpha.c +++ b/bfd/vms-alpha.c @@ -9498,6 +9498,7 @@ bfd_vms_get_data (bfd *abfd) #define vms_bfd_discard_group bfd_generic_discard_group #define vms_section_already_linked _bfd_generic_section_already_linked #define vms_bfd_define_common_symbol bfd_generic_define_common_symbol +#define vms_bfd_link_hide_symbol _bfd_generic_link_hide_symbol #define vms_bfd_define_start_stop bfd_generic_define_start_stop #define vms_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data @@ -9545,6 +9546,7 @@ bfd_vms_get_data (bfd *abfd) _bfd_generic_section_already_linked #define alpha_vms_bfd_define_common_symbol bfd_generic_define_common_symbol +#define alpha_vms_bfd_link_hide_symbol _bfd_generic_link_hide_symbol #define alpha_vms_bfd_define_start_stop bfd_generic_define_start_stop #define alpha_vms_bfd_link_just_syms _bfd_generic_link_just_syms #define alpha_vms_bfd_copy_link_hash_symbol_type \ diff --git a/bfd/xsym.c b/bfd/xsym.c index 8ea0e7e71f..56607f026f 100644 --- a/bfd/xsym.c +++ b/bfd/xsym.c @@ -51,6 +51,7 @@ #define bfd_sym_bfd_discard_group bfd_generic_discard_group #define bfd_sym_section_already_linked _bfd_generic_section_already_linked #define bfd_sym_bfd_define_common_symbol bfd_generic_define_common_symbol +#define bfd_sym_bfd_link_hide_symbol _bfd_generic_link_hide_symbol #define bfd_sym_bfd_define_start_stop bfd_generic_define_start_stop #define bfd_sym_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define bfd_sym_bfd_link_add_symbols _bfd_generic_link_add_symbols diff --git a/ld/ChangeLog b/ld/ChangeLog index 15de953374..0e03d08739 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,17 @@ +2018-05-21 H.J. Lu + + PR ld/23201 + * ldexp.c (exp_fold_tree_1): Call bfd_link_hide_symbol to hide + a symbol. + * testsuite/ld-elf/provide-hidden-dynabs.nd: Removed. + * testsuite/ld-elf/provide-hidden-dynsec.nd: Likewise. + * testsuite/ld-elf/provide-hidden.exp: Replace + provide-hidden-dynsec.nd with provide-hidden-sec.nd and + provide-hidden-dyn.nd. Replace provide-hidden-dynabs.nd with + provide-hidden-abs.nd and provide-hidden-dyn.nd. + * testsuite/ld-i386/pr23189.d: Expect no dynamic relocation. + * testsuite/ld-x86-64/pr23189.d: Likewise. + 2018-05-18 H.J. Lu PR ld/23194 diff --git a/ld/ldexp.c b/ld/ldexp.c index f9dc362930..6fa251e79e 100644 --- a/ld/ldexp.c +++ b/ld/ldexp.c @@ -1200,6 +1200,9 @@ exp_fold_tree_1 (etree_type *tree) h->u.def.section = expld.result.section; h->linker_def = ! tree->assign.type.lineno; h->ldscript_def = 1; + if (tree->assign.hidden) + bfd_link_hide_symbol (link_info.output_bfd, + &link_info, h); /* Copy the symbol type if this is an expression only referencing a single symbol. (If the expression diff --git a/ld/testsuite/ld-elf/provide-hidden-dynabs.nd b/ld/testsuite/ld-elf/provide-hidden-dynabs.nd deleted file mode 100644 index 86e3adcdf9..0000000000 --- a/ld/testsuite/ld-elf/provide-hidden-dynabs.nd +++ /dev/null @@ -1,8 +0,0 @@ -Symbol table '\.dynsym' contains [0-9]+ entries: -#... - *[0-9]+: 0*23400000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +ABS foo -#... -Symbol table '\.symtab' contains [0-9]+ entries: -#... - *[0-9]+: 0*23400000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +ABS foo -#pass diff --git a/ld/testsuite/ld-elf/provide-hidden-dynsec.nd b/ld/testsuite/ld-elf/provide-hidden-dynsec.nd deleted file mode 100644 index 716dfa1f71..0000000000 --- a/ld/testsuite/ld-elf/provide-hidden-dynsec.nd +++ /dev/null @@ -1,8 +0,0 @@ -Symbol table '\.dynsym' contains [0-9]+ entries: -#... - *[0-9]+: 0*23400000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +[0-9]+ foo -#... -Symbol table '\.symtab' contains [0-9]+ entries: -#... - *[0-9]+: 0*23400000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +[0-9]+ foo -#pass diff --git a/ld/testsuite/ld-elf/provide-hidden.exp b/ld/testsuite/ld-elf/provide-hidden.exp index 1fc4e61a19..4b72134911 100644 --- a/ld/testsuite/ld-elf/provide-hidden.exp +++ b/ld/testsuite/ld-elf/provide-hidden.exp @@ -86,7 +86,9 @@ run_ld_link_tests [list \ "$LFLAGS -T provide-hidden-1.ld" "tmpdir/provide-hidden-s.so" \ "" \ [list provide-hidden-3.s] \ - [list "readelf -s provide-hidden-dynsec.nd"] \ + [list \ + [list readelf -s provide-hidden-sec.nd] \ + [list readelf -s provide-hidden-dyn.nd]] \ "provide-hidden-4"] \ [list \ "$testname 5" \ @@ -138,7 +140,9 @@ run_ld_link_tests [list \ "$LFLAGS -T provide-hidden-2.ld" "tmpdir/provide-hidden-s.so" \ "" \ [list provide-hidden-3.s] \ - [list "readelf -s provide-hidden-dynabs.nd"] \ + [list \ + [list readelf -s provide-hidden-abs.nd] \ + [list readelf -s provide-hidden-dyn.nd]] \ "provide-hidden-10"] \ [list \ "$testname 11" \ diff --git a/ld/testsuite/ld-i386/pr23189.d b/ld/testsuite/ld-i386/pr23189.d index 9345b42bd0..d388830f61 100644 --- a/ld/testsuite/ld-i386/pr23189.d +++ b/ld/testsuite/ld-i386/pr23189.d @@ -2,6 +2,4 @@ #ld: -shared -melf_i386 -T pr23189.t #readelf: -r --wide -Relocation section '.rel.dyn' at offset 0x[0-9a-f]+ contains 1 entry: - Offset Info Type Sym. Value Symbol's Name -[0-9a-f]+ +[0-9a-f]+ +R_386_RELATIVE + +There are no relocations in this file. diff --git a/ld/testsuite/ld-x86-64/pr23189.d b/ld/testsuite/ld-x86-64/pr23189.d index 7951c7acc3..6fc4b7ee2c 100644 --- a/ld/testsuite/ld-x86-64/pr23189.d +++ b/ld/testsuite/ld-x86-64/pr23189.d @@ -2,6 +2,4 @@ #ld: -shared -melf_x86_64 -T pr23189.t #readelf: -r --wide -Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entry: - Offset Info Type Symbol's Value Symbol's Name \+ Addend -[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[0-9a-f]+ +There are no relocations in this file. -- 2.34.1