diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2017-06-01 13:32:56 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2017-06-01 13:32:56 -0400 |
commit | 68938ab8ea0edf877e6e2821cec9e70ef2befa92 (patch) | |
tree | cb8befe959a7d9a11a9a9e1d83baf196b721d36c | |
parent | 82f8c21e06b3d4370944ffd1ba2005f1c488183f (diff) | |
download | postgresql-68938ab8ea0edf877e6e2821cec9e70ef2befa92.tar.gz postgresql-68938ab8ea0edf877e6e2821cec9e70ef2befa92.zip |
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
-rw-r--r-- | doc/src/sgml/dfunc.sgml | 26 | ||||
-rw-r--r-- | src/makefiles/Makefile.linux | 7 | ||||
-rw-r--r-- | src/makefiles/Makefile.netbsd | 4 | ||||
-rw-r--r-- | src/makefiles/Makefile.openbsd | 4 |
4 files changed, 15 insertions, 26 deletions
diff --git a/doc/src/sgml/dfunc.sgml b/doc/src/sgml/dfunc.sgml index 5a368f6df04..ebc85bf54b4 100644 --- a/doc/src/sgml/dfunc.sgml +++ b/doc/src/sgml/dfunc.sgml @@ -63,10 +63,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 @@ -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> diff --git a/src/makefiles/Makefile.linux b/src/makefiles/Makefile.linux index 52bf0b1e2ba..f4f091caef5 100644 --- a/src/makefiles/Makefile.linux +++ b/src/makefiles/Makefile.linux @@ -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 diff --git a/src/makefiles/Makefile.netbsd b/src/makefiles/Makefile.netbsd index 31a52601aff..43841c15973 100644 --- a/src/makefiles/Makefile.netbsd +++ b/src/makefiles/Makefile.netbsd @@ -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 diff --git a/src/makefiles/Makefile.openbsd b/src/makefiles/Makefile.openbsd index 7bf54933090..d8fde49d5c8 100644 --- a/src/makefiles/Makefile.openbsd +++ b/src/makefiles/Makefile.openbsd @@ -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 |