This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH] ld: Hide symbols defined by HIDDEN/PROVIDE_HIDDEN
On Sun, May 20, 2018 at 7:11 PM, Alan Modra <amodra@gmail.com> wrote:
> On Fri, May 18, 2018 at 08:49:19PM -0700, H.J. Lu wrote:
>> On Fri, May 18, 2018 at 8:39 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>> > On Fri, May 18, 2018 at 8:23 PM, Alan Modra <amodra@gmail.com> wrote:
>> >> I see x86_64-linux and powerpc64le-linux segfaults with this patch.
>> >
>>
>> Do you have a testcase?
>
> These are my test results. Looking in x86_64-linux/ld/ld.log shows
>
> Executing on host: sh -c {./ld-new -z norelro -L/home/alan/src/binutils-gdb/ld/testsuite/ld-i386 -shared -melf_i386 --version-script pr23194.map -o tmpdir/dump tmpdir/pr23194.o 2>&1} /dev/null ld.tmp (timeout = 300)
> spawn [open ...]
> Segmentation fault (core dumped)
> failed with: <Segmentation fault (core dumped)>, no expected output
> Segmentation fault (core dumped)
> FAIL: ld-i386/pr23194
>
> and a similar result for ld-x86-64/pr23194
I can't reproduce it on native x86-64 nor i686.
> The first powerpc64le-linux failure is:
>
> Executing on host: sh -c {/home/alan/build/gas/powerpc64le-linux/ld/ld-new -o tmpdir/provide-hidden-4 -z norelro -L/home/alan/src/binutils-gdb/ld/testsuite/ld-elf -T provide-hidden-1.ld tmpdir/provide-hidden-3.o tmpdir/provide-hidden-s.so 2>&1} /dev/null ld.tmp (timeout = 300)
> spawn [open ...]
> /home/alan/build/gas/powerpc64le-linux/ld/ld-new: BFD (GNU Binutils) 2.30.51.20180519 assertion fail /home/alan/src/binutils-gdb/bfd/elf-strtab.c:197
> /home/alan/build/gas/powerpc64le-linux/ld/ld-new: BFD (GNU Binutils) 2.30.51.20180519 assertion fail /home/alan/src/binutils-gdb/bfd/elf-strtab.c:198
> Segmentation fault (core dumped)
> /home/alan/build/gas/powerpc64le-linux/ld/ld-new: BFD (GNU Binutils) 2.30.51.20180519 assertion fail /home/alan/src/binutils-gdb/bfd/elf-strtab.c:197
> /home/alan/build/gas/powerpc64le-linux/ld/ld-new: BFD (GNU Binutils) 2.30.51.20180519 assertion fail /home/alan/src/binutils-gdb/bfd/elf-strtab.c:198
> Segmentation fault (core dumped)
> FAIL: PROVIDE_HIDDEN test 4
I can reproduce it. bfd_elf_record_link_assignment has
/* STV_HIDDEN and STV_INTERNAL symbols must be STB_LOCAL in shared objects
and executables. */
if (!bfd_link_relocatable (info)
&& h->dynindx != -1
&& (ELF_ST_VISIBILITY (h->other) == STV_HIDDEN
|| ELF_ST_VISIBILITY (h->other) == STV_INTERNAL))
h->forced_local = 1;
if ((h->def_dynamic
|| h->ref_dynamic
|| bfd_link_dll (info)
|| elf_hash_table (info)->is_relocatable_executable)
&& h->dynindx == -1)
{
if (! bfd_elf_link_record_dynamic_symbol (info, h))
return FALSE;
Should we make a forced local symbol dynamic here?
> arm-symbianelf -FAIL: PROVIDE_HIDDEN test 3
> arm-symbianelf -FAIL: PROVIDE_HIDDEN test 5
> arm-symbianelf -FAIL: PROVIDE_HIDDEN test 6
> arm-symbianelf +FAIL: PROVIDE_HIDDEN test 10
I took a look at arm-symbian. There are so many linker test failures.
My patch is actually an improvement.
> i586-linux +FAIL: ld-i386/pr23194
> i686-nacl +FAIL: ld-i386/pr23194
> i686-pc-elf +FAIL: ld-i386/pr23194
> powerpc64-freebsd +FAIL: PROVIDE_HIDDEN test 4
> powerpc64-freebsd +FAIL: PROVIDE_HIDDEN test 10
> powerpc64le-linux +FAIL: PROVIDE_HIDDEN test 4
> powerpc64le-linux +FAIL: PROVIDE_HIDDEN test 10
> powerpc64-linux +FAIL: PROVIDE_HIDDEN test 4
> powerpc64-linux +FAIL: PROVIDE_HIDDEN test 10
> powerpc-eabisim +FAIL: PROVIDE_HIDDEN test 4
> powerpc-eabisim +FAIL: PROVIDE_HIDDEN test 10
> powerpc-eabivle +FAIL: PROVIDE_HIDDEN test 4
> powerpc-eabivle +FAIL: PROVIDE_HIDDEN test 10
> powerpc-freebsd +FAIL: PROVIDE_HIDDEN test 4
> powerpc-freebsd +FAIL: PROVIDE_HIDDEN test 10
> powerpcle-elf +FAIL: PROVIDE_HIDDEN test 4
> powerpcle-elf +FAIL: PROVIDE_HIDDEN test 10
> powerpc-linux +FAIL: PROVIDE_HIDDEN test 4
> powerpc-linux +FAIL: PROVIDE_HIDDEN test 10
> powerpc-nto +FAIL: PROVIDE_HIDDEN test 4
> powerpc-nto +FAIL: PROVIDE_HIDDEN test 10
> ppc-lynxos +FAIL: PROVIDE_HIDDEN test 4
> ppc-lynxos +FAIL: PROVIDE_HIDDEN test 10
I can reproduce them.
> tic6x-elf -FAIL: PROVIDE_HIDDEN test 6
> tic6x-elf -FAIL: PROVIDE_HIDDEN test 12
2 new passes.
> tic6x-elf +FAIL: C6X shared library without --dsbt-index
> tic6x-elf +FAIL: C6X shared library, LE, RELA
> tic6x-elf +FAIL: C6X nonstatic app using shared library, LE, RELA
> tic6x-elf +FAIL: C6X shared library, LE, REL
> tic6x-elf +FAIL: C6X nonstatic app using shared library, LE, REL
> tic6x-elf +FAIL: C6X shared library, BE, RELA
> tic6x-elf +FAIL: C6X nonstatic app using shared library, BE, RELA
> tic6x-elf +FAIL: C6X shared library, BE, REL
> tic6x-elf +FAIL: C6X nonstatic app using shared library, BE, REL
> tic6x-elf +FAIL: C6X static app, LE, RELA
> tic6x-elf +FAIL: C6X static app, LE, REL
> tic6x-elf +FAIL: C6X static app, BE, RELA
> tic6x-elf +FAIL: C6X static app, BE, REL
These failures are due to offset/address changes. The binaries are smaller.
They may be related to 2 new passes.
> x86_64-linux +FAIL: ld-i386/pr23194
> x86_64-linux +FAIL: ld-x86-64/pr23194
> x86_64-nacl +FAIL: ld-i386/pr23194
> x86_64-nacl +FAIL: ld-x86-64/pr23194
> x86_64-pc-linux-gnux32 +FAIL: ld-i386/pr23194
> x86_64-pc-linux-gnux32 +FAIL: ld-x86-64/pr23194
>
Here is the updated patch which avoids making forced local symbol
dynamic. There are no regressions on native x86-64 and i686 as
well as for cross ppc-linux and ppc64-linux.
--
H.J.
From 80865b8b4f043c903834385a0d7fd27faece12eb Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Fri, 18 May 2018 07:48:13 -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/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/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 +--
35 files changed, 118 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/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 9d11dd0c39..62a2c249b4 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -7685,6 +7685,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 *);
@@ -7751,6 +7752,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 *,
@@ -7834,6 +7839,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/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.17.0