http://sourceware.org/bugzilla/show_bug.cgi?id=15469
Bug #: 15469
Summary: GNU LD incorrectly binds weakref to a random symbol
when weakref target is taken away by linker plugin
Product: binutils
Version: unspecified
Status: NEW
Severity: normal
Priority: P2
Component: ld
AssignedTo: [email protected]
ReportedBy: [email protected]
Classification: Unclassified
GCC revision r198926 is needed to reproduce this bug.
evans:/abuild/jh/trunk-3/build-inst11-check/gcc/:[0]# cat a.c
/* { dg-lto-do run } */
int first = 0;
void abort (void);
int second = 0;
void callmealias (void)
{
if (!first || !second)
abort ();
}
void callmefirst (void)
{
if (first)
abort();
first = 1;
}
void callmesecond (void)
{
if (!first)
abort();
if (second)
abort();
second = 1;
}
main()
{
c();
b();
return 0;
}
evans:/abuild/jh/trunk-3/build-inst11-check/gcc/:[0]# cat b.c
extern void callmesecond();
static void callmealias() __attribute__((weakref ("callmesecond")));
b()
{
callmealias();
}
evans:/abuild/jh/trunk-3/build-inst11-check/gcc/:[0]# cat c.c
extern void callmefirst();
static void callmealias() __attribute__((weakref ("callmefirst")));
c()
{
callmealias();
}
evans:/abuild/jh/trunk-3/build-inst11-check/gcc/:[0]# ./xgcc -B ./ -O2 -flto
-flto-partition=none -fuse-linker-plugin -fno-fat-lto-objects ?.c -g
-fdump-ipa-all
leads to working segfaulting binary with gold and infinite loop with GNU LD.
There is bug in GCC that optimize away the targets of weakrefs (callmefirst and
callmesecond) but it keeps the weakrefs. Gold correctly makes the weakref
target to be NULL, while GNU LD binds it to other function causing the infinite
loop.
I believe GNU LD ought to be fixed.
--
Configure bugmail: http://sourceware.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
_______________________________________________
bug-binutils mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/bug-binutils