bug-binutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug ld/14851] New: broken relocations for weak symbols on mingw32


From: bonzini at gnu dot org
Subject: [Bug ld/14851] New: broken relocations for weak symbols on mingw32
Date: Fri, 16 Nov 2012 08:57:19 +0000

http://sourceware.org/bugzilla/show_bug.cgi?id=14851

             Bug #: 14851
           Summary: broken relocations for weak symbols on mingw32
           Product: binutils
           Version: unspecified
            Status: NEW
          Severity: normal
          Priority: P2
         Component: ld
        AssignedTo: address@hidden
        ReportedBy: address@hidden
    Classification: Unclassified


I'm assigning this to ld, but it's possible that gas is buggy, or both are.

Relocations are broken for both overridden and non-overridden symbols.

Minimal testcase:

g1.c:
int f() { return 82; }
int g() { return 83; }

g2.c:
#include <stdio.h>
static int weak_f() { printf("strong"); return 42; }
static int weak_g() { printf("strong"); return 43; }
typeof(weak_f) f __attribute__((__weak__, __alias__("weak_f")));
typeof(weak_g) g __attribute__((__weak__, __alias__("weak_g")));
int main() { printf("%d/%d\n", f(), g()); }


Output on ELF is:
- 42/43 for "gcc g2.c"
- 82/83 for "gcc g1.c g2.c"

Output on Windows is:
- 42/42 for "gcc g2.c"
- segfault for "gcc g1.c g2.c"

The relocation is completely broken, which causes the difference in the weak
case.  In addition, it assumes that symbols have the same size in the weak and
strong versions, which causes the crash in the strong case.

The person who reported the bug said that weakrefs did not work for him either,
but they seem to work in this particular case, replacing g2.c with this:

#include <stdio.h>
static int default_f() { return 42; }
static int default_g() { return 43; }
static typeof(default_f) weak_f __attribute__((__weakref__("f")));
static typeof(default_g) weak_g __attribute__((__weakref__("g")));
int main() { printf("%d/%d\n", (weak_f?:default_f)(), (weak_g?:default_g)()); }

and I see no reason why they shouldn't work...

-- 
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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]