From: H.J. Lu Date: Tue, 20 Mar 2018 10:51:26 +0000 (-0700) Subject: Set non_ir_ref_dynamic if a symbol is made dynamic X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=416c34d683f2a17aefe19afb466af4316c7c603b;p=binutils-gdb.git Set non_ir_ref_dynamic if a symbol is made dynamic If a symbol is made dynamic by --dynamic-list, it has non-IR reference. bfd/ PR ld/22983 * elflink.c (bfd_elf_link_mark_dynamic_symbol): Set non_ir_ref_dynamic if a symbol is made dynamic by --dynamic-list. ld/ PR ld/22983 * testsuite/ld-plugin/lto.exp: Run PR ld/22983 test. * testsuite/ld-plugin/pr22983.d: New file. * testsuite/ld-plugin/pr22983.t: Likewise. * testsuite/ld-plugin/pr22983a.c: Likewise. * testsuite/ld-plugin/pr22983b.c: Likewise. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b94c5dfd688..1850d200ddb 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2018-03-20 H.J. Lu + + PR ld/22983 + * elflink.c (bfd_elf_link_mark_dynamic_symbol): Set + non_ir_ref_dynamic if a symbol is made dynamic by --dynamic-list. + 2018-03-19 Nick Clifton * po/es.po: Updated Spanish translation. diff --git a/bfd/elflink.c b/bfd/elflink.c index 6a3d516ba8a..ce3765e45b4 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -586,7 +586,12 @@ bfd_elf_link_mark_dynamic_symbol (struct bfd_link_info *info, || (d != NULL && h->non_elf && (*d->match) (&d->head, NULL, h->root.root.string))) - h->dynamic = 1; + { + h->dynamic = 1; + /* NB: If a symbol is made dynamic by --dynamic-list, it has + non-IR reference. */ + h->root.non_ir_ref_dynamic = 1; + } } /* Record an assignment to a symbol made by a linker script. We need diff --git a/ld/ChangeLog b/ld/ChangeLog index 522d0078a74..2eaf710e9c8 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,12 @@ +2018-03-20 H.J. Lu + + PR ld/22983 + * testsuite/ld-plugin/lto.exp: Run PR ld/22983 test. + * testsuite/ld-plugin/pr22983.d: New file. + * testsuite/ld-plugin/pr22983.t: Likewise. + * testsuite/ld-plugin/pr22983a.c: Likewise. + * testsuite/ld-plugin/pr22983b.c: Likewise. + 2018-03-15 Andreas Schwab PR ld/22949 diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp index 7300f481f31..19aec3f7f2b 100644 --- a/ld/testsuite/ld-plugin/lto.exp +++ b/ld/testsuite/ld-plugin/lto.exp @@ -573,6 +573,16 @@ run_ld_link_exec_tests $lto_run_tests if { [is_elf_format] } { run_ld_link_exec_tests $lto_run_elf_tests + run_cc_link_tests [list \ + [list \ + "Build pr22983" \ + "-Wl,--dynamic-list,pr22983.t" \ + "-flto" \ + {pr22983a.c pr22983b.c} \ + {{readelf {--dyn-syms --wide} pr22983.d}} \ + "pr22983" \ + ] \ + ] } if { [is_elf_format] && [check_lto_shared_available] } { diff --git a/ld/testsuite/ld-plugin/pr22983.d b/ld/testsuite/ld-plugin/pr22983.d new file mode 100644 index 00000000000..af1d710d3f0 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr22983.d @@ -0,0 +1,9 @@ +Symbol table '\.dynsym' contains [0-9]+ entries: + +Num: +Value +Size Type +Bind +Vis +Ndx Name +#... + +[0-9]+: +[0-9a-f]+ +[0-9a-f]+ +OBJECT +GLOBAL +DEFAULT +[0-9]+ +var_attr_used_enabled + +[0-9]+: +[0-9a-f]+ +[0-9a-f]+ +OBJECT +GLOBAL +DEFAULT +[0-9]+ +var_attr_used_disabled +#... + +[0-9]+: +[0-9a-f]+ +[0-9a-f]+ +FUNC +GLOBAL +DEFAULT +[0-9]+ +func_attr_used_enabled + +[0-9]+: +[0-9a-f]+ +[0-9a-f]+ +FUNC +GLOBAL +DEFAULT +[0-9]+ +func_attr_used_disabled +#... diff --git a/ld/testsuite/ld-plugin/pr22983.t b/ld/testsuite/ld-plugin/pr22983.t new file mode 100644 index 00000000000..ca31f10965c --- /dev/null +++ b/ld/testsuite/ld-plugin/pr22983.t @@ -0,0 +1,6 @@ +{ +var_attr_used_disabled; +var_attr_used_enabled; +func_attr_used_disabled; +func_attr_used_enabled; +}; diff --git a/ld/testsuite/ld-plugin/pr22983a.c b/ld/testsuite/ld-plugin/pr22983a.c new file mode 100644 index 00000000000..283f263bff4 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr22983a.c @@ -0,0 +1,14 @@ +#include + +int func_attr_used_disabled(int val); +int func_attr_used_enabled(int val); +extern int var_attr_used_enabled; +extern int var_attr_used_disabled; + +int main(int argc, const char **argv){ + printf("%d\n", var_attr_used_disabled); + printf("%d\n", var_attr_used_enabled); + printf("%d\n", func_attr_used_disabled(1)); + printf("%d\n", func_attr_used_enabled(1)); + return 0; +} diff --git a/ld/testsuite/ld-plugin/pr22983b.c b/ld/testsuite/ld-plugin/pr22983b.c new file mode 100644 index 00000000000..1b66ed889fd --- /dev/null +++ b/ld/testsuite/ld-plugin/pr22983b.c @@ -0,0 +1,10 @@ +int func_attr_used_disabled(int val){ + return val + 1; +} +__attribute__((used)) +int func_attr_used_enabled(int val){ + return val + 1; +} +__attribute__((used)) +int var_attr_used_enabled = 0b0101010101; +int var_attr_used_disabled = 0b0101010101;