Re: [HACKERS] pl/perl extension fails on Windows - Mailing list pgsql-hackers
From | Ashutosh Sharma |
---|---|
Subject | Re: [HACKERS] pl/perl extension fails on Windows |
Date | |
Msg-id | CAE9k0Pm9YcJqqkWXGvSQrkPGbH_f29VF7+=YzKNGOgnwnufa2Q@mail.gmail.com Whole thread Raw |
In response to | Re: [HACKERS] pl/perl extension fails on Windows (Robert Haas <robertmhaas@gmail.com>) |
Responses |
Re: [HACKERS] pl/perl extension fails on Windows
|
List | pgsql-hackers |
On Thu, Aug 10, 2017 at 1:55 AM, Robert Haas <robertmhaas@gmail.com> wrote: > On Tue, Aug 8, 2017 at 12:15 PM, Sandeep Thakkar > <sandeep.thakkar@enterprisedb.com> wrote: >> I copied and pasted that portion of the build log into file build.log >> (attached) for Windows 32bit and Windows 64bit. > > Can you also share the output of 'perl -V' on each system? > > Comparing the 32-bit log and the 64-bit log, I see the following differences: > > 32-bit has extra options /IC:\pgBuild32\uuid\include /Oy- /analyze- /D > _USE_32BIT_TIME_T > 64-bit has extra options /D WIN64 /D CONSERVATIVE /D USE_SITECUSTOMIZE > Both builds have several copies of /IC:\pgBuild32\include or > /IC:\pgBuild64\include, but the 64-bit build has an extra one > > (I wrote that command on Linux, might need different quoting to work > on Windows.) > > I'm suspicious about _USE_32BIT_TIME_T. The contents of a > PerlInterpreter are defined in Perl's intrpvar.h, and one of those > lines is: > > PERLVAR(I, basetime, Time_t) /* $^T */ > > Now, Time_t is defined as time_t elsewhere in the Perl headers, so if > the plperl build and the Perl interpreter build had different ideas > about whether that flag was set, the interpreter sizes would be > different. Unfortunately for this theory, if I'm interpreting the > screenshot you posted correctly, the sizes are different by exactly 16 > bytes, and I can't see how a difference in the size of time_t could > account for more than 8 bytes (4 bytes of actual size change + 4 bytes > of padding). > Okay. I too had a look into this issue and my findings are as follows, The size of PerlInterpreter structure on plperl and perl module are not the same. The size of PerlInterpreter on plperl is 2744 bytes whereas on perl it is 2760 bytes i.e. there is the difference of 16 bytes and therefore the handshaking key generated in the two modules are not the same resulting in a binary mismatch error. To analyse this problem, I generated the preprocessed output of header file 'perl.h' on plperl and perl modules and then filtered the contents of "struct interpreter" from the preprocessed output files and compared them using some diff tool. The diff report is attached with this email. As per the diff report, incase of plperl module, the structure Stat_t is getting mapped to "_stat32i64" whereas incase of perl module, the same structure is getting mapped to "_stat64" and this is happening for couple of variables (statbuf & statcache) in intrpvar.h file. However, if the preprocessor option '_USE_32BIT_TIME_T' is explicitly passed to the VC compiler when compiling perl source, there is no diff observed as in both the cases, 'Stat_t ' is gets mapped to "stat32i64". So, now the question is, why ''_USE_32BIT_TIME_T' flag is not implicitly defined when compiling perl source on 32 bit platform but for postgresql/plperl build it is being defined implicitly on 32bit platform. I just got few hints from the Makefile, in perl source code, where is has been mentioned that the modern Visual C compiler (VC++ 8.0 onwards) changes time_t from 32-bit to 64-bit, even in 32-bit mode hence, ''_USE_32BIT_TIME_T' is net being added to $Config{ccflags}. Here, is what i could see in GNUMakefile/Makefile.mk in perl source code. # In VS 2005 (VC++ 8.0) Microsoft changes time_t from 32-bit to # 64-bit, even in 32-bit mode. It also provides the _USE_32BIT_TIME_T # preprocessor option to revert back to the old functionality for # backward compatibility. We define this symbol here for older 32-bit # compilers only (which aren't using it at all) for the sole purpose # of getting it into $Config{ccflags}. That way if someone builds # Perl itself with e.g. VC6 but later installs an XS module using VC8 # the time_t types will still be compatible. ifeq ($(WIN64),undef) ifeq ((PREMSVC80),define) BUILDOPT += -D_USE_32BIT_TIME_T endif endif So, the question is should we allow the preprocessor option '_USE_32BIT_TIME_T' to be defined implicitly or not in postgresql provided we are using Visual C compiler version > 8.0. I think this should make plperl compatible with perl binaries. -- With Regards, Ashutosh Sharma EnterpriseDB:http://www.enterprisedb.com -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Attachment
pgsql-hackers by date: