From 3883be3eae9741f7d99862ea0be1657f6dc3e92a Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 14 Aug 2017 11:48:59 -0400 Subject: [PATCH] Absorb -D_USE_32BIT_TIME_T switch from Perl, if relevant. Commit 3c163a7fc's original choice to ignore all #define symbols whose names begin with underscore turns out to be too simplistic. On Windows, some Perl installations are built with -D_USE_32BIT_TIME_T, and we must absorb that or we get the wrong result for sizeof(PerlInterpreter). This effectively re-reverts commit ef58b87df, which injected that symbol in a hacky way, making it apply to all of Postgres not just PL/Perl. More significantly, it did so on *all* 32-bit Windows builds, even when the Perl build to be used did not select this option; so that it fails to work properly with some newer Perl builds. By making this change, we would be introducing an ABI break in 32-bit Windows builds; but fortunately we have not used type time_t in any exported Postgres APIs in a long time. So it should be OK, both for PL/Perl itself and for third-party extensions, if an extension library is built with a different _USE_32BIT_TIME_T setting than the core code. Patch by me, based on research by Ashutosh Sharma and Robert Haas. Back-patch to all supported branches, as commit 3c163a7fc was. Discussion: https://postgr.es/m/CANFyU97OVQ3+Mzfmt3MhuUm5NwPU=-FtbNH5Eb7nZL9ua8=rcA@mail.gmail.com --- config/perl.m4 | 6 ++++-- configure | 2 +- src/tools/msvc/MSBuildProject.pm | 9 ++------- src/tools/msvc/Mkvcbuild.pm | 5 +++-- src/tools/msvc/VCBuildProject.pm | 10 ++-------- 5 files changed, 12 insertions(+), 20 deletions(-) diff --git a/config/perl.m4 b/config/perl.m4 index 9706c4de6a..fbb13ed1c0 100644 --- a/config/perl.m4 +++ b/config/perl.m4 @@ -59,7 +59,9 @@ AC_DEFUN([PGAC_CHECK_PERL_CONFIGS], # to a different libc ABI than core Postgres uses. The available information # says that all the symbols that affect Perl's own ABI begin with letters, # so it should be sufficient to adopt -D switches for symbols not beginning -# with underscore. +# with underscore. An exception is that we need to let through +# -D_USE_32BIT_TIME_T if it's present. (We probably could restrict that to +# only get through on Windows, but for the moment we let it through always.) # For debugging purposes, let's have the configure output report the raw # ccflags value as well as the set of flags we chose to adopt. AC_DEFUN([PGAC_CHECK_PERL_EMBED_CCFLAGS], @@ -68,7 +70,7 @@ AC_MSG_CHECKING([for CFLAGS recommended by Perl]) perl_ccflags=`$PERL -MConfig -e ['print $Config{ccflags}']` AC_MSG_RESULT([$perl_ccflags]) AC_MSG_CHECKING([for CFLAGS to compile embedded Perl]) -perl_embed_ccflags=`$PERL -MConfig -e ['foreach $f (split(" ",$Config{ccflags})) {print $f, " " if ($f =~ /^-D[^_]/)}']` +perl_embed_ccflags=`$PERL -MConfig -e ['foreach $f (split(" ",$Config{ccflags})) {print $f, " " if ($f =~ /^-D[^_]/ || $f =~ /^-D_USE_32BIT_TIME_T/)}']` AC_SUBST(perl_embed_ccflags)dnl AC_MSG_RESULT([$perl_embed_ccflags]) ])# PGAC_CHECK_PERL_EMBED_CCFLAGS diff --git a/configure b/configure index a9fb57b06c..3c9603751a 100755 --- a/configure +++ b/configure @@ -7519,7 +7519,7 @@ perl_ccflags=`$PERL -MConfig -e 'print $Config{ccflags}'` $as_echo "$perl_ccflags" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLAGS to compile embedded Perl" >&5 $as_echo_n "checking for CFLAGS to compile embedded Perl... " >&6; } -perl_embed_ccflags=`$PERL -MConfig -e 'foreach $f (split(" ",$Config{ccflags})) {print $f, " " if ($f =~ /^-D[^_]/)}'` +perl_embed_ccflags=`$PERL -MConfig -e 'foreach $f (split(" ",$Config{ccflags})) {print $f, " " if ($f =~ /^-D[^_]/ || $f =~ /^-D_USE_32BIT_TIME_T/)}'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $perl_embed_ccflags" >&5 $as_echo "$perl_embed_ccflags" >&6; } diff --git a/src/tools/msvc/MSBuildProject.pm b/src/tools/msvc/MSBuildProject.pm index d7638b458e..27329f9e36 100644 --- a/src/tools/msvc/MSBuildProject.pm +++ b/src/tools/msvc/MSBuildProject.pm @@ -63,21 +63,16 @@ EOF EOF - # We have to use this flag on 32 bit targets because the 32bit perls - # are built with it and sometimes crash if we don't. - my $use_32bit_time_t = - $self->{platform} eq 'Win32' ? '_USE_32BIT_TIME_T;' : ''; - $self->WriteItemDefinitionGroup( $f, 'Debug', - { defs => "_DEBUG;DEBUG=1;$use_32bit_time_t", + { defs => "_DEBUG;DEBUG=1", opt => 'Disabled', strpool => 'false', runtime => 'MultiThreadedDebugDLL' }); $self->WriteItemDefinitionGroup( $f, 'Release', - { defs => "$use_32bit_time_t", + { defs => "", opt => 'Full', strpool => 'true', runtime => 'MultiThreadedDLL' }); diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm index f3bd30540a..6988eea1c8 100644 --- a/src/tools/msvc/Mkvcbuild.pm +++ b/src/tools/msvc/Mkvcbuild.pm @@ -521,14 +521,15 @@ sub mkvcbuild my @perl_embed_ccflags; foreach my $f (split(" ",$Config{ccflags})) { - if ($f =~ /^-D[^_]/) + if ($f =~ /^-D[^_]/ || + $f =~ /^-D_USE_32BIT_TIME_T/) { $f =~ s/\-D//; push(@perl_embed_ccflags, $f); } } - # XXX this probably is redundant now? + # Also, a hack to prevent duplicate definitions of uid_t/gid_t push(@perl_embed_ccflags, 'PLPERL_HAVE_UID_GID'); foreach my $f (@perl_embed_ccflags) diff --git a/src/tools/msvc/VCBuildProject.pm b/src/tools/msvc/VCBuildProject.pm index a8d75d88f3..669ba1730b 100644 --- a/src/tools/msvc/VCBuildProject.pm +++ b/src/tools/msvc/VCBuildProject.pm @@ -33,15 +33,9 @@ sub WriteHeader EOF - # We have to use this flag on 32 bit targets because the 32bit perls - # are built with it and sometimes crash if we don't. - my $use_32bit_time_t = - $self->{platform} eq 'Win32' ? '_USE_32BIT_TIME_T;' : ''; - - $self->WriteConfiguration( $f, 'Debug', - { defs => "_DEBUG;DEBUG=1;$use_32bit_time_t", + { defs => "_DEBUG;DEBUG=1", wholeopt => 0, opt => 0, strpool => 'false', @@ -49,7 +43,7 @@ EOF $self->WriteConfiguration( $f, 'Release', - { defs => "$use_32bit_time_t", + { defs => "", wholeopt => 0, opt => 3, strpool => 'true',