amd64/127640: GCC will not build shared libraries with -fprofile-generate on amd64

Zan Lynx zlynx at acm.org
Fri Sep 26 15:37:29 UTC 2008


Kostik Belousov wrote:
> On Fri, Sep 26, 2008 at 10:01:43AM -0400, John Baldwin wrote:
>> On Thursday 25 September 2008 04:50:43 pm Jonathan Briggs wrote:
>>>> 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 -
>> What if you add -fPIC as the message suggests?
> 
> Note that libgcov needs to be recompiled with -fPIC.
> The R_X86_64_32 issue is systematic on amd64. When you build a shared
> object, better make sure that all .o are compiled with -fPIC.

I was using only pre-built binary packages from 7.0-RELEASE.

Rebuilding from source using ports would probably solve the problem but
I believe that the binaries should still be fixed, eventually.


More information about the freebsd-amd64 mailing list