Besoin d'aide pour downgrader la glibc

Bonjour à tous,

Je suis bien embêté par Cyberplus : j’installe un module de paiement ATOS pour un client sur un serveur “tout neuf”, donc une glibc 2.7-18 et après moultes galères pour lancer un binaire ATOS, le support téléphonique Cyberplus m’annonce qu’il faut que la glibc du serveur soit en 2.3…

Heureusement le serveur n’hébergera que ce site donc je peux théoriquement downgrader la glibc sauf que je n’ai aucune idée de comment faire cela proprement.

Je parcours le web depuis quelques instantes mais ne trouve pas franchement la démarche, ca m’a l’air d’être une manip pas trop répandue…

Merci d’avance pour votre aide !

EDIT :

J’ai essayé d’indiquer les sources ETCH dans le sources.list afin d’avoir une 2.3.6, j’ai fait un apt-get update puis tenté un apt-get remove libc6… et là il veut m’enlever quasiment tout les paquets de ma distrib :

[quote]Les paquets suivants seront ENLEVÉS :
acpi-support-base acpid adduser apache2 apache2-mpm-prefork apache2-utils apache2.2-common apt apt-utils aptitude aspell aspell-fr at autoconf automake automake1.4 base-files base-passwd bash bash-completion bc bind9 bind9-host
bind9utils binutils bsd-mailx bsdmainutils bsdutils build-essential busybox bzip2 ca-certificates console-common console-data console-setup console-terminus console-tools coreutils cpio cpp cpp-4.3 cron dc debconf debconf-i18n
debian-archive-keyring debianutils dedibox-dma defoma dhcp3-client dhcp3-common dictionaries-common diff dmidecode dnsutils dpkg dpkg-dev e2fslibs e2fsprogs ed eject expect file findutils fontconfig fontconfig-config ftp g++ g+±4.3
gcc gcc-4.3 gettext-base ghostscript gnupg gpgv grep groff-base grub grub-common gs-common gsfonts gzip hddtemp hostname iamerican ibritish ifrench-gut ifupdown imagemagick info initramfs-tools initscripts iproute iptables
iputils-ping ispell language-env laptop-detect less libacl1 libapache2-mod-php5 libapr1 libaprutil1 libaspell15 libatk1.0-0 libatk1.0-data libattr1 libbind9-40 libblkid1 libbz2-1.0 libc6 libc6-dev libc6-i686 libcairo2 libcap1 libcap2
libcomerr2 libconsole libcroco3 libcups2 libcupsimage2 libcurl3 libcwidget3 libdatrie0 libdb4.5 libdb4.6 libdbd-mysql-perl libdbi-perl libdevmapper1.02.1 libdirectfb-1.0-0 libdjvulibre21 libdns45 libedit2 libept0 libevent1 libexpat1
libfontconfig1 libfontenc1 libfreetype6 libgc1c2 libgcc1 libgcrypt11 libgd2-xpm libgdbm3 libglib2.0-0 libglib2.0-data libgmp3c2 libgnutls26 libgomp1 libgpg-error0 libgpm2 libgraphviz4 libgs8 libgsf-1-114 libgssglue1 libgtk2.0-0
libgtk2.0-bin libhtml-template-perl libice6 libidn11 libilmbase6 libisc45 libisccc40 libisccfg40 libjasper1 libjpeg62 libkeyutils1 libkrb53 liblcms1 libldap-2.4-2 liblocale-gettext-perl liblockfile1 libltdl3 libltdl3-dev liblwres40
libmagic1 libmagick10 libmpfr1ldbl libmysqlclient15off libncurses5 libncursesw5 libneon27-gnutls libnet-daemon-perl libnewt0.52 libnfsidmap2 libopenexr6 libpam-modules libpam0g libpango1.0-0 libpango1.0-common libpaper-utils
libpaper1 libpci3 libpcre3 libperl5.10 libpixman-1-0 libplrpc-perl libpng12-0 libpopt0 libpq5 libreadline5 librpcsecgss3 librsvg2-2 libsasl2-2 libselinux1 libsensors3 libsensors4 libsepol1 libserf-0-0 libsigc+±2.0-0c2a libslang2
libsm6 libsnmp15 libsqlite3-0 libss2 libssh2-1 libssl-dev libssl0.9.8 libstdc++6 libstdc++6-4.3-dev libsvn1 libsysfs2 libt1-5 libtasn1-3 libterm-readkey-perl libtext-charwidth-perl libtext-iconv-perl libtext-wrapi18n-perl libthai0
libtiff4 libtimedate-perl libtool libts-0.0-0 libusb-0.1-4 libuuid1 libvolume-id0 libwmf0.2-7 libwrap0 libx11-6 libxapian15 libxau6 libxcb-render-util0 libxcb-render0 libxcb-xlib0 libxcb1 libxcomposite1 libxcursor1 libxdamage1
libxdmcp6 libxext6 libxfixes3 libxfont1 libxft2 libxi6 libxinerama1 libxml2 libxmuu1 libxpm4 libxrandr2 libxrender1 libxt6 linux-image-2.6-686 linux-image-2.6.26-1-686 lm-sensors locales lockfile-progs login logrotate lsb-base lsof
lzma m4 make makedev man-db mawk mdadm mktemp mlocate module-init-tools mount mutt mysql-client-5.0 mysql-server mysql-server-5.0 mytop nano ncurses-base ncurses-bin net-tools netbase netcat-traditional nfs-common ntpdate
openbsd-inetd openntpd openssh-blacklist openssh-blacklist-extra openssh-client openssh-server openssl openssl-blacklist p7zip passwd patch pciutils perl perl-base perl-modules php5 php5-cli php5-common php5-curl php5-dev php5-gd
php5-imagick php5-mysql portmap postfix procmail procps psfontmgr psmisc python python-central python-minimal python2.5 python2.5-minimal reiserfsprogs reportbug rsync rsyslog sed shtool smartmontools snmpd ssh ssl-cert subversion
sysvinit sysvinit-utils tar tasksel tasksel-data tcl8.4 tcpd telnet texinfo time traceroute ttf-dejavu ttf-dejavu-core ttf-dejavu-extra tzdata ucf udev unzip update-inetd usbutils util-linux vim vim-common vim-runtime vim-tiny w3m
wamerican wfrench wget whiptail whois x-ttcidfont-conf x11-common xauth xfonts-encodings xfonts-utils xfsprogs zip zlib1g zlib1g-dev
ATTENTION : Les paquets essentiels suivants vont être enlevés.
Vous NE devez PAS faire ceci, à moins de savoir exactement ce
que vous êtes en train de faire.
apt libc6 (en raison de apt) libgcc1 (en raison de apt) libstdc++6 (en raison de apt) debian-archive-keyring (en raison de apt) base-files base-passwd (en raison de base-files) mawk (en raison de base-files) bash debianutils (en
raison de bash) libncurses5 (en raison de bash) bsdutils coreutils libacl1 (en raison de coreutils) libselinux1 (en raison de coreutils) diff dpkg lzma (en raison de dpkg) e2fsprogs e2fslibs (en raison de e2fsprogs) libblkid1 (en
raison de e2fsprogs) libcomerr2 (en raison de e2fsprogs) libss2 (en raison de e2fsprogs) libuuid1 (en raison de e2fsprogs) findutils grep gzip hostname login libpam0g (en raison de login) libpam-modules (en raison de login) mktemp
mount ncurses-base ncurses-bin perl-base sed sysvinit libsepol1 (en raison de sysvinit) initscripts (en raison de sysvinit) sysvinit-utils (en raison de sysvinit) tar util-linux lsb-base (en raison de util-linux) tzdata (en raison de
util-linux) libslang2 (en raison de util-linux) zlib1g (en raison de util-linux)
0 mis à jour, 0 nouvellement installés, 379 à enlever et 0 non mis à jour.
Après cette opération, 667Mo d’espace disque seront libérés.
Vous êtes sur le point de faire quelque chose de potentiellement dangereux
Pour continuer, tapez la phrase « Oui, faites ce que je vous dis ! »
[/quote]

