-Extensions(.so) für andere Linux-Version bauen
Andreas Korthaus
- php
Hallo!
Wenn ich mir PHP mir ./configure; make; make install baue, dann wird das doch vermutlich mit meinem standarmäßigen gcc-Compiler kompiliert, oder? Ich glaube dass mein Provider irgend eine 7.x Version von RedHat verwendet, ich aber RedHat 9, und wenn ich mich nicht irre verwendet RedHat 9 einen neuere gcc Version die nicht mit alten Verionen kompatibel ist, oder? Aber wenn ich mich nicht irre kann man mit dem neuen gcc auch für dessen alte Version kompatible Programme erstellen, oder? Aber ich habe ja nicht direkt mit gcc zu tun, das übernimmt doch glaube ich make. Kann ich make irgendwie dahingehend beeinflussen den gcc im "kompatibilitäts-Modus" zu verwenden? Also dass meine .so Dateien die ich unter RedHat 9 erstelle auch unter RedHat 7.x lauffähig sind? Oder ist das kein Problem, oder geht das ganz anders, oder überhaupt nicht? Oder bekommt man sogar irgendwo fertige .so-Dateien für PHP-Extensions?
Viele Grüße
Andreas
Hallo Andreas,
Wenn ich mir PHP mir ./configure; make; make install baue, dann wird das doch vermutlich mit meinem standarmäßigen gcc-Compiler kompiliert, oder?
Ja.
Ich glaube dass mein Provider irgend eine 7.x Version von RedHat verwendet, ich aber RedHat 9, und wenn ich mich nicht irre verwendet RedHat 9 einen neuere gcc Version die nicht mit alten Verionen kompatibel ist, oder?
Keine Ahnung. Theoretisch gesehen sollten alle gcc-Versionen zueinander kompatibel sein, wenn der Distributor es "richtig" macht:
christian@midnight:~/gcc-test$ gcc --version
2.95.4
christian@midnight:~/gcc-test$ gcc-3.2 --version
gcc-3.2 (GCC) 3.2.3 20030309 (Debian prerelease)
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
--------------------- test.c --------------------------
#include <stdio.h>
#include <string.h>
int print_test (char *s) {
printf ("%s\n", s);
return strlen (s);
}
-------------------------------------------------------
--------------------- test2.c -------------------------
#include <stdio.h>
int print_test (char *s);
int main (int argc, char **argv) {
int i = print_test ("Hallo Welt!");
printf ("%d\n", i);
return 0;
}
-------------------------------------------------------
christian@midnight:~/gcc-test$ gcc -Wall -c -o test.o test.c
christian@midnight:~/gcc-test$ ld -shared -o test.so test.o
christian@midnight:~/gcc-test$ gcc-3.2 -Wall test2.c test.so
christian@midnight:~/gcc-test$ ./a.out
Hallo Welt!
11
christian@midnight:~/gcc-test$ gcc-3.2 -Wall -c -o test.o test.c
christian@midnight:~/gcc-test$ ld -shared -o test.so test.o
christian@midnight:~/gcc-test$ gcc -Wall test2.c test.so
christian@midnight:~/gcc-test$ ./a.out
Hallo Welt!
11
Also bei mir gibt es keine Inkompabilitäten - allerdings verwende ich auch kein RedHat.
Das Problem, das Du vielmehr hast, sind unterschiedliche Bibliotheken, gegen die PHP bzw. Deine Extension gelinkt ist; außerdem können unterschiedliche Versionen von binutils (das Paket, bei dem der Linker und noch einige andere Tools dabei ist) Dir auch noch einen Streich spielen.
Was möglich wäre, wäre sogenanntes "Cross-Compiling" - ich könnte auf einem Linux-i386-Rechner theoretisch Linux-PowerPC-Programme herstellen - allerdings habe ich davon weniger als 0 Ahnung.
Also dass meine .so Dateien die ich unter RedHat 9 erstelle auch unter RedHat 7.x lauffähig sind?
Das Problem ist, wie schon geschrieben, dass Deine .so-Dateien ja selbst andere .so-Dateien brauchen. Auf Deinem System sind aber andere Versionen vorhanden als auf dem System Deines Hosters. Daher wirst Du den Webserverprozess - sofern PHP als Modul installiert ist - oder halt den CGI-Prozess ins Datennirvana befördern, wenn Du eine Redhat-9-.so-Datei unter einem Redhat-7-System zu laden versuchst.
Die einfachste Lösung, die ich Dir empfehlen könnte, wäre einfach nochmal Redhat 7.x (halt die Version, die Dein Hoster hat) auf Deine Kiste zu installieren und dort das Modul zu kompilieren - das ist narrensicher.
Viele Grüße,
Christian
Hi!
Die einfachste Lösung, die ich Dir empfehlen könnte, wäre einfach nochmal Redhat 7.x (halt die Version, die Dein Hoster hat) auf Deine Kiste zu installieren und dort das Modul zu kompilieren - das ist narrensicher.
Ja, das wollte ich eh immer schonmal machen, hast Recht, dann werde ich mir das wohl mal runterladen und das dort machen...
Danke Dir!
Grüße
Andreas
Sup!
Die Compiler-Version ist völlig Banane.
Wichtig ist, was rauskommt - und das ist Maschinencode, gespickt mit Aufrufen an andere Bibliotheken, z.B. die glibc oder den Kernel.
Wenn also die Sachen für den gleichen Kernel kompiliert und, wie man so schön sagt, "gegen" die gleichen Libs gelinkt sind, dann kann nichts passieren.
Direkt auf den Kernel zugeschnitten sind normale Binaries normalerweise auch nicht, und die Schnittstelle der glibc ändert sich auch eher selten. Also würde ich es einfach mal probieren mit dem kompilieren. Dauert ja höchstens ein paar Minuten, wenn nicht nur Sekunden, extra dafür würde ich kein altes Linux nochmal installieren.
Gruesse,
Bio