-
-
Notifications
You must be signed in to change notification settings - Fork 58
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Release 7.2.2 does not run in Debian 11 64 bit. #531
Comments
I think that it is not possible to have multiple versions in one binary. So in this case, that would mean making a version for this older Debian by compiling it on an older Debian. |
I will try to explain better. When you compile Lazpaint, it will link with libc.so.6 installed on your system. So a distro with a libc.so.6 older than the one linked at compilation will not be able to run LazPaint (is the case for last Debian 11 that uses last stable version of libc.so.6.) The good news is that libc.so.6 is backward compatible, a new libc.so.6 accept a old linked libc.so.6 ( but not reverse). So the easy solution:
|
Oh ok there are various versions of libc.so.6. I suppose that's doable. |
Yes, that is the problem (and also that fpc still needs to link with libc but this is a other hot story) |
Just by incurable curiosity. What do you get doing this in console?: ~> /lib/x86_64-linux-gnu/libc.so.6 Is it mentioned "stable release" like in Debian 11?
|
It tells me: "Permission non accordée" |
Perfect. And with that: ( Strange that you need sudo ) |
Maybe your libc.so.6 is in other place... To find it, in console, just do If nothing found, do this: |
With The file is there, it shows with |
Ha it was not a joke...
You may also get the version of libc.so.6 with lld (but less infos).
|
Setting +x did the trick. Here is what it says: |
Hum, Debian package version 2.35 is set a "experimental". Anyway, that version is higher than 2.31 and if you link with that version the executable will not run on Debian 11. I know that ArchLinux always uses the last experimental version of libc in their release. My 0.01 cent of course. |
Ha sorry, I did not note that it gives the distro too. |
By the way, please dont try to install a other version of libc.so.6 on your system. |
Allez, le dernier. OK, I stop. |
I admit it is beyond my understanding |
Bon, je resume. Donc si tu compiles LazPaint sur un systeme qui a la derniere version GCLIB_2.34., ce binary ne fonctionnera pas sur un syteme avec une version de clib precedente. Et le truc magic de Robert est de, au linkage, a la place d'assigner les memes symboles que la libraire presente sur le systeme qui compile, de les assigner "unsigned". Donc, ok, c'est complique mais c'est une bonne nouvelle/trouvaille. |
Ok, donc en utilisant cette version magique sur le système, on obtient un binaire qui fonctionne sur toutes les versions. Mais est-ce que cette version bidon fonctionne vraiment, en fait ? Les programmes fonctionnent toujours ? |
J ai teste sur une ancienne version Debian 5 de 2009 et cela fonctionne. En fait c'est pas grave si les devs de fpc ne veulent rien changer (ils sont terrorises par le linkeur) car la solution du "fake libdl.so" est geniale et facile. PS: Sympas vos manifs un peu frivolles des derniers jours/nuits... ;-) |
Back to EN. |
J'aime bien l'idée que le programme fonctionne avec plusieurs version des librairies. C'est l'approche que j'ai choisie d'ailleurs pour les librairies graphiques (webp, avif). Je suppose que la position Debian est que les applications sont compilées au niveau paquet pour la dernière version du système. Cela dit, pour les binaires téléchargés sur le site de LazPaint, ce serait bien d'avoir un max de compatibilité. Cela dit, je me demande les cas d'utilisation, dans le sens où en principe, les gens mettent à jour leur système Linux. PS: je n'ai pas trop suivi les fêtes nocturnes récentes, trop occupée que j'étais à penser à mes vacances, enfin, et gérer mon emménagement. So what would be the target actually? A Debian package for old Debian distros? |
C'est plus compliqué, je pense. Je ne crois pas que Debian se soucie comment le linkage a ete fait et avec quelle table de symbole. La librairie qui pose probleme est libc.so. Par example, la plus ancienne table de signatures qui fonctionne sur les libc.so actuelles est "@GLIBC2.2.5" et est incluse dans chaque libc.so. Recemment, les dev de glibc on introduit une nouvelle table de signature: GLIBC_2.34. Note que la version de libc.so ne change pas en fonction des dates, elle reste libc.so.6 meme quand une table de symboles a ete ajoutee. Mais il existe d' autre methode de linkage, par example celle qui utilise "unsigned" symbols. Une autre methode de linkage qui fonctionne bien est d'assigner l'ancienne table "GLIBC2.2.5". FPC n utilise pas les subtilites des differentes tables donc c'est etrange de signer le binary. For the target, sure all the linux_no_install assets and for the Debian asset, I should do it too so you could use the debian package also for older distro. Bon emménagement. Fre;D |
Je suis en train de me dire que ce serait possible d'inclure ce hack dans le makefile. En ayant le source Merci pour les explications. Si je comprends bien, il y a en principe plusieurs versions possibles proposées par une librarie mais |
C'est le nouveau script-option inclus dans msegui, compiler libdl.c juste avant de compiler le fpc programme et l' effacer apres linkage.
Du systeme qui compile le binary ( la solution de Rob associe avec la derniere version du systeme qui acceuille le binary ) |
Huh, a propos de ton message: "il n'est pas raisonnable que des développeurs indépendants construisent pour différentes versions" Donc tu trouves qu'il n'est pas raisonable d'avoir un exe qui fonctionne sur plusieurs systemes? |
La traduction est ambiguë je suppose. Build veut dire compiler, pas développer. |
Ha ok. Mais si tu utilises le truc de la fake libdl.so, meme si tu compiles sur une ancienne distro, la table assignee est la derniere du systeme d'acceuil (pas de compilation) donc si tu utilises le binary dans une version plus recente, c'est la derniere table qui sera utilisee. Bon, je pense avoir tout dit. (et promis je n'irai plus mettre le feu au forum Lazarus) Fre;D |
Je comprends et alors je me dis pourquoi pas faire référence à une ancienne version de la table. En quoi ce n'est pas parfait ? D'une certaine façon cela garantie que les fonctions ont bien les bonnes signatures. Est-ce qu'il y a des choses qui ne fonctionnent pas alors ? Je comprends que tu aies été taquin sur le slogan. Effectivement, la discussion semble s'être un peu calmée, ce qui est toujours préférable à mon avis. Cela dit, l'inflexibilité parfois de l'équipe de FPC me donne envie de faire un fork. |
C'est ce que Robert a essaye de faire passer comme message aux FPC dev (avant de trouver la solution libdl.so ). Je comprends que les devs soient inflexibles mais je ne supporte pas qu'ils manquent de respect a qui que ce soit. |
Et a propos de la solution "installe une ancienne disto, avec tout le bazar (fpc, dependances, ...) et compile y ton programme" est une solution "Jurassic IT". Je te souhaite plein de bonheur dans ta nouvelle demeure. Fre;D |
Effectivement, je trouve aussi que c'est important de respecter les autres personnes, même si on est en désaccord. Une ligne de code peut être changée et hop cela ferait référence à l'ancienne version de libc ? |
Effectivement, installer une ancienne distro n'est pas pratique du tout. Merci pour tes souhaits pour ma nouvelle demeure ❤️ |
Oui. |
Je ne comprends pas la réticence de changer cette ligne. Éventuellement, cela peut être avec une directive de compilation / une option de compilation. Comme cela, par défaut ça prendrait bien la dernière version mais que l'on puisse avoir cette option quand on compile un paquet qu'on va proposer au téléchargement. |
La solution optimale (proposee et bien sur refusee) serait d'ajouter un parametre/option pour fpc. "-use_last_table_of_compiler_system" (default), "-use_oldest_table_of_compiler_system", "-use_last_table_of_host_system", "-use_custom_table={thetable} ". Mais ca, bien sur, ne sera jamais accepte ( et j 'avoue que cela demanderait beaucoup de travail ). |
On peut faire plus simple, comme une option "-libc225" voire simplement une directive de compilation -dLIBC225. J'arrive un peu après, ok je note que vous avez proposé quelque chose comme cela. Cela me parait raisonnable. Juste ajouter un |
Les grands esprits se rencontrent Enfin, le temps que je comprenne le sujet 😄 Oui c'est mieux quand on se fait pas gronder ! |
J'ai fait les modifs dans fpc-ootb mais apres la trouvaille libdl.so j'hesite a commiter. En fait pour msegui l'option d'assigner la plus ancienne table GLIBC_2.5.5 n'est pas entierement OK. Pour fpc, ce n est pas un probleme car il n'utilse pas pipe2(). |
Pourquoi pas utiliser GLIBC_2.9. En fait, la librairie sans version, cela fonctionne si on suppose que les signatures des fonctions ne seront pas changées. À priori c'est peu probable, mais bon, dans la théorie je trouve préférable de spécifier la version minimum nécessaire. |
Oui c'est une option pour msegui d'assigner GLIBC_2.9 pout toutes les methodes. (et pas comme je l'ai fait, individuellement pour chaque methode utilisees) A propos des differentes signatures pour chaque methode. FPC n'est pas concerne car il utilise les methodes "de base" sans utiliser les particularites ajoutees aux nouvelles versions.
Si la librairie a ete linkee sans signature dans l'executable, alors les signatures des fonctions qui seront chargees seront les dernieres de la librairie hote. Une table de signature sera toujours chargee a l'execution (meme si au linkage on demande de ne pas signer les symboles). Je sais, c'est hyper complique et y a peu de doc, j'ai donc surement mal compris ta question. |
Du forum Lazarus:
Mwouais si c'est le cas lors d'un compilation-link fpc, ils doivent revoir tout leur code car stat est defini "hard-coded" et n'a pas change depuis toujours. Aaaargh, je m'etais promis de ne plus consulter Lazarus forum. Sorry for the noise. |
Mais bien sur, glibc a ete concu pour ca. OK, ok, je sors. |
Allez, un dernier qui resume le probleme.
Je suppose que ton coeur balance pour l'option 2) (comme Robert et moi au depart) mais cela demande des modifs au code fpc qui prendront des siecles avant d'etre publiees. Et apres tous les profonds tests ok qu'on a fait , l'option 3) me semble ideale, tout le monde est content, pas touche a fpc et on a ce qu'on veut. |
On peut faire un compromis comme cela : on suppose que les gens mettent à jour un peu leurs distributions de temps en temps, simplement on permet une certaine rétrocompatibilité.
Ah ok je pense que je comprends. Cela me fait penser aux structures qui contiennent une indication de leur taille, comme cela on sait quels paramètres peuvent être définis, ceux qui dépassent prenant la valeur par défaut. Si c'est le cas, alors on peut se baser juste sur le nom et effectivement, ne pas versioner est en fait ok. Dans le cas de pipe2, cela veut dire que si la version de libc est trop ancienne, la fonction ne sera pas disponible. Cela est vérifiable à l'exécution je présume.
Si cela n'a pas changé, je vois pas ce qu'ils auraient à revoir.
Oui cela parait logique, mais comme tu m'a expliqué le principe de compatibilité des fonctions elles-mêmes, je suppose que l'option 3 est aussi ok. |
Oui, c'est la limite du systeme "symbols signes", si une seule methode demande une version posterieure au systeme, l'application ne pourra pas fonctionner et il y aura le meme message d'erreur que mentionne le premier post. Ceci dit, GLIBC_2.9 date de 2008-11-13, c'est pas mal ( mais moins bien que GLIBC_2.2.5: 2002-01-20 ). Ca c'est pour libc.so, il y a evidemment aussi la question des versions des widgetsets ( mais c'est une autre histoire ) |
Challenge remporté !
Donc, petite rectification, MSEgui est OK a partir de 2002-01-20 pour Linux 64 bit. |
Félicitations ! Plus de 20 ans de compatibilité ! |
Hello. Screenshot of LazPaint compiled on last Xubuntu 23.04 and run on Ubuntu 10.04 from 2010. (previous versions of Ubuntu did not install on my VM). Here the binary for Linux amd64. It was compiled with new fpc-ootb-glibc225 that does not need to tweak with a fake libdl.so. (Tant pis si FPC ne bouge pas, moi j'avance...) |
Super ! J'ai ajouté l'archive timeless_no_install dans la release: |
Hello.
I try to run, on last Debian 11, LazPaint from lazpaint7.2.2_linux64_no_install.tar but get this error.
> /home/fred/Downloads/lazpaint/lazpaint
This means that you have compiled + linked with a version of libc.so.6 newer than the one of Debian 11 ( GLIBC 2.31for Debian 11)
( Note that libc.so.6 is also a executable!)
fred@fred-80m0 ~> /lib/x86_64-linux-gnu/libc.so.6
My humble advice is, for release, to be compatible with a maximum of distros, to compile it with a older version of libc.so.6, maybe from the last Debian LTS: https://wiki.debian.org/LTS/Extended
It is Debian 10 “Buster”
The text was updated successfully, but these errors were encountered: