28 votes

Compiler avec une ancienne libc (version `GLIBC_2.14 'introuvable)

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?

9voto

Employed Russian Points 50479

Voir cette réponse.

Est-ce même la bonne approche ici

Non: vous ne pouvez pas utiliser des versions incompatibles de glibc comme le fait votre commande de lien. Vous avez utilisé crt0.o et ld-linux.so partir d'une nouvelle libc (installée par le système), mais libc.so.6 partir d'une ancienne libc (copiée à partir du cluster). Cela ne fonctionnera tout simplement pas.

2voto

Jonathan Wakely Points 45593

-rpath définit la balise DT_RPATH mais ne dit pas à l'éditeur de liens de rechercher les bibliothèques, vous voulez -L pour cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X