ld: Hide symbols defined by HIDDEN/PROVIDE_HIDDEN
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 22 May 2018 03:39:09 +0000 (20:39 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 22 May 2018 03:39:30 +0000 (20:39 -0700)
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.

37 files changed:
bfd/ChangeLog
bfd/aout-target.h
bfd/aout-tic30.c
bfd/bfd-in2.h
bfd/binary.c
bfd/coff-alpha.c
bfd/coff-mips.c
bfd/coff-rs6000.c
bfd/coff64-rs6000.c
bfd/coffcode.h
bfd/elf-bfd.h
bfd/elflink.c
bfd/elfxx-target.h
bfd/elfxx-x86.c
bfd/i386msdos.c
bfd/ihex.c
bfd/libbfd-in.h
bfd/libbfd.h
bfd/linker.c
bfd/mach-o-target.c
bfd/mmo.c
bfd/pef.c
bfd/plugin.c
bfd/ppcboot.c
bfd/som.c
bfd/srec.c
bfd/targets.c
bfd/tekhex.c
bfd/vms-alpha.c
bfd/xsym.c
ld/ChangeLog
ld/ldexp.c
ld/testsuite/ld-elf/provide-hidden-dynabs.nd [deleted file]
ld/testsuite/ld-elf/provide-hidden-dynsec.nd [deleted file]
ld/testsuite/ld-elf/provide-hidden.exp
ld/testsuite/ld-i386/pr23189.d
ld/testsuite/ld-x86-64/pr23189.d

index 7233851acd736ca46ae61e69e35d55b8b3e1c2ad..0af7a24623bdd80a8d030fc0e88df940da0f0420 100644 (file)
@@ -1,3 +1,44 @@
+2018-05-21  H.J. Lu  <hongjiu.lu@intel.com>
+
+       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  <hongjiu.lu@intel.com>
 
        PR binutils/23199
index f245b1e885656fbb1f70a98c2a3d3ad764e2f091..9123afcef6cb561d0ae12bbfe37e631b0629cb3a 100644 (file)
@@ -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
index 31248ecd916c11d53d218cb1d80967469d6a6faf..ddeaaaa98f53d761aa275423d0670d4de6dc9088 100644 (file)
@@ -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
index c64eee1fe1e58859fabf395eca2cf079ee943b76..9d643f3ed3d0d345369f8364edc79279e0330a99 100644 (file)
@@ -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);
index 0713f5a496192bcd14e3167b71355f33fab202ba..c467b429f644c1397322eec3aefdfb7ba8bbfe1d 100644 (file)
@@ -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
index 0e39f317ed2b233f0c9d19f112d83233e41b2257..699398f494c37a6741ad9fb10c917b845fa178cb 100644 (file)
@@ -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
 
index 3a0163a256b57e6469dfdc3dd0704cbb770bdd7f..d83e10d4b76cce12d3ef511b14b5c22edc3f28bd 100644 (file)
@@ -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
 
index d8db1f3894bab65bbd000a7f8ccabaa7ab1c0939..053ab18940e15fdd0e98588ba3952752493b975d 100644 (file)
@@ -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
 
index 78f14a09f45e94b310ecc85e304172a6666f2c3e..2135001f191732ec4f9cdd42bea0e3deeb632bea 100644 (file)
@@ -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 */
index 6ad991cf9d24773e60021faa77da582fa9be23a7..2ca32059cb409c9686098496a11f69d02c1fa6dd 100644 (file)
@@ -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
index 7b746900bad98a69e33414b167f20f73421ce44d..e051c9c0892b84cdacacc76707aa3f1d4ad3e5bb 100644 (file)
@@ -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
index ce3765e45b470544db3ae8103f6387adad1d60a3..0383e4e37034ee66828cfd801e064a11d2d8d067 100644 (file)
@@ -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.  */
 
index 89efed3a5e4d5d0950ec8054091dd55e1db8ad16..a86ea587a2343c2d6eadbe17bae873198193a502 100644 (file)
 #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
