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