Vous avez raison dans ce que glibc utilise versioning symbole. Si vous êtes curieux, l'implémentation des versions de symboles introduite dans la glibc 2.1 est décrite here et est une extension du schéma de versionnement des symboles de Sun décrit here.
Une option consiste à lier statiquement votre binaire. C'est probablement l'option la plus facile.
Vous pouvez aussi construire votre binaire dans un environnement de construction chroot, ou en utilisant un glibc nouvelle => glibc vieux compilateur croisé.
Selon le blog http://www.trevorpounds.comLinking to Older Versioned Symbols (glibc), il est possible de forcer un symbole d'être liés à une version plus ancienne tant qu'il est valide en utilisant le même .symver
pseudo-op qui est utilisé pour définir versionnée symboles en premier lieu. L'exemple suivant est extrait du blog post.
L'exemple suivant utilise la realpath de glibc, mais assure qu'il est lié avec une ancienne 2.2.5 la version.
#include <limits.h>
#include <stdlib.h>
#include <stdio.h>
__asm__(".symver realpath,[email protected]_2.2.5");
int main()
{
char* unresolved = "/lib64";
char resolved[PATH_MAX+1];
if(!realpath(unresolved, resolved))
{ return 1; }
printf("%s\n", resolved);
return 0;
}
Argh c'est l'un de ces problèmes linux vraiment ennuyeux comme où la solution est toujours « vous ne devriez pas le faire », ce qui signifie bien sûr « cela ne fonctionne pas et personne n'a encore fixé ». – Timmmm
Les gens se sont plaints de DLL enfer sur Windows. Je me souviens de Linux * certains * aficionados essayant d'en faire un exemple particulièrement horrible du monde de Windows. Quand j'ai commencé à faire ce * développement * Linux il y a plus de dix ans, tout ce que je faisais, c'était enterrer mon visage entre mes mains. – 0xC0000022L