DSO erstellen, das mit verschiedenen glibc... läuft

Lesenswerte Artikel, Anleitungen und Diskussionen
andreask2
RSAC
Posts: 701
Joined: 2004-01-27 14:16
Location: Aachen

DSO erstellen, das mit verschiedenen glibc... läuft

Post by andreask2 » 2005-09-13 16:48

Hallo!

ich würde gerne 2 DSO Dateien (PHP extension, PDO) erstellen, die auch auf anderen Servern mit älterer glibc und vor allem unter anderen Distributionen läuft. Ich bin kein C-Programmierer, daher habe ich da nicht wirklich den Durchblick bei den Zusammenhängen und Möglichkeiten.

Ich dachte mir, einiges könnte das evtl. über CFLAGS lösen? Hier kann ich ja schonmal einstellen, dass der erzeugte Code auch mit älteren Prozessoren kompatibel ist.

Bisher bin ich immer an anderen glibc Versionen gecheitert, das heißt, ich erzeuge z.B. ein binary, das dann aber nicht auf dem anderen Server mit älterer glibc läuft.

Wie bekomme ich überhaupt die glibc Version heraus (außer über das Paket-Management)?

PDO hat AFAIK keine weiteren Abhängigkeiten. Dafpr aber die Treiber, so wie MySQL. Entsprechend müste ich wohl ein DSO mit kompatiblem MySQL client erzeugen. Vermutlich kann man keine MySQL4 Version für MySQL3 Server verwenden, weil dann wieder irgendelwelche Bibliotheken nicht gefunden werden... oder?

Was gibt es sonst noch zu beachten?

Könnte man das ganze nicht einfach statisch kompilieren, und die notwendigen libs fest in das Modul einkompilieren, so dass man dann nur noch auf CPU kompatible Ã?bersetzung achten muss?

Kennt jemand von Euch gute Resourcen hierzu im Netz - also auch solche die man verstehen kann auch ohne dass man Profi-C-Programmierer sein muss?

Grüße
Andreas

captaincrunch
Userprojekt
Userprojekt
Posts: 7225
Joined: 2002-10-09 14:30
Location: Dorsten

Re: DSO erstellen, das mit verschiedenen glibc... läuft

Post by captaincrunch » 2005-09-13 17:10

Statisch kompilieren wäre sicherlich die eine (aber IMHO ziemlich üble, da speicherhungrigste) Möglichkeit.

Ansonsten fiele mir spontan allerdings leider keine großartigen Möglichkeiten ein; abwärtskompatibilität innerhalb der glibc wäre ja nicht das Problem, alles andere wird schwer. CFLAGS werden dir vermutlich nicht allzu viel nutzen.

Mal ganz doof: Was spricht denn dagegen, das DSO als Source zu vertreiben, oder Distri-spezifisch zu machen?
Kennt jemand von Euch gute Resourcen hierzu im Netz - also auch solche die man verstehen kann auch ohne dass man Profi-C-Programmierer sein muss?
Puuuh...wird schwer. Ich kenne erstmal keine "gute" (vor allem zusammenhängende) Doku, wenn jemand da was hat, wäre ich aber auch sehr interessiert. ;)
DebianHowTo
echo "[q]sa[ln0=aln256%Pln256/snlbx]sb729901041524823122snlbxq"|dc

captaincrunch
Userprojekt
Userprojekt
Posts: 7225
Joined: 2002-10-09 14:30
Location: Dorsten

Re: DSO erstellen, das mit verschiedenen glibc... läuft

Post by captaincrunch » 2005-09-13 17:20

Nachtrag:
Wie bekomme ich überhaupt die glibc Version heraus (außer über das Paket-Management)?
Drei Möglichkeiten:
1. /lib/libc.so.6 (einfacher Aufruf)
2. ls -l /lib/libc.so* (die Nummer verrät dir die Version)
3.

Code: Select all

#include <stdio.h>
#include <gnu/libc-version.h>
int main (void) { puts (gnu_get_libc_version ()); return 0; }
Kompilieren, ausführen, Version sehen.

