Rob
Rob

Reputation: 791

How do I build 32-bit XS modules for a 32-bit custom Perl on a 64-bit CentOS system?

I have a 64-bit CentOS 6 system running a custom-built version of Perl 5.12.5, that is build for 32-bits. (Alas, this is because we are using the same RPMs for 32-bit and 64-bit systems.)

When I build XS modules (e.g. JSON::XS) on the server, it fails because it's building 64-bit libraries. I get an error like

Can't load '.cpanm/work/1370279501.28897/JSON-XS-2.33/blib/arch
/auto/JSON/XS/XS.so' for module JSON::XS: .cpanm/work/137027950
1.28897/JSON-XS-2.33/blib/arch/auto/JSON/XS/XS.so: wrong ELF class: ELFCLASS64
at /opt/perl/lib/5.12.5/i686-linux/DynaLoader.pm line 200.

I've tried setting the CFLAGS variable to "-m32-bit" but it does not work.

What do I need to do to compile XS modules properly? Ideally, I'd like something that works with cpanminus but can use cpan or cpanplus if need be.

Upvotes: 6

Views: 1184

Answers (2)

Wayne Walker
Wayne Walker

Reputation: 2466

Turns out this answer works for me:

wwalker $ PERL_MM_OPT='CCFLAGS="-m32 -march=i686" LDDLFLAGS="-m32 -march=i686"' /opt/depot/perl-5.8.5/bin/perl -MCPAN -e shell

cpan shell -- CPAN exploration and modules installation (v1.7601)
ReadLine support enabled

cpan> install DBIx::Class

Upvotes: 1

Leon Timmermans
Leon Timmermans

Reputation: 30225

Perl's build system (in particular, ExtUtils::MakeMaker and ExtUtils::CBuilder) assumes the compilation platform that was used to build that perl is also usable runtime platform. Evidently that's not the case here.

The obvious solution is to compile perl with options that would result in the same executables on both toolchains. This is rather tricky.

Upvotes: 2

Related Questions