hampft!

php4 und informix auf debian verheiraten

Eigentlich ist es ja ganz einfach, für das Binary-Paket unter Debian ein zusätzliches Modul zu compilieren:

apt-get install php4-dev
apt-get source php4
cd php-4.3.10/ext/informix
phpize
./configure
make
Vorausgesetzt, dass man bereits ESQL/C installiert hat und die Environment-Variable $INFORMIXDIR korrekt gesetzt hat, war's das: module/informix.so ist das fertige Modul, das man in das extension_dir (siehe php.ini) kopiert, und in php.ini mit
extension=informix.so
einschaltet. Nach einem apachectl reload wird von phpinfo() nun auch informix mit einigen Versionsinformationen angezeigt. Prima.

Jetzt kann man daran gehen, mit ifx_connect() eine Datenbank versuchshalber zu öffnen und wird mit einer Überraschung "belohnt": der Klick auf die Testseite zwingt den jeweiligen Apachen mit einem Segfault ins Nirvana. Im error-log des abgestürzten Indianers findet man die Meldung

/usr/sbin/apache: relocation error: /opt/informix/lib/esql/libifsql.so: undefined symbol: ifx_checkAPI
Weia, bis gerade eben ging es doch noch gut, was ist denn jetzt falsch?

Als mal den nm rauskruschteln:

nm /usr/lib/php4/20020429/informix.so | grep ifx_checkAPI
gibt genau keine Zeile Ausgabe. Da fehlt wohl was.

Also, das wichtigste Werkzeug des Admins rausholen: Eine Runde groupsgoogeln. Ergebnis: Irgendwie muss an eine ESQL/C Anwendung die Datei $INFORMIXDIR/lib/esql/checkapi.o rangelinkt werden und der kurze Check mit nm zeigt auch

> nm /opt/informix/lib/esql/checkapi.o
00000000 t gcc2_compiled.
         U _GLOBAL_OFFSET_TABLE_
00000000 T ifx_checkAPI

Tja, da isses ja, warum verflucht noch mal ist das nicht an das informix.so rangepappt? Also nochmal ganz zurück zum ersten Kasten und die Ausgabe von make auch mal lesen. Compilermeldungen müssen ja auch für irgendwas gut sein, oder?

> make
/bin/sh /root/dev/php4-4.3.10/ext/informix/libtool --mode=link 
gcc /opt/informix/lib/esql/checkapi.o -o libphpifx.a
mkdir .libs
ar cru libphpifx.a 
ranlib libphpifx.a
[...]
Gleich am Anfang also wird irgendwas mit checkapi.o gemacht, was um Gottes willen ist das denn? Kurzer Blick in die Manpage: ar benutzt man, um Archive zu bauen. Ein weiterer Blick sagt auch, dass ar bei diesem Aufruf nicht riechen kann, was es in das Archiv libphpifx.a reinpacken soll, im Aufruf steht's nicht. Ein Blick ins Verzeichnis: libphpifx.a ist 8 Byte groß. Das kann nix taugen.

make ist ja nett, also erst mal den ar anwerfen, wie er (hoffentlich) gedacht war:

ar cru libphpifx.a /opt/informix/lib/esql/checkapi.o
und gleich den make hinterher, das neue module/informix.so ist jetzt tatsächlich so ca. 500 Byte größer als der letzte Versuch. Ich kanns noch nicht glauben, also zur Sicherheit nm fragen:
nm modules/informix.so | grep ifx_checkAPI
0000d4b0 T ifx_checkAPI
Yeeeeeeeeeeeha!. Schnell ins extension_dir damit und testen. Erstaunlich, jetzt rollt auch informix.

Die Pflicht für den Admin ist getan, jetzt noch die Kür: einen Error Report schreiben!


hampft! ->