Was die Doku angeht: ich finde http://www.gnu.org/software/libc/FAQ.html recht gelungen.

Hth
DebianHowTo
echo "[q]sa[ln0=aln256%Pln256/snlbx]sb729901041524823122snlbxq"|dc

andreask2
RSAC
Posts: 701
Joined: 2004-01-27 14:16
Location: Aachen

Re: DSO erstellen, das mit verschiedenen glibc... läuft

Post by andreask2 » 2005-09-13 17:21

Es geht nicht darum das zu vertreiben. Ich darf auf einem fremden Server ein eigenes PHP-Modul verwenden (also PDO), nur kann ich es nicht lokal kompilieren.

Ein interessanter Ansatz den ich noch gefunden habe, wäre das System komplett in ein chroot auf meinem System zu packen, und das dann dort zu kompilieren. Die Frage ist nur, ob ich da als nicht-root alle notwendigen Dateien bekomme. /etc/shadow z.B. dürfte schwierig werden ;-)

Aber das könnte man ja eben ersetzen. Aber die Libs müssten ja mitkommen, also muss ich "nur" noch die Software installieren, die ich zum kompilieren brauche, sprich gcc, automake...

Aber ich vermute, auch das dürfte nicht so einfach werden wie ich mir das gerade vorstelle ;-)

User avatar
Joe User
Project Manager
Project Manager
Posts: 11578
Joined: 2003-02-27 01:00
Location: Hamburg

Re: DSO erstellen, das mit verschiedenen glibc... läuft

Post by Joe User » 2005-09-13 17:32

Die Version Deiner glibc bekommst Du per:

Code: Select all

/lib/libc.so.6 2>&1 | head -n 1 | sed 's@.*ersion ([1-9.]*).*@1@g'
Ein paar Ressourcen finden sich beispielsweise beim LFS-Project, die aktuelle Qualität kann ich jedoch nicht beurteilen, da ich sie schon seit Monaten nicht mehr gelesen habe:
http://www.linuxfromscratch.org/lfs/read.html
http://www.linuxfromscratch.org/hlfs/read.html
http://www.linuxfromscratch.org/hints/read.html

HTH

EDIT: Oops, da war ich wohl zu langsam...
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

Roger Wilco
Administrator
Administrator
Posts: 6001
Joined: 2004-05-23 12:53

Re: DSO erstellen, das mit verschiedenen glibc... läuft

Post by Roger Wilco » 2005-09-13 17:38

andreask2 wrote:Ein interessanter Ansatz den ich noch gefunden habe, wäre das System komplett in ein chroot auf meinem System zu packen, und das dann dort zu kompilieren. Die Frage ist nur, ob ich da als nicht-root alle notwendigen Dateien bekomme. /etc/shadow z.B. dürfte schwierig werden ;-)
Das wäre IMHO der beste Ansatz. Es geht ja nicht darum, dass du die exakt gleiche Konfiguration hast. Du musst nur die gleiche Umgebung haben, d. h. gleiche Software-Versionen, v.a. Apache, PHP, glibc bei dem, was du vorhast.
Das lässt sich sehr leicht mit dem Skript debootstrap machen (das man übrigens unter Gentoo einfach mit `emerge -av debootstrap` installieren kann ;))

andreask2
RSAC
Posts: 701
Joined: 2004-01-27 14:16
Location: Aachen

Re: DSO erstellen, das mit verschiedenen glibc... läuft

Post by andreask2 » 2005-09-13 17:52

[chroot]
Roger Wilco wrote:Das wäre IMHO der beste Ansatz. Es geht ja nicht darum, dass du die exakt gleiche Konfiguration hast. Du musst nur die gleiche Umgebung haben, d. h. gleiche Software-Versionen, v.a. Apache, PHP, glibc bei dem, was du vorhast.
Das lässt sich sehr leicht mit dem Skript debootstrap machen (das man übrigens unter Gentoo einfach mit `emerge -av debootstrap` installieren kann ;))
Die Frage ist nur, welche Daten ich hierfür benötige. debootstrap habe ich noch nie verwendet, jedenfalls kann ich sowas nicht auf dem "Problem-System" verwenden.

