Schrift
[thread]6001[/thread]

Perl Bytecode: Wie erzeuge ich Bytecode richtig?



<< >> 2 Einträge, 1 Seite
Gast Gast
 2004-01-06 09:33
#78313 #78313
Hallo,

ich habe ein kleines Problem...

ich habe ein Messscript für HTTP geschrieben (unten ist der Anfang des Scripts), dieses Script muß nun aber auf allen Systemen laufen (Solaris 2.6-2.8, SuSE/Redhat).
Na kein Problem, denkt sich der Orthi, und macht das ganze in Perl.

Nun ist es aber so das ich auch verschiedene Perl-Versionen habe, die ich nicht verändern kann/darf. Ebenso sind bei einigen Systemen keine Libs drauf.

Kein Problem denkt sich der Orthi und schiebt die Libs von Perl 5.8 (SuSE-Linux) mit in das Paket, und testet es auf einem Solaris-System 2.6. Geht natürlich nicht.

Also denk ich mir okay, compilierst es... ach geht ja nich, verschiedene Prozessortypen, aber da geht ja noch der Bytecode.

Gemacht getan, Compilieren geht ohne Fehlermeldung. Habe dann mal kurz in die Ausgabedatei von perlcc "a.out" reingeschaut und hier die ersten Zeilen angefügt:

#!/usr/bin/perl
use ByteLoader 0.04;
PLBCi586-linux0.040x1234


"#$%&'()*+,-.



Wenn ich "a.out" mit der notwenigen Option ausführe bekomme ich folgende Fehlermeldungen:

Script-GUI:/opt/nomanager/scripts # ./a.out ../conf/http.conf
Attempt to free unreferenced scalar at ./a.out line 2.
Attempt to free unreferenced scalar at ./a.out line 2.
Can't call method "push_header" on an undefined value at /usr/lib/perl5/site_perl/5.6.1/HTTP/Headers.pm line 353.
Segmentation fault


Und nochmal der Anfang vom Script:

Script-GUI:/opt/nomanager/scripts # more messung_http.pl
#!/usr/local/bin/perl -I/opt/nomanager/perl-libs

#
# Ausführungsstring: perl -I/opt/nomanager/perl-libs httptest.pl <CONF>
#

#if ( $ENV{performancehttp} eq "checked" ) { exit 0; };
use Time::HiRes qw (gettimeofday);
use LWP;
use MIME::Base64;
use IO::Socket::INET;



Was mache ich Falsch?
Das Script hat ca. 15000 Byte, als Bytecode hat es über 1 MB, daher gehe ich davon aus das die Module mit in dem Bytecode enthalten sind (außer das Modul "Bytecode" natürlich), und daher nicht auf den anderen Systemen benötigt werden.
Ist diese Annahme richtig?[B]
ptk
 2004-01-06 16:57
#78314 #78314
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich bin mir da nicht so sicher. Es gibt keine Moeglichkeit, XS-Teile in Bytecode zu verpacken, und Teile von Time::HiRes und wahrscheinlich auch MIME::Base64 sind in XS implementiert. Dann gibt es generell das Problem, dass perl5.8.0 mehr als perl5.6.1 kann und wahrscheinlich auch einige Opcodes neu definiert. Es waere also besser, wenn du auf deinem Linux-Rechner parallel zum existierenden perl ein perl5.6.1 installierst. Und zu guter Letzt muss man sagen, dass die Compiler-Suite niemals gut gepflegt war und es nicht ueberraschen braucht, wenn Dinge nicht funktionieren.
<< >> 2 Einträge, 1 Seite



View all threads created 2004-01-06 09:33.