amd64/127640: GCC will not build shared libraries with
-fprofile-generate on amd64
Jonathan Briggs
zlynx at acm.org
Thu Sep 25 21:00:04 UTC 2008
>Number: 127640
>Category: amd64
>Synopsis: GCC will not build shared libraries with -fprofile-generate on amd64
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-amd64
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Thu Sep 25 21:00:03 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator: Jonathan Briggs
>Release: 7.0-RELEASE
>Organization:
>Environment:
FreeBSD freebsd64 7.0-RELEASE FreeBSD 7.0-RELEASE #0: Sun Feb 24 10:35:36 UTC 2008 root at driscoll.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64
>Description:
I was porting a specialized database library to FreeBSD and the build failed with this error:
/usr/bin/ld: /usr/lib/libgcov.a(_gcov_merge_add.o): relocation R_X86_64_32 can not be used when making a shared object; recompile with -fPIC
/usr/lib/libgcov.a: could not read symbols: Bad value
The library uses -fprofile-generate, runs a test set, then rebuilds with -fprofile-use. It's worth a few ms per lookup.
Also, this builds very well on i386 FreeBSD 7.0 and on many varieties of Linux and their GCC builds (Debian ia64, Gentoo amd64, CentOS 5.2, Fedora 5, 8, 9).
I can work around the problem by just not doing a profile build.
>How-To-Repeat:
Put the following in a shell script:
#!/bin/sh
cat <<EOF |
#include <stdio.h>
int counter(int count)
{
int i;
for(i=0; i<count; i++) {
printf("loop %d\n", i);
}
return i;
}
EOF
gcc -O2 -shared -fprofile-generate -fPIC -o t1.so -x c -
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-amd64
mailing list