Re: mod_perl2 and Perl 5.14 with uselargefiles on 32-bit architectures

Marco Walther <[email protected]>
Newsgroups gmane.comp.apache.mod-perl
Organization Oracle Corporation
Message-ID <[email protected]>
On 10/22/2011 11:08 AM, Niko Tyni wrote:
> On Wed, Sep 28, 2011 at 02:22:49PM -0700, Marco Walther wrote:
>> OK, I think I found one problem.  The following two defines don't
>> make it from the Perl make to the CCFLAGS for the mod_perl:-(
>> `-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64' (They are automatically
>> added by the Configure for perl and listed in the perl -V output
>> below).
>>
>> That causes the my_perl structure to be of different sizes/offsets
>> between perl and mod_perl. That works by accident with Perl 5.10.1
>> and finally breaks with 5.14.[12]
> We're running into this on Debian 32-bit architectures too
> (http://bugs.debian.org/636651 [cc'd]), and the issue is one of the
> blockers for our transition to Perl 5.14.
>
>> Unfortunately even trying to run
>> /opt/kenai/bin/perl Makefile.PL DEFINE='-D_LARGEFILE_SOURCE
>> -D_FILE_OFFSET_BITS=64'
>> is not enough:-( The defines still do not make it to the
>> src/modules/perl/Makefile:-( But after changing that Makefile by
>> hand and rebuilding, things seem to be working fine.
> These cpp flags are stripped by lib/Apache2/Build.pm, see
> has_large_files_conflict() and strip_lfs().
Yes.

> The mod_perl2 2.0.5 test suite works for me with Perl 5.14 if I hardwire
> has_large_files_conflict() to return 0 and apply r1125476 from 2.0.6-dev:
>   http://svn.apache.org/viewvc/perl/modperl/trunk/src/modules/perl/modperl_svptr_table.c?r1=932879&r2=1125476io
I did pretty much the same (the return 0 for apache version > 2.2.20) 
for 2.0.6-dev and it seems to work ok.

> The elaborate comments about large file issues in lib/Apache2/Build.pm
> around strip_lfs() seem to be partly outdated; selectively quoting:
>
> # on Unix systems where by default off_t is a "long", a 32-bit integer,
> # there are two different ways to get "large file" support, i.e. the
> # ability to manipulate files bigger than 2Gb:
> #
> # 1) you compile using -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64.
> [...]
> # 2) you compile using -D_LARGEFILE64_SOURCE
> [...]
> # The problem that mod_perl has to work around is when you take a
> # package built with approach (1), i.e. Perl, and any package which was
> # *not* built with (1), i.e. APR, and want to interface between
> # them. [1]
> [...]
> # Perl built with -Duselargefiles uses approach (1).
> #
> # APR HEAD uses (2) by default.
> [...]
> # [1]: In some cases, it may be OK to interface between packages which
> # use (1) and packages which use (2).  APR HEAD is currently not such a
> # case, since the size of apr_ino_t is still changing when
> # _FILE_OFFSET_BITS is defined.
>
> The last paragraph dates back to 2004, and the apr changelogs read:
>
>> Changes for APR 1.2.12
>>    *) Define apr_ino_t in such a way that it doesn't change definition
>>    based on the library consumer's -D'efines to the filesystem.
>>    [Lucian Adrian Grijincu<lucian.grijincu gmail.com>]
>> Changes for APR 1.4.3
>>    *) configure: Make definition of apr_ino_t independent of
>>       _FILE_OFFSET_BITS even on platforms where ino_t is 'unsigned int'.
>>       [Stefan Fritsch]
> To summarize, it looks like Apache2::Build::strip_lfs() breaks with Perl
> 5.14 with -Duselargefiles on 32-bit architectures, and is not necessary
> since at least apr 1.4.3, possibly earlier.
>
> I'd like input on whether we should expect further pitfalls if we
> build mod_perl2 with -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 on
> Debian, i.e. stop stripping those flags in Apache2::Build.
>
> Obviously, a more portable solution is needed for mod_perl 2.0.6.
> Perhaps an explicit probe for sizeof(apr_ino_t) with different
> _FILE_OFFSET_BITS definitions?

As I said above, I checked for the Apache version, but a check for APR 
version would probably be better.

I was running into some other LFS related problems where some CPAN 
modules did not use the CFLAGS from the Perl build but picked up the 
environment:-(

The symptoms were very strange:-( Bugzilla calls exit() all over the 
place and that's supposed to be overridden by mod_perl to do the right 
thing. But for me it looked like the real exit() was called instead.

This was caused by Params-Validate-1.00 picking up CFLAGS from the 
environment without the LFS from the Perl build:-( Other problematic 
modules for me were DateTime-0.70 (similar strange failures) and 
Convert-UUlib-1.4 (this was found while looking through my build logs?!)

Have fun,
-- Marco
> Cheers,
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.