Now I understand I missed to tell you this fundamental detail before, sorry.
> perlcc seems to be dropping BEGIN blocks entirely, that's the problem. No, that's correct. Explanation: if I have a module Foo ---- package Foo; $x = 1; print "AAA"; sub a { $x } 1; ---- and a main program foo.pl ---- BEGIN { # think use Foo;, expanded for clarity require Foo; } print Foo::a(); ---- perl -MO=C foo.pl calls B::C::compile _after_ it ran the BEGIN blocks; this means that the optree in Foo that initializes $x, and does "print AAA" has already been freed. So, even if B::C could save BEGIN blocks, this is not a good idea, for quite a lot of reasons. > # foo.plx > BEGIN { > print "foo\n"; > } > print "bar\n"; > > $ bleadperl foo.plx > foo > bar > $ perlcc foo.plx > $ ./a.out > bar > > The result from the compiled program should be the same as the > original. For some reason the BEGIN block is getting dropped when the > program is compiled. That's a bug. It is not a bug that the BEGIN blocks are dropped. It is a B::C bug induced by the perl design that it can't deal gracefully with code in BEGIN blocks that print()s, or does other things to the "environment" ( OS, screen, disks, %ENV ), or that initializes data structures outside the scope of perl ( this includes interpreter-local data using MY_CXT ( Opcode.pm ), or creating a SV holding a pointer to an external data structure, or dup()s filehandles ( Test::Builder ) [1] ). The only solution to these problems is something like B::Script ( mentioned in april-june on p5p ). Regards Mattia [1] try searching perlcc.PL for Test::Builder...