CFLAGS+= -fPIC per default?

Peter Wemm peter at wemm.org
Sat Feb 21 12:23:50 PST 2004


On Saturday 21 February 2004 11:47 am, Hendrik Scholz wrote:

> Adding CFLAGS= -fPIC to /etc/make.conf may be a local solution but
> are there any drawbacks by adding something like
> .if ${ARCH} == "amd64"
> CFLAGS+= -fPIC
> .endif
>
> to ports/Mk/bsd.port.mk?

No.. please don't.  Although the AMD64 platform supports PIC addressing 
modes directly, it is still a penalty.  (Although thankfully, its 
nowhere near as expensive as it is on i386!)

For example, in libc when built in PIC mode:
#ifdef PIC
        movq    PIC_GOT(HIDENAME(curbrk)),%rdx
        movq    (%rdx),%rax
#else
        movq    HIDENAME(curbrk)(%rip),%rax
#endif

The problem is that we can't be sure that everything will be in +/- 31 
bit offsets of each other.  This means that PIC objects have to do 
indirect memory references that aren't required in no-pic mode.

I386 also loses a general purpose register (%ebx) which is why -fpic is 
more expensive there.  But even though we don't lose a register, its 
still a cost because of the extra global-offset-table memory 
references.

Footnote: you just made me wonder about some of these ifdefs..  We 
shouldn't need them for intra-object references like this.  I'll have 
to go and look again.
-- 
Peter Wemm - peter at wemm.org; peter at FreeBSD.org; peter at yahoo-inc.com
"All of this is for nothing if we don't go to the stars" - JMS/B5


More information about the freebsd-amd64 mailing list