Ça fait peur !

Si j’étais dans la même situation que toi,
je n’essaierai pas un downgrade de glibc
mais une réinstallation avec la bonne version directement
(quitte à faire du LFS dans les cas les plus hardcore)

Pour la méthode à utiliser, je ne te serai pas d’un grand secours, c’est une opération très délicate ce que tu veux faire, ce qui m’amène au “pourquoi” de mon post… c’est “normal” qu’il veuille te virer pas mal de truc, beaucoup de paquets dépendent (directement ou pas) de la “glibc”… du coup, si tu change de version, il te faut ré-installer pas mal de chose…
Tu l’as sous la main le serveur? (ou accessible uniquement via le net?), si tu l’as sous la main, prévoit une bonne sauvegarde du système avant de te lancer… :wink:

En tout cas… bon courage… à mon avis c’est pas simple ce que tu veux faire… :confused:

T’as pas moyen de “gruger” ton soft plutôt? (avec un “lien” ou un “export”… :unamused: …) l’erreur est au lancement à cause d’une mauvaise version de glibc? (ou “plus loin” sur une fonction/action spécifique?)

:smt006

Bonsoir,

L’erreur est au lancement du binaire : il sort un message d’erreur et d’après la hotline ATOS, c’est parce que glibc est trop récente.

