PR ld/20276: Set non_ir_ref on common symbol
Also, don't check alignment on symbol from plugin dummy input. bfd/ PR ld/20276 * elflink.c (elf_link_add_object_symbols): Don't check alignment on symbol from plugin dummy input. ld/ PR ld/20276 * plugin.c (plugin_notice): Set non_ir_ref on common symbols. * testsuite/ld-plugin/lto.exp (lto_link_tests): Add test for PR ld/20276. (lto_run_tests): Likewise. * testsuite/ld-plugin/pass.out: New file. * testsuite/ld-plugin/pr20276a.c: Likewise. * testsuite/ld-plugin/pr20276b.c: Likewise.
This commit is contained in:
parent
6336b4b737
commit
0616a28038
8 changed files with 66 additions and 14 deletions
|
@ -1,3 +1,9 @@
|
|||
2016-06-20 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR ld/20276
|
||||
* elflink.c (elf_link_add_object_symbols): Don't check alignment
|
||||
on symbol from plugin dummy input.
|
||||
|
||||
2016-06-18 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* bfd.c (bfd_plugin_format): Rename bfd_plugin_uknown to
|
||||
|
|
|
@ -4556,7 +4556,8 @@ error_free_dyn:
|
|||
|
||||
symbol_align = ffs (h->root.u.def.value) - 1;
|
||||
if (h->root.u.def.section->owner != NULL
|
||||
&& (h->root.u.def.section->owner->flags & DYNAMIC) == 0)
|
||||
&& (h->root.u.def.section->owner->flags
|
||||
& (DYNAMIC | BFD_PLUGIN)) == 0)
|
||||
{
|
||||
normal_align = h->root.u.def.section->alignment_power;
|
||||
if (normal_align > symbol_align)
|
||||
|
|
12
ld/ChangeLog
12
ld/ChangeLog
|
@ -1,3 +1,15 @@
|
|||
2016-06-20 H.J. Lu <hongjiu.lu@intel.com>
|
||||
Alan Modra <amodra@gmail.com>
|
||||
|
||||
PR ld/20276
|
||||
* plugin.c (plugin_notice): Set non_ir_ref on common symbols.
|
||||
* testsuite/ld-plugin/lto.exp (lto_link_tests): Add test for
|
||||
PR ld/20276.
|
||||
(lto_run_tests): Likewise.
|
||||
* testsuite/ld-plugin/pass.out: New file.
|
||||
* testsuite/ld-plugin/pr20276a.c: Likewise.
|
||||
* testsuite/ld-plugin/pr20276b.c: Likewise.
|
||||
|
||||
2016-06-18 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* plugin.c (plugin_object_p): Replace bfd_plugin_uknown
|
||||
|
|
24
ld/plugin.c
24
ld/plugin.c
|
@ -1325,13 +1325,22 @@ plugin_notice (struct bfd_link_info *info,
|
|||
h->non_ir_ref = TRUE;
|
||||
}
|
||||
|
||||
/* Otherwise, it must be a new def. Ensure any symbol defined
|
||||
in an IR dummy BFD takes on a new value from a real BFD.
|
||||
Weak symbols are not normally overridden by a new weak
|
||||
definition, and strong symbols will normally cause multiple
|
||||
definition errors. Avoid this by making the symbol appear
|
||||
to be undefined. */
|
||||
else if (((h->type == bfd_link_hash_defweak
|
||||
/* Otherwise, it must be a new def. */
|
||||
else
|
||||
{
|
||||
/* A common symbol should be merged with other commons or
|
||||
defs with the same name. In particular, a common ought
|
||||
to be overridden by a def in a -flto object. In that
|
||||
sense a common is also a ref. */
|
||||
if (bfd_is_com_section (section))
|
||||
h->non_ir_ref = TRUE;
|
||||
|
||||
/* Ensure any symbol defined in an IR dummy BFD takes on a
|
||||
new value from a real BFD. Weak symbols are not normally
|
||||
overridden by a new weak definition, and strong symbols
|
||||
will normally cause multiple definition errors. Avoid
|
||||
this by making the symbol appear to be undefined. */
|
||||
if (((h->type == bfd_link_hash_defweak
|
||||
|| h->type == bfd_link_hash_defined)
|
||||
&& is_ir_dummy_bfd (sym_bfd = h->u.def.section->owner))
|
||||
|| (h->type == bfd_link_hash_common
|
||||
|
@ -1341,6 +1350,7 @@ plugin_notice (struct bfd_link_info *info,
|
|||
h->u.undef.abfd = sym_bfd;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Continue with cref/nocrossref/trace-sym processing. */
|
||||
if (orig_h == NULL
|
||||
|
|
|
@ -183,6 +183,12 @@ set lto_link_tests [list \
|
|||
[list "PR ld/19317 (1)" \
|
||||
"$plug_opt" "-flto $lto_no_fat" \
|
||||
{pr19317.c} {} "libpr19317.a"] \
|
||||
[list "Build pr20276a.o" \
|
||||
"" "-fno-lto" \
|
||||
{pr20276a.c}] \
|
||||
[list "Build pr20276b.o" \
|
||||
"$plug_opt" "-flto $lto_no_fat" \
|
||||
{pr20276b.c}] \
|
||||
]
|
||||
|
||||
if { [at_least_gcc_version 4 7] } {
|
||||
|
@ -332,6 +338,9 @@ set lto_run_tests [list \
|
|||
[list "PR ld/19317 (3)" \
|
||||
"-O2 -flto tmpdir/pr19317-r.o" "" \
|
||||
{dummy.c} "pr19317.exe" "pr19317.out" "-flto -O2" "c"] \
|
||||
[list "Run pr20276" \
|
||||
"-O2 -flto tmpdir/pr20276a.o tmpdir/pr20276b.o" "" \
|
||||
{dummy.c} "pr20276" "pass.out" "-flto -O2" "c"] \
|
||||
]
|
||||
|
||||
if { [at_least_gcc_version 4 7] } {
|
||||
|
|
1
ld/testsuite/ld-plugin/pass.out
Normal file
1
ld/testsuite/ld-plugin/pass.out
Normal file
|
@ -0,0 +1 @@
|
|||
PASS
|
12
ld/testsuite/ld-plugin/pr20276a.c
Normal file
12
ld/testsuite/ld-plugin/pr20276a.c
Normal file
|
@ -0,0 +1,12 @@
|
|||
#include <stdio.h>
|
||||
|
||||
int global_var;
|
||||
extern void abort ();
|
||||
|
||||
int main(void)
|
||||
{
|
||||
if (global_var != 20)
|
||||
abort ();
|
||||
printf ("PASS\n");
|
||||
return 0;
|
||||
}
|
1
ld/testsuite/ld-plugin/pr20276b.c
Normal file
1
ld/testsuite/ld-plugin/pr20276b.c
Normal file
|
@ -0,0 +1 @@
|
|||
int global_var = 20;
|
Loading…
Reference in a new issue