Ich hab grad mal ein bisschen geguckt, /etc und /lib wäre kein Problem. /usr hätte 500 MB, das wäre dann schon etwas schwieriger, so viel Platz habe ich nicht zur Verfügung. Brauche ich das überhaupt? Eigentlich ja schon, da ich ja schlecht mein /usr nehmen kann, da hier ja ein anderes /lib Verzeichnis verwendet wird, das dürfte nicht zusammenpassen, vermute ich mal. Was brauche ich denn wirklich aus /usr? Aber alleine /usr/lib ist schon fast 300 MB groß...

Roger Wilco
Administrator
Administrator
Posts: 6001
Joined: 2004-05-23 12:53

Re: DSO erstellen, das mit verschiedenen glibc... läuft

Post by Roger Wilco » 2005-09-13 18:05

andreask2 wrote:Die Frage ist nur, welche Daten ich hierfür benötige. debootstrap habe ich noch nie verwendet, jedenfalls kann ich sowas nicht auf dem "Problem-System" verwenden.
Nein, das nicht. Aber du kannst dir damit eine "kontrollierte" Umgebung auf deiner Kiste Zuhause mit den erforderlichen Versionen erstellen und die Apache Module dann darin bauen.
andreask2 wrote:Ich hab grad mal ein bisschen geguckt, /etc und /lib wäre kein Problem. /usr hätte 500 MB, das wäre dann schon etwas schwieriger, so viel Platz habe ich nicht zur Verfügung. Brauche ich das überhaupt?
Eigentlich brauchst du keins von alledem. Merk dir nur die installierten Versionen und pack die dann Zuhause auf deinen Rechner.
Im Prinzip musst du nichts von dem Server selbst herunterkopieren.

andreask2
RSAC
Posts: 701
Joined: 2004-01-27 14:16
Location: Aachen

Re: DSO erstellen, das mit verschiedenen glibc... läuft

Post by andreask2 » 2005-09-13 18:10

mir geht es hier nicht um eine Lösung für die Ewigkeit, früer oder später werde ich PDO support bekommen, nur eben nicht in den nächsten Wochen.

Ich habe das grad nochmal praktisch ausprobiert - pdo bei mir für die richtige PHP API-Version erstellt, beim Laden habe ich dann aber ein Problem mit der GLIBC version:

Code: Select all

Failed loading /.../pdo.so:  /lib/libc.so.6: version `GLIBC_2.3' not found (required by /.../pdo.so)
Also das was ich erwartet hatte. Dank Eurer Hilfe kenne ich jetzt auch die notwendige glibc Version: 2.1.3

Gut, ich vermute ich brauche also eine 'GLIBC_2.1'

Gentoo hat sowas schonmal nicht mehr in Portage. Gibt es evtl. einen Switch dass man kompatibel zu älteren glibc Versionen kompilieren kann (ähnlich wie bei CFLAGS und Architekturen)? Oder wie kann ich die glibc 2.1 am einfachsten installieren/verwenden, ohne mein komplettes System in Mitleidenschaft zu siehen?

Ich les jetzt erstmal ein bisschen in den vielen Links, danke auch hierfür!

andreask2
RSAC
Posts: 701
Joined: 2004-01-27 14:16
Location: Aachen

Re: DSO erstellen, das mit verschiedenen glibc... läuft

Post by andreask2 » 2005-09-13 18:23

am liebsten würde ich ja eben ein minimales Gentoo system in einem chroot installieren, bringt mir aber nichts wenn ich keine glibc 2.1 installieren kann. Evtl. könnte ich einen overlay für glibc erstellen, und darin dann ein altes glibc 2.1 ebuild aus dem portage cvs installieren. Die Frage ist nur, ob das mit dem Rest des Systems nich funktionieren kann.

Vielleicht könnte ich mir auch eine uralte Gentoo Installations CD herunterladen...

Mit debootstrap blicke ich nicht wirklich durch. Gibts dazu irgend ne Doku? Kann ich damit einfacher an ein System mit 2.1er glibc kommen? Ich denke, dass sarge wohl nicht mehr die 2.1er einsetzt.

User avatar
Joe User
Project Manager
Project Manager
Posts: 11578
Joined: 2003-02-27 01:00
Location: Hamburg

Re: DSO erstellen, das mit verschiedenen glibc... läuft

Post by Joe User » 2005-09-13 18:30

Gentoos eBuild für glibc-2.3.5-r1 (~x86) kennt USE="glibc-compat20", eventuell reicht ein Rekompilieren?
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

andreask2
RSAC
Posts: 701
Joined: 2004-01-27 14:16
Location: Aachen

Re: DSO erstellen, das mit verschiedenen glibc... läuft

Post by andreask2 » 2005-09-13 18:49

Ah, das werde ich mal probieren.

Vorrher probiere ich es aber noch mit statisch gelinkten DSOs. Sowas habe ich schonmal probiert, aber es hat nie geklappt.

ich habe jetzt in "Makefile" "-static" zu CFLAGS hinzugefügt:

Code: Select all

CFLAGS = -static -g -O2
Aber ich bin nicht sicher ob das das macht was ich will. Jedenfalls wird jetzt kein .so mehr erstellt, sondern nur noch ein .a

Das kann ich aber nicht laden:

Code: Select all

Unable to load dynamic library '/www/.../pdo.a' - /.../pdo.a: invalid ELF header in Unknown on line 0
Ich denke, ich habe jetzt kein statisch gelinktes DSO erstellt, sondern ein Objekt, das ich statisch in ein binary einkompilieren kann.

Wobei mir ein ldd nicht mehr die glibc... zeigt, sondern

Code: Select all

not a dynamic executable
Vielleicht muss ich nur einen Teil der GCC Kommandos mit "-static" ausführen?

aber wie, und welche der Kommandos? Oder habe ich das prinzipiell richtig gemacht, und es geht halt nicht?

Jedenfalls kann ich diese pdo.a auch nicht auf meinem lokalen Rechner einbinden, ich erhalte denselben Fehler.

PS: die größe des .a binaries ist übrigens nur unwesentlich größer, 320kb vs. 500kb. Also sehe ich hier keinen großen Nachteil. Wenn das dnen möglich ist, wäre ein statisch gelinktes DSO wohl der einfachste Weg. Nur wie bekomme ich das hin?

captaincrunch
Userprojekt
Userprojekt
Posts: 7225
Joined: 2002-10-09 14:30
Location: Dorsten

Re: DSO erstellen, das mit verschiedenen glibc... läuft

Post by captaincrunch » 2005-09-13 20:38

Das kann ich aber nicht laden
...da augenscheinlich eine dynamisch generierte Library erwartet wird. ;)
Ich denke, ich habe jetzt kein statisch gelinktes DSO erstellt, sondern ein Objekt, das ich statisch in ein binary einkompilieren kann.
Nein. Streng genommen hast du eine statische Library erzeugt, die wiederum statisch gelinkte bedienen könnte. ;)
Wobei mir ein ldd nicht mehr die glibc... zeigt, sondern
..., weil du ja schließlich auch statisch kompiliert hast, und so keine "Abhängigkeiten" mehr bestehen. ;)
Oder habe ich das prinzipiell richtig gemacht, und es geht halt nicht?
Prinzipiell richtig, scheint in dem Fall aber nicht zu gehen / schwer zu sein.

Fazit: komm weg von der Idee mit der statischen Lib, das wird zu hart. Erzähl uns lieber mal mehr über Ausgangs- und Zielsystem, verwendete Compiler und glibc-Versionen auf den Kisten. debootstrap wird (in diesem Fall) wohl erheblich einfacher werden. ;)
DebianHowTo
echo "[q]sa[ln0=aln256%Pln256/snlbx]sb729901041524823122snlbxq"|dc

andreask2
RSAC
Posts: 701
Joined: 2004-01-27 14:16
Location: Aachen

Re: DSO erstellen, das mit verschiedenen glibc... läuft

Post by andreask2 » 2005-09-13 22:56

OK

mein Zielsystem (nicht veränderbar):

Distribution: minimales RedHat (AFAIK!), sehr stark angepasst
Kernel: 2.4.29
gcc: nicht verfügbar
glibc: 2.1.3
MySQL: 3.23.57
PHP: 5.0.3


mein aktuelles Ausgangs-System (anpassbar):

Distribution: Gentoo
Kernel: 2.4.31
gcc: 3.3.3
glibc: 2.3.3
MySQL: 4.0.25
PHP: 5.0.3

Ich hoffe das sind alle Programme um die ich mir sorgen machen muss. pdo.so ist noch gegen /lib/ld-linux.so.2 gelinkt, ich hoffe einfach mal das wird auch von glibc erschlagen, zumindest ldd scheint ja dazu zu gehören ;-)

Also, da das mit dem statischen Linken dann wohl leider nicht der Hit ist, muss ich es jetzt also in einem chroot erstellen. Reicht denn wohl ein USE="glibc-compat20" bei Gentoo?

Was ich sicher nicht machen werde, ist mein System auf eine ~ARCH glibc upzudaten, dann doch lieber in einem chroot. Mit Gentoo wird der Spaß allerdings etwas dauern, vor allem wenn ich die glibc kompilieren muss. Also würde ich schon ganz gerne mal debootstrap versuchen. Das scheint ja sehr einfach zu sein.

Um PHP und MySQL brauche ich mich hier nicht wirklich zu kümmern, da kann ich die benötigten Versionen (in Minimal-Version) eben schnell selber kompilieren, die einzigen Probleme sind glibc und gcc.

Prinzipiell dürfte die gcc Version, mit der ein DSO kompiliert wurde doch keine Rolle spielen, oder? Wichtig ist nur die glibc Version, oder liege ich hier falsch?

Bleibt also nur, wie bekomme ich ein möglichst kleines Basis-System mit glibc 2.1.3 (vermutlich reicht auch eine andere 2.1er Version). debootstrap sieht so aus als wäre es genau das richtige. Aber wenn mich nicht alles täuscht, verwenden weder woody noch sarge eine 2.1er glibc, oder? Also was würdet Ihr empfehlen, wie ich mit debootstrap jetzt ein Basis Debian mit 2.1.3er glibc hinbekomme?

andreask2
RSAC
Posts: 701
Joined: 2004-01-27 14:16
Location: Aachen

Re: DSO erstellen, das mit verschiedenen glibc... läuft

Post by andreask2 » 2005-09-13 23:04

Ich versuche jetzt einfach mal ein

Code: Select all

debootstrap woody ./debian http://ftp.de.debian.org/debian
und lass mich mal überraschen was da so passiert ;-)

andreask2
RSAC
Posts: 701
Joined: 2004-01-27 14:16
Location: Aachen

Re: DSO erstellen, das mit verschiedenen glibc... läuft

Post by andreask2 » 2005-09-13 23:55

OK, das ging jetzt in der Tat einfacher als ich dachte, nicht schlecht!

Gut - allerdings hat selbst woody eine 2.2.5er glibc. Wie komme ich jetzt an eine 2.1.3er?

Die kann ich ja nicht einfach drüber installieren, dann funktioniert sicher nichts mehr.

Also mal den nächst älteren Release ausprobiert - potato: Treffer, 2.1.3er glibc! Allerdings fehlen hier seit 2 Jahren Sicherheitsupdates.

edit:
das Problem mit apt war keines ;-)

andreask2
RSAC
Posts: 701
Joined: 2004-01-27 14:16
Location: Aachen

Re: DSO erstellen, das mit verschiedenen glibc... läuft

Post by andreask2 » 2005-09-14 00:23

Naja. Jetzt habe ich ein altes System, das leider keinen neuen Code mehr kompilieren kann ;-)
# cd /usr/local/src/php-5.0.3
# ./configure --disable-all
creating cache ./config.cache
checking host system type... i686-pc-linux-gnulibc1
checking for gcc... gcc
checking whether the C compiler (gcc ) works... no
configure: error: installation or configuration problem: C compiler cannot create executables.
# gcc -v
Reading specs from /usr/lib/gcc-lib/i386-linux/2.95.2/specs
gcc version 2.95.2 20000220 (Debian GNU/Linux)
und jetzt? gcc vom source zu installieren sieht nicht ganz so einfach aus, und wenn ich eine neuere sources.list verwende, werde ich wohl meine glibc 2.1.3 los :-(

btw.:

Code: Select all

# ls /var/cache/apt/archives/ | grep libc
libc6_2.1.3-20_i386.deb
Ist diese Version prinzipiell OK?

andreask2
RSAC
Posts: 701
Joined: 2004-01-27 14:16
Location: Aachen

Re: DSO erstellen, das mit verschiedenen glibc... läuft

Post by andreask2 » 2005-09-14 02:01

So, um mal das Selbstgespräch zu beenden - es hat tatsächlich geklappt ;-)

Vielen Dank Euch allen! Hat zwar mit PHP 5.0.3 nicht geklappt, weil da vermutlich ein Problem mit libtool bestand, aber zum Glück ist libtool seit 5.0.4 nicht mehr nötig, und diese Version ist binär-kompatibel - puh ;-)

Ich hab mal aufgeschrieben, wie ich das jetzt letztendlich gemacht habe, das Systzm hat jetzt folgende Eckdaten:

Distribution: Debian Potato
Kernel: 2.4.31 (chroot)
gcc: 2.95.2 20000220 (Debian GNU/Linux)
glibc: 2.1.3-20
MySQL: 3.23.57 (für PDO_mysql)
PHP: 5.0.4

Code: Select all

# bootstrap
debootstrap potato /df http://archive.debian.org

# chroot
chroot /df /bin/bash

# check glibc version
/lib/libc.so.6 2>&1 | head -n 1 | sed 's@.*ersion ([1-9.]*).*@1@g'

# create /etc/apt/sources.list
echo 'deb http://archive.debian.org potato main contrib non-free' >> /etc/apt/sources.list
echo 'deb http://non-us.debian.org/debian-non-US potato/non-US main non-free' >> /etc/apt/sources.list

# install missing packages
apt-get update
apt-get install man
apt-get install less
apt-get install nano
apt-get install wget
apt-get install gcc
apt-get install flex
apt-get install libc-dev
apt-get install automake
apt-get install libtool

export PATH=$PATH:/usr/local/bin
cd /usr/local/src

# install mysql
wget http://downloads.mysql.com/archives/mysql-3.23/mysql-3.23.57-pc-linux-i686.tar.gz
tar -xzf mysql-3.23.57-pc-linux-i686.tar.gz
ln -s /usr/local/src/mysql-3.23.57-pc-linux-i686 mysql

# install php
wget http://de3.php.net/get/php-5.0.4.tar.gz/from/this/mirror
tar -xzf php-5.0.4.tar.gz
cd php-5.0.4
./configure --disable-all
make
make install
cd ..

# create PDO package
wget http://pecl.php.net/get/PDO-1.0RC1.tgz
tar -xzf PDO-1.0RC1.tgz
cd PDO-1.0RC1
phpize
./configure
make
Gibt es daran was auszusetzen, würdet Ihr irgendwas anders machen?

Wie sieht das Sicherheitsttechnisch aus? Eigentlich müsste das OK sein oder wo seht Ihr Risiken?


Jedenfalls vielen Dank für Eure Hilfe!