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