This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH, committed] x86: Don't set eh->local_ref to 1 for versioned symbol


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.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]