Je dois compiler un programme sur une ubuntu (12.04). Ce programme doit alors s'exécuter sur un cluster à l'aide de CentOS avec un ancien Noyau (2.6.18). Je ne peut pas compiler sur le cluster directement, malheureusement. Si je viens de le compiler et de copier le programme sans aucun changement, je reçois le message d'erreur "kernel trop vieux".
La façon dont je l'ai compris, la raison pour laquelle ce n'est pas tant la version du Noyau, mais la version de la libc qui a été utilisé pour la compilation. J'ai donc essayé de compiler mon programme dynamiquement reliant la libc de la grappe et de la liaison statique de tout le reste.
Recherche
Il y a déjà beaucoup de questions à ce sujet sur DONC, mais aucune réponse n'a vraiment fonctionné pour moi. Voici donc ma recherche sur le sujet:
- Cette question explique la raison pour laquelle le Noyau trop vieux message
- Cette question est similaire, mais plus spécialisé, et n'a pas de réponses
- Lier statiquement comme proposé ici n'a pas fonctionné parce que la libc est trop vieux sur le cluster. Une réponse mentionne également construire en utilisant les anciens de la libc, mais n'explique pas comment le faire.
- Une façon est de compiler sur une machine virtuelle exécutant un vieux OS. Cela a fonctionné, mais il est compliqué. J'ai aussi lu que vous ne devriez pas le lien de la libc statiquement
-
Apparemment il est possible de compiler pour une autre version de la libc avec l'option
-rpath
mais cela ne fonctionne pas pour moi (voir ci-dessous)
État actuel
J'ai copié les fichiers suivants à partir du cluster dans le répertoire /path/to/copied/libs
- libc-2.5.donc
- libgcc_s.donc.1
- libstdc++.donc.6
et je suis compiler avec les options -nodefaultlibs -Xlinker -rpath=/path/to/copied/libs -Wl,-Bstatic,-lrt,-lboost_system,-lboost_filesystem -Wl,-Bdynamic,-lc,-lstdc++,-lgcc_s
La sortie de la commande ldd sur le binaire compilé est
mybin: /path/to/copied/libs/libc.so.6: version `GLIBC_2.14' not found (required by mybin)
mybin: /path/to/copied/libs/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by mybin)
linux-vdso.so.1 => (0x00007ffff36bb000)
libc.so.6 => /path/to/copied/libs/libc.so.6 (0x00007fbe3789a000)
libstdc++.so.6 => /path/to/copied/libs/libstdc++.so.6 (0x00007fbe37599000)
libgcc_s.so.1 => /path/to/copied/libs/libgcc_s.so.1 (0x00007fbe3738b000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbe37bf3000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fbe37071000)
Je suis un peu confus par l'erreur, car il utilise le chemin d'accès correct (c'est à dire la libc du cluster), mais toujours se plaint d'un manque de glibc. Lors de l'exécution de la commande ldd sur le cluster, il retourne not a dynamic executable
et l'exécution du binaire résultats dans les deux mêmes erreurs mentionnées ci-dessus. Aussi, il semble que il y a d'autres bibliothèques incluses (linux-vdso.donc.1, ld-linux-x86-64.donc.2 et libm.donc.6). Dois-je utiliser les anciennes versions pour ceux aussi bien?
Alors maintenant, j'ai deux questions principales:
- Est-ce vraiment la bonne approche ici?
- Si oui: comment faire pour relier le vieux de la libc correctement?