Always use -fPIC, not -fpic, when building shared libraries with gcc.

On some platforms, -fpic fails for sufficiently large shared libraries.
We've mostly not hit that boundary yet, but there are some extensions
such as Citus and pglogical where it's becoming a problem.  A bit of
research suggests that the penalty for -fPIC is small, in the
single-digit-percentage range --- and there's none at all on popular
platforms such as x86_64.  So let's just default to -fPIC everywhere
and provide one less thing for extension developers to worry about.

Per complaint from Christoph Berg.  Back-patch to all supported branches.
(I did not bother to touch the recently-removed Makefiles for sco and
unixware in the back branches, though.  We'd have no way to test that
it doesn't break anything on those platforms.)

Discussion: https://postgr.es/m/20170529155850.qojdfrwkkqnjb3ap@msg.df7cb.de
This commit is contained in:
Tom Lane 2017-06-01 13:32:56 -04:00
parent 364100e0bf
commit a378b9bc28
4 changed files with 15 additions and 26 deletions

View File

@ -61,10 +61,10 @@
<listitem>
<para>
The compiler flag to create <acronym>PIC</acronym> is
<option>-fpic</option>. To create shared libraries the compiler
<option>-fPIC</option>. To create shared libraries the compiler
flag is <option>-shared</option>.
<programlisting>
gcc -fpic -c foo.c
gcc -fPIC -c foo.c
gcc -shared -o foo.so foo.o
</programlisting>
This is applicable as of version 3.0 of
@ -80,14 +80,14 @@ gcc -shared -o foo.so foo.o
<para>
The compiler flag of the system compiler to create
<acronym>PIC</acronym> is <option>+z</option>. When using
<application>GCC</application> it's <option>-fpic</option>. The
<application>GCC</application> it's <option>-fPIC</option>. The
linker flag for shared libraries is <option>-b</option>. So:
<programlisting>
cc +z -c foo.c
</programlisting>
or:
<programlisting>
gcc -fpic -c foo.c
gcc -fPIC -c foo.c
</programlisting>
and then:
<programlisting>
@ -122,13 +122,11 @@ ld -shared -o foo.so foo.o
<listitem>
<para>
The compiler flag to create <acronym>PIC</acronym> is
<option>-fpic</option>. On some platforms in some situations
<option>-fPIC</option> must be used if <option>-fpic</option>
does not work. Refer to the GCC manual for more information.
<option>-fPIC</option>.
The compiler flag to create a shared library is
<option>-shared</option>. A complete example looks like this:
<programlisting>
cc -fpic -c foo.c
cc -fPIC -c foo.c
cc -shared -o foo.so foo.o
</programlisting>
</para>
@ -155,12 +153,12 @@ cc -bundle -flat_namespace -undefined suppress -o foo.so foo.o
<listitem>
<para>
The compiler flag to create <acronym>PIC</acronym> is
<option>-fpic</option>. For <acronym>ELF</acronym> systems, the
<option>-fPIC</option>. For <acronym>ELF</acronym> systems, the
compiler with the flag <option>-shared</option> is used to link
shared libraries. On the older non-ELF systems, <literal>ld
-Bshareable</literal> is used.
<programlisting>
gcc -fpic -c foo.c
gcc -fPIC -c foo.c
gcc -shared -o foo.so foo.o
</programlisting>
</para>
@ -173,10 +171,10 @@ gcc -shared -o foo.so foo.o
<listitem>
<para>
The compiler flag to create <acronym>PIC</acronym> is
<option>-fpic</option>. <literal>ld -Bshareable</literal> is
<option>-fPIC</option>. <literal>ld -Bshareable</literal> is
used to link shared libraries.
<programlisting>
gcc -fpic -c foo.c
gcc -fPIC -c foo.c
ld -Bshareable -o foo.so foo.o
</programlisting>
</para>
@ -190,7 +188,7 @@ ld -Bshareable -o foo.so foo.o
<para>
The compiler flag to create <acronym>PIC</acronym> is
<option>-KPIC</option> with the Sun compiler and
<option>-fpic</option> with <application>GCC</>. To
<option>-fPIC</option> with <application>GCC</>. To
link shared libraries, the compiler option is
<option>-G</option> with either compiler or alternatively
<option>-shared</option> with <application>GCC</>.
@ -200,7 +198,7 @@ cc -G -o foo.so foo.o
</programlisting>
or
<programlisting>
gcc -fpic -c foo.c
gcc -fPIC -c foo.c
gcc -G -o foo.so foo.o
</programlisting>
</para>

View File

@ -1,16 +1,15 @@
AROPT = crs
export_dynamic = -Wl,-E
# Use --enable-new-dtags to generate DT_RUNPATH instead of DT_RPATH.
# This allows LD_LIBRARY_PATH to still work when needed.
rpath = -Wl,-rpath,'$(rpathdir)',--enable-new-dtags
allow_nonpic_in_shlib = yes
DLSUFFIX = .so
ifeq "$(findstring sparc,$(host_cpu))" "sparc"
CFLAGS_SL = -fPIC
else
CFLAGS_SL = -fpic
endif
# Rule for building a shared library from a single .o file
%.so: %.o

View File

@ -9,11 +9,7 @@ endif
DLSUFFIX = .so
ifeq ($(findstring sparc,$(host_cpu)), sparc)
CFLAGS_SL = -fPIC -DPIC
else
CFLAGS_SL = -fpic -DPIC
endif
# Rule for building a shared library from a single .o file

View File

@ -7,11 +7,7 @@ endif
DLSUFFIX = .so
ifeq ($(findstring sparc,$(host_cpu)), sparc)
CFLAGS_SL = -fPIC -DPIC
else
CFLAGS_SL = -fpic -DPIC
endif
# Rule for building a shared library from a single .o file