index 29d92d288acdb0087f6473b94b167c0f8056f80a..710417f90c0721c56952a31ef657ea4c7fcaff11 100644 (file)
@@ -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;
index a47acf4953c7313dfd19906f9d19d9729117b1f2..77e9880ced5e249f534576d5c63185b5b23cf3c0 100644 (file)
@@ -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
index 096c19ce2ee2af98d5d2186be5146981663ebaf9..80bcbe9f90a412a461e1504175b86b2f21d88654 100644 (file)
@@ -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
index bb3cf48f70168803b15eceb12e800494223fcea0..9796f2d67ecc62fccbf65a876046d8f3a41cdcf2 100644 (file)
@@ -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 \
index b810c40c405c620dfe27c11835a1087c3ce3b198..f357e0e4ab10d04b1bbc1105d08262879a9e8bc3 100644 (file)
@@ -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 \
index 3019919a9165eb3d1dcdcd717f9f5e4013849795..6b4c8e57e1186a4a4682b89b72415829437dbf97 100644 (file)
@@ -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
index 8859b23907a26cdeac7441fd427103df50bdf54b..9f3b487b8da29aefa5796cb59fc29fb861f3da15 100644 (file)
@@ -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
index 4b969c2c03871aeb033d68285f567df633f7287a..6a3e255803babe760cde39b45afaa3b6c38ac11a 100644 (file)
--- 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
index a55ca0693a24ec7d666baabb89ed966a24fcd5ec..5746b96b4303118ea0903c33998d98152ee9c2f8 100644 (file)
--- 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
index a2c1bd57765cb212acea77489f5a98b00d6ad5d5..16a706a548088a348d2d35aed0894ae18593de4d 100644 (file)
@@ -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
index bbb2cc77d45c73cbfe8c223ebb3f3b444e3d31da..0d92fd1c82732a9ca85fd378045ffb3f8d4ea3fa 100644 (file)
@@ -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
index 6220df7eb8f04cf731671ef129385db684b3d5dd..d2bdc6f5c4420144bff26f99de917e21dab2de9c 100644 (file)
--- 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
index 4996109ed137a3fbfef73f390876f5a60bbc07e2..66cc72fea8c7b49f824772e4de2259479a3e7c7e 100644 (file)
@@ -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
index 5a2a684bc820b1a024706c9a0a4dc3f67dfc1a04..531703d226a1971c1da233409960ae415572e1a0 100644 (file)
@@ -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 *,
index 6a00c9f77311b87e6bfe524e49bfd0460b67353d..893d06def699fac4f58d92d25fe74d2aae339fca 100644 (file)
@@ -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
index b52f580ad3358060e702d9b3d9dac21f76bb0af9..11817cfbec1f5c80deaf1cf1d1d82c3bea72d0ef 100644 (file)
@@ -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 \
index 8ea0e7e71f1570236cf520aa9234250b9f3656a7..56607f026ff03fc7a2289488dfaab1cfebcc7c2d 100644 (file)
@@ -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
index 15de953374b3bd3330049b9440cce1c842373a06..0e03d0873946ba35d67622cc683eb654a92f3db1 100644 (file)
@@ -1,3 +1,17 @@
+2018-05-21  H.J. Lu  <hongjiu.lu@intel.com>
+
+       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  <hongjiu.lu@intel.com>
 
        PR ld/23194
index f9dc362930f33b6791186da3544d23c60231fa27..6fa251e79e4b500141d5e851e3c55a6a73629d84 100644 (file)
@@ -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 (file)
index 86e3adc..0000000
+++ /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 (file)
index 716dfa1..0000000
+++ /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
index 1fc4e61a19127d31b7768904262900cd71165be3..4b721349115daddc5db6d33265a02efd0c334ca6 100644 (file)
@@ -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" \
index 9345b42bd0c8466ec775cb65516f7548e86f295f..d388830f614f67c3a13758ed4765adc5dc5f4225 100644 (file)
@@ -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.
index 7951c7acc3128b5f31980025d4497bb2157a08d9..6fc4b7ee2c3abeb1a47faea795aa0c28a1b92af6 100644 (file)
@@ -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.