This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH, committed] x86: Don't set eh->local_ref to 1 for versioned symbol
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: Binutils <binutils at sourceware dot org>
- Date: Mon, 21 May 2018 07:42:39 -0700
- Subject: Re: [PATCH, committed] x86: Don't set eh->local_ref to 1 for versioned symbol
- References: <20180518213641.GA15841@intel.com>
On Fri, May 18, 2018 at 2:36 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> bfd_hide_sym_by_version can't be used to check if a versioned symbol is
> hidden. It has to be synced with _bfd_elf_link_assign_sym_version to
> get the correct answer.
>
> bfd/
>
> PR ld/23194
> * elfxx-x86.c (_bfd_x86_elf_link_symbol_references_local): Don't
> set eh->local_ref to 1 if a symbol is versioned and there is a
> version script.
>
> ld/
>
> PR ld/23194
> * testsuite/ld-i386/i386.exp: Run pr23194.
> * testsuite/ld-x86-64/x86-64.exp: Likewise.
> * testsuite/ld-i386/pr23194.d: New file.
> * testsuite/ld-i386/pr23194.map: Likewise.
> * testsuite/ld-i386/pr23194.s: Likewise.
> * testsuite/ld-x86-64/pr23194.d: Likewise.
> * testsuite/ld-x86-64/pr23194.map: Likewise.
> * testsuite/ld-x86-64/pr23194.s: Likewise.
I am backporting it to binutils 2.30 branch.
> ---
> bfd/ChangeLog | 7 +++++++
> bfd/elfxx-x86.c | 7 +++++--
> ld/ChangeLog | 12 ++++++++++++
> ld/testsuite/ld-i386/i386.exp | 1 +
> ld/testsuite/ld-i386/pr23194.d | 7 +++++++
> ld/testsuite/ld-i386/pr23194.map | 6 ++++++
> ld/testsuite/ld-i386/pr23194.s | 12 ++++++++++++
> ld/testsuite/ld-x86-64/pr23194.d | 7 +++++++
> ld/testsuite/ld-x86-64/pr23194.map | 6 ++++++
> ld/testsuite/ld-x86-64/pr23194.s | 12 ++++++++++++
> ld/testsuite/ld-x86-64/x86-64.exp | 1 +
> 11 files changed, 76 insertions(+), 2 deletions(-)
> create mode 100644 ld/testsuite/ld-i386/pr23194.d
> create mode 100644 ld/testsuite/ld-i386/pr23194.map
> create mode 100644 ld/testsuite/ld-i386/pr23194.s
> create mode 100644 ld/testsuite/ld-x86-64/pr23194.d
> create mode 100644 ld/testsuite/ld-x86-64/pr23194.map
> create mode 100644 ld/testsuite/ld-x86-64/pr23194.s
>
> diff --git a/bfd/ChangeLog b/bfd/ChangeLog
> index cc8773cb14..bab543b9ce 100644
> --- a/bfd/ChangeLog
> +++ b/bfd/ChangeLog
> @@ -1,3 +1,10 @@
> +2018-05-18 H.J. Lu <hongjiu.lu@intel.com>
> +
> + PR ld/23194
> + * elfxx-x86.c (_bfd_x86_elf_link_symbol_references_local): Don't
> + set eh->local_ref to 1 if a symbol is versioned and there is a
> + version script.
> +
> 2018-05-18 Kito Cheng <kito.cheng@gmail.com>
>
> * elfnn-riscv.c (_bfd_riscv_elf_merge_private_bfd_data): Handle
> diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c
> index f4dbddf15e..29d92d288a 100644
> --- a/bfd/elfxx-x86.c
> +++ b/bfd/elfxx-x86.c
> @@ -2048,8 +2048,11 @@ _bfd_x86_elf_link_symbol_references_local (struct bfd_link_info *info,
> }
>
> /* Symbols created by HIDDEN and PROVIDE_HIDDEN assignments in linker
> - script aren't forced local here yet. */
> - if (!h->root.ldscript_def)
> + 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)
> eh->local_ref = 1;
>
> return FALSE;
> diff --git a/ld/ChangeLog b/ld/ChangeLog
> index eb7fac4892..15de953374 100644
> --- a/ld/ChangeLog
> +++ b/ld/ChangeLog
> @@ -1,3 +1,15 @@
> +2018-05-18 H.J. Lu <hongjiu.lu@intel.com>
> +
> + PR ld/23194
> + * testsuite/ld-i386/i386.exp: Run pr23194.
> + * testsuite/ld-x86-64/x86-64.exp: Likewise.
> + * testsuite/ld-i386/pr23194.d: New file.
> + * testsuite/ld-i386/pr23194.map: Likewise.
> + * testsuite/ld-i386/pr23194.s: Likewise.
> + * testsuite/ld-x86-64/pr23194.d: Likewise.
> + * testsuite/ld-x86-64/pr23194.map: Likewise.
> + * testsuite/ld-x86-64/pr23194.s: Likewise.
> +
> 2018-05-18 H.J. Lu <hongjiu.lu@intel.com>
>
> * testsuite/ld-i386/i386.exp: Run pr23189 for all targets.
> diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp
> index 5683a75208..bb91a760ca 100644
> --- a/ld/testsuite/ld-i386/i386.exp
> +++ b/ld/testsuite/ld-i386/i386.exp
> @@ -459,6 +459,7 @@ run_dump_test "pr22135"
> run_dump_test "pr22782"
> run_dump_test "pr22929"
> run_dump_test "pr23189"
> +run_dump_test "pr23194"
>
> if { !([istarget "i?86-*-linux*"]
> || [istarget "i?86-*-gnu*"]
> diff --git a/ld/testsuite/ld-i386/pr23194.d b/ld/testsuite/ld-i386/pr23194.d
> new file mode 100644
> index 0000000000..b5e8c3330e
> --- /dev/null
> +++ b/ld/testsuite/ld-i386/pr23194.d
> @@ -0,0 +1,7 @@
> +#as: --32 -mrelax-relocations=yes
> +#ld: -shared -melf_i386 --version-script pr23194.map
> +#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 +
> diff --git a/ld/testsuite/ld-i386/pr23194.map b/ld/testsuite/ld-i386/pr23194.map
> new file mode 100644
> index 0000000000..353c194af5
> --- /dev/null
> +++ b/ld/testsuite/ld-i386/pr23194.map
> @@ -0,0 +1,6 @@
> +FOO {
> + global:
> + bar;
> + local:
> + *;
> +};
> diff --git a/ld/testsuite/ld-i386/pr23194.s b/ld/testsuite/ld-i386/pr23194.s
> new file mode 100644
> index 0000000000..32693feb7f
> --- /dev/null
> +++ b/ld/testsuite/ld-i386/pr23194.s
> @@ -0,0 +1,12 @@
> + .text
> + .symver foo,foo@FOO
> + .globl foo
> + .type foo, @function
> +foo:
> + ret
> + .size foo, .-foo
> + .globl bar
> + .type bar, @function
> +bar:
> + jmp *foo@GOT(%eax)
> + .size bar, .-bar
> diff --git a/ld/testsuite/ld-x86-64/pr23194.d b/ld/testsuite/ld-x86-64/pr23194.d
> new file mode 100644
> index 0000000000..6b12060822
> --- /dev/null
> +++ b/ld/testsuite/ld-x86-64/pr23194.d
> @@ -0,0 +1,7 @@
> +#as: --64 -mrelax-relocations=yes
> +#ld: -shared -melf_x86_64 --version-script pr23194.map
> +#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]+
> diff --git a/ld/testsuite/ld-x86-64/pr23194.map b/ld/testsuite/ld-x86-64/pr23194.map
> new file mode 100644
> index 0000000000..353c194af5
> --- /dev/null
> +++ b/ld/testsuite/ld-x86-64/pr23194.map
> @@ -0,0 +1,6 @@
> +FOO {
> + global:
> + bar;
> + local:
> + *;
> +};
> diff --git a/ld/testsuite/ld-x86-64/pr23194.s b/ld/testsuite/ld-x86-64/pr23194.s
> new file mode 100644
> index 0000000000..277c19d6dc
> --- /dev/null
> +++ b/ld/testsuite/ld-x86-64/pr23194.s
> @@ -0,0 +1,12 @@
> + .text
> + .symver foo,foo@FOO
> + .globl foo
> + .type foo, @function
> +foo:
> + ret
> + .size foo, .-foo
> + .globl bar
> + .type bar, @function
> +bar:
> + jmp *foo@GOTPCREL(%rip)
> + .size bar, .-bar
> diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
> index 9654cda4fa..d07054ca4c 100644
> --- a/ld/testsuite/ld-x86-64/x86-64.exp
> +++ b/ld/testsuite/ld-x86-64/x86-64.exp
> @@ -396,6 +396,7 @@ run_dump_test "pr22135"
> run_dump_test "pr22782a"
> run_dump_test "pr22782b"
> run_dump_test "pr23189"
> +run_dump_test "pr23194"
>
> if { ![istarget "x86_64-*-linux*"] && ![istarget "x86_64-*-nacl*"]} {
> return
> --
> 2.17.0
>
--
H.J.