"#pragma weak" symbol is 0 even when defined

Bug #1340250 reported by Paul Eggert
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
binutils (Ubuntu)
Invalid
Undecided
Unassigned
gcc-defaults (Ubuntu)
Invalid
Undecided
Unassigned
libidn (Ubuntu)
Fix Released
Undecided
Unassigned
libunistring (Ubuntu)
Fix Released
Undecided
Unassigned

Bug Description

This compiler bug is making the gnulib tests dump core; see:

http://lists.gnu.org/archive/html/bug-gnulib/2014-07/msg00039.html

Compile and run the following program t.c with the shell commands "gcc u.c -lm; ./a.out; echo $?"

#include <math.h>
#pragma weak tgamma

int
main (void)
{
  if (!tgamma)
    return 2;
  if (tgamma (1) == 1)
    return 0;
  return 1;
}

The program will exit with status 2. It should exit with status 0, because the math library does have a tgamma function and the function pointer should be non-null.

I observe this problem with Ubuntu 14.04 x86-64 (GCC Ubuntu 4.8.2-19ubuntu1), but not on Fedora 20 or on RHEL 6.5.

ProblemType: Bug
DistroRelease: Ubuntu 14.04
Package: gcc 4:4.8.2-1ubuntu6
ProcVersionSignature: Ubuntu 3.13.0-30.55-generic 3.13.11.2
Uname: Linux 3.13.0-30-generic x86_64
ApportVersion: 2.14.1-0ubuntu3.2
Architecture: amd64
CurrentDesktop: Unity
Date: Thu Jul 10 07:39:11 2014
InstallationDate: Installed on 2012-12-21 (566 days ago)
InstallationMedia: Ubuntu 12.10 "Quantal Quetzal" - Release amd64 (20121017.5)
SourcePackage: gcc-defaults
UpgradeStatus: Upgraded to trusty on 2014-04-18 (83 days ago)

Revision history for this message
Paul Eggert (eggert-cs) wrote :
Revision history for this message
Gianfranco Costamagna (costamagnagianfranco) wrote :

this seems to be the reason for libunistring and libidn failures

Changed in gcc-defaults (Ubuntu):
status: New → Confirmed
importance: Undecided → High
Revision history for this message
Gianfranco Costamagna (costamagnagianfranco) wrote :
Revision history for this message
Matthias Klose (doko) wrote :

the Ubuntu gcc (as well as the OpenSuse gcc) sets ---as-needed as the default, so your configure test fails, making wrong assumptions. So better build your configure test with -Wl,--no-as-needed.

Changed in gcc-defaults (Ubuntu):
importance: High → Undecided
status: Confirmed → Invalid
Changed in binutils (Ubuntu):
status: New → Invalid
Revision history for this message
Gianfranco Costamagna (costamagnagianfranco) wrote :

Wl,--no-as-needed works, while adding a manual "-lpthread" doesn't, because the library doesn't get linked to the program. Reason is probably that weak symbols are not added by the linker

Revision history for this message
Gianfranco Costamagna (costamagnagianfranco) wrote :

gcc u.c -Wl,--no-as-needed -lm; ./a.out; echo $?
0

Revision history for this message
Gianfranco Costamagna (costamagnagianfranco) wrote :
Changed in libidn (Ubuntu):
status: New → Fix Released
Changed in libunistring (Ubuntu):
status: New → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.