En fin d’après midi je leur ai demandé des explications sur comment cela est possible 2010 ?? c’est aberrant de proposer des passerelles de paiement qui tournent sur des libs datant de 2003 !!

J’attends donc une position de leur part car j’imagine ne pas être le seul à installer cette solution !

Tu peux essayer avec un:export SETUP_LIBC=glibc-version.que.tu.veuxavant de lancer l’appli (dans la même console… à confirmer)…

dans ton cas:export SETUP_LIBC=glibc-2.3ça peut marcher si la dite appli n’utilise que des “parties” de la lib qui n’ont pas “changé”… c’est pas sûr que ça marche… et ça “sautera” au reboot… mais bon… ça peut peut-être te sauver la mise sans trop de risque… :wink:

:smt006

Dans la même veine,
tu peux recompiler la vieille libc
et l’utiliser dans un chroot ou avec du LD_PRELOAD

Oui… plus sûr “ta soluce”… :wink:

:smt006

[quote=“BBT1”]Dans la même veine,
tu peux recompiler la vieille libc
et l’utiliser dans un chroot ou avec du LD_PRELOAD[/quote]

Merci pour cette piste, je n’y connais rien en chroot ni en LD_PRELOAD mais c’est déjà super de savoir par où commencer les recherches !

Alors l’idée du chroot,
c’est de prendre un répertoire et de décider que c’est le nouveau / pour ton processus.
Du coup, si normalement ton système est organisé autours de /,
tu te construit une installation en parallèle dans un autre répertoire (par ex. /myohterdebian)
et tu installes les librairies qui vont bien dans cet environnement.

Du coup, par exemple pour la libc, elle ne sera pas dans /lib mais dans /myotherdebian/lib.
debootstrap peut être utile.

LD_PRELOAD est une autre approche,
tu ne crées pas de système en parallèle comme dans la méthode précédente,
tu te contente de forcer l’utilisation d’un .so que tu indiquera (par exemple une libc à la bonne version)
qui remplacera celle normalement utilisée par le système.

Ces 2 approches méritent un peu d’attention,
mais elles sont couvertes par un grand nombre de tutos sur le net.

Merci pour ces éclaircissements, c’est top !

Mon serveur est un serveur web, il héberge déjà des sites, et il en hébergera d’autres.

du coup la méthode LD_PRELOAD m’intéresse, il me reste à voir comment ne forcer l’utilisation de cette “vieille” libc, uniquement pour ce site web.

Etant donné que les binaires ATOS sont appelés depuis PHP bia exec() ou shell_exec(), je pense que peut-être je pourrais utiliser LD_PRELOAD depuis PHP, juste avant l’appel des binaires.

Merci encore pour votre aide en tout cas :wink:

Faut tester mais comme on peut virtuellement détourner n’importe quel appel de bibliothèque avec cette méthode,
il est possible (probable ?) que PHP te mette des bâtons dans les roues.

Crée toi un exemple minimaliste,
fabrique un .so bidon avec une fonction que tu redéfinis (genre tu redéfinis read ou write, attention au printf qui est remâché par le compilo et qui n’est pas appelé tel quel)
tu testes avec un petit programme C qui appelle la fonction que tu as redéfini
l’étape d’après tu essaie d’appeler ta fonction redéfinies depuis du code PHP
et si jamais ça marche, tu tentes avec ton programme final et la nouvelle libc

je te préviens d’avance: c’est pas pour les débutants

J’arrive un peu après la bagarre, mais bon

  1. Le downgrade: Tu fais un fichier preferences avec une pruiorité à 1010 sur les dépot etch, un dist-upgrade et tu repasses en Etch. Attention, il peut y avoir des soucis (udev).

  2. Le chroot est trnaquille, va voir du coté de http://forum.debian-fr.org/viewtopic.php?f=8&t=14673 pour la méthode.

  3. Pour le LD_PRELOAD ça marche bien, il te faut faire un

LD_PRELOAD=COLUMNS=1000 ls -m /vieillelib/lib*.so | sed -e 's/, / /g' tonprogramme

dans lequel tu met les librairies que tu veux charger dans /lib. Va jeter un oeil sur http://forum.debian-fr.org/viewtopic.php?f=8&t=25727 si souci. Ça peut coincer si ce programme en appelle d’autre (genre une commande shell).

Cool ! merci pour la commande LD_PRELOAD car j’ai du mal à trouver des exemples concrets !

Bon selon la réponse de Cyberplus je devrais tenter ça d’ici la fin de semaine, je vous tiendrais informé…