]> granicus.if.org Git - postgresql/commitdiff
Always use -fPIC, not -fpic, when building shared libraries with gcc.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 1 Jun 2017 17:32:56 +0000 (13:32 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 1 Jun 2017 17:32:56 +0000 (13:32 -0400)
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

doc/src/sgml/dfunc.sgml
src/makefiles/Makefile.linux
src/makefiles/Makefile.netbsd
src/makefiles/Makefile.openbsd

index 5a368f6df04d27c287bf306f827527d1c07e1449..ebc85bf54b428f902e3da8ff3a33c39145b29f08 100644 (file)
     <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
@@ -84,14 +84,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>
@@ -112,13 +112,11 @@ ld -b -o foo.sl 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>
@@ -149,12 +147,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>
@@ -169,10 +167,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>
@@ -188,7 +186,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</>.
@@ -198,7 +196,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>
index 52bf0b1e2bacacb9a225309fe58b00a9c03e62f6..f4f091caef59362c6edbe797d6cc39e6e8a1e43c 100644 (file)
@@ -1,15 +1,14 @@
 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
+
 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
index 31a52601aff07cc0cd85e03c40dc4d4ee35603b7..43841c15973b0c0b594fc2333f2bbdea4bcd71ae 100644 (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
index 7bf549330905b5156bfd3f22ee0ce27bbb906a12..d8fde49d5c8d95ee73d4c507d12a50ac94bbb7c9 100644 (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