Comment puis-je relier à une version de la glibc?
Quand je compile quelque chose sur mon Ubuntu Lucid 10.04 PC, il devient lié à l'encontre de la glibc. Lucide utilise 2.11 de la glibc. Lorsque j'exécute ce binaire sur un autre PC avec un ancien de la glibc, la commande échoue en disant: il n'y a pas de glibc 2.11...
Autant que je sache, glibc utilise les versions de symboles. Puis-je la force de gcc pour le lier avec un symbole spécifique version?
Dans mon utilisation concrète j'essaie de compiler gcc de la croix de la chaîne de BRAS.
- Argh c'est l'un de ceux qui sont vraiment ennuyeux linux problèmes, comme par exemple lorsque la solution est toujours "vous ne devriez pas faire ça", qui signifie bien sûr "ça ne fonctionne pas et personne n'a encore réalisé".
- Les gens se sont plaints au sujet de l'enfer des DLL sur Windows. Je me souviens de Linux que certains aficionados essayer d'apporter cette comme particulièrement horrible exemple dans le monde de Windows. Quand j'ai rencontré ce fait le développement de Linux il y a une décennie que je n'ai fait enterrer mon visage dans mes mains.
Vous devez vous connecter pour publier un commentaire.
Vous avez raison glibc utilise les versions de symboles. Si vous êtes curieux, les versions de symboles de mise en œuvre présenté dans la glibc 2.1 est décrit ici et est une extension de Soleil symbole du schéma de gestion des versions décrites ici.
Une option est de lier statiquement votre binaire. C'est probablement la meilleure option.
Vous pouvez aussi construire votre binaire dans un chroot environnement de construction, ou à l'aide d'une glibc-nouveau => glibc-vieux cross-compilateur.
Selon la http://www.trevorpounds.com blog les liens plus Anciens avec version des Symboles (glibc), il est possible de forcer n'importe quel symbole pour être lié à l'encontre d'un ancien tant qu'il est valide en utilisant la même
.symver
pseudo-op qui est utilisé pour définir versionnées symboles de la première place. L'exemple suivant est extrait de la post de blog.L'exemple suivant rend l'utilisation de la glibc realpath, mais fait en sorte qu'il est lié à l'encontre d'une ancienne version 2.2.5.
libc.a
continue d'exister, glibc en charge de certains cas, si c'est pas recommandé (Drepper). Vous aurez de la difficulté avec les non-trivial programmes, esp quelque chose qui utilise la NSS (solution de contournement dans FAQ).Lien avec -statique. Lorsque vous créez un lien avec -statique l'éditeur de liens intègre la bibliothèque à l'intérieur de l'exécutable, le fichier exécutable sera plus grand, mais il peut être exécuté sur un système avec une ancienne version de la glibc, car le programme va utiliser sa propre bibliothèque à la place de celle du système.
Configuration 1: compiler votre propre glibc sans dédiés GCC et de l'utiliser
Puisqu'il semble impossible à faire avec les versions de symboles hacks, nous allons aller plus loin et de compiler glibc nous-mêmes.
Cette configuration peut fonctionner et est rapide car il n'a pas de recompiler l'ensemble de la chaîne de compilation GCC, juste de la glibc.
Mais il n'est pas fiable, car il utilise l'hôte d'exécution C, des objets tels que des
crt1.o
,crti.o
, etcrtn.o
fournis par la glibc. Ceci est mentionné à: https://sourceware.org/glibc/wiki/Testing/Builds?action=recall&rev=21#Compile_against_glibc_in_an_installed_location Ces objets n'début de la configuration de la glibc repose sur, donc je ne serais pas surpris si les choses s'est écrasé dans la magnifique et terriblement façon subtile.Pour une installation plus fiable, voir le programme d'Installation 2 ci-dessous.
Construire glibc et de l'installer en local:
Configuration 1: vérification de la construction
test_glibc.c
Compiler et exécuter avec
test_glibc.sh
:Le programme des sorties attendues:
De commande adapté de https://sourceware.org/glibc/wiki/Testing/Builds?action=recall&rev=21#Compile_against_glibc_in_an_installed_location mais
--sysroot
fait échouer avec:donc je l'ai enlevé.
ldd
sortie confirme que leldd
et les bibliothèques que nous avons construits sont utilisés comme prévu:La
gcc
compilation sortie de débogage montre que mon hôte des objets d'exécution ont été utilisés, ce qui est mauvais comme mentionné précédemment, mais je ne sais pas comment faire pour le contourner, par exemple, il contient:Configuration 1: modifier la glibc
Maintenant, nous allons modifier la glibc avec:
Puis recompiler et installer glibc, et de recompiler et de ré-exécuter notre programme:
et nous voyons
hacked
imprimé à quelques reprises comme prévu.Cela confirme que nous avons en fait utilisé la glibc que nous avons compilé et non l'hôte de l'un.
Testé sur Ubuntu 18.04.
Installation 2: crosstool-NG vierges installation
C'est une alternative à la configuration 1, et il est plus correct de l'installation, j'ai obtenu loin: tout est correct aussi loin que je peux observer, y compris la C runtime des objets tels que des
crt1.o
,crti.o
, etcrtn.o
.Dans cette configuration, nous allons compiler une complète dédiée GCC suite d'outils qui permet la glibc que nous voulons.
Le seul inconvénient de cette méthode est que la construction va prendre plus de temps. Mais je ne voudrais pas prendre le risque de production de l'installation avec rien de moins.
crosstool-NG est un ensemble de scripts qui télécharge et compile le tout à partir de la source pour nous, y compris GCC, glibc et binutils.
Oui la GCC système de construction est si mauvais que nous avons besoin d'un projet distinct pour que.
Cette configuration n'est pas parfait, parce que crosstool-NG ne prend pas en charge la construction de la exécutables sans supplément de
-Wl
drapeaux, qui se sent bizarre, depuis que nous avons construit GCC lui-même. Mais tout semble fonctionner, si ce n'est qu'un inconvénient.Obtenir crosstool-NG et le configurer:
La seule option obligatoire que je peux voir, c'est de faire correspondre à votre hôte de la version du noyau à utiliser les bons en-têtes du noyau. Trouvez votre hôte version du noyau avec:
qui me montre:
donc dans
menuconfig
je fais:Operating System
Version of linux
donc je sélectionne:
qui est la première version antérieure ou égale. Il a à être plus âgés, puisque le noyau est rétro-compatible.
Vous pouvez maintenant construire avec:
et maintenant, attendez environ trente minutes à deux heures pour la compilation.
Installation 2: configurations optionnelles
La
.config
que nous avons généré avec./ct-ng x86_64-unknown-linux-gnu
a:De changer cela, en
menuconfig
faire:C-library
Version of glibc
enregistrer le
.config
, et de continuer à la construire.Ou, si vous souhaitez utiliser votre propre glibc source, par exemple à l'utilisation de la glibc depuis la dernière git, procéder comme ceci:
Paths and misc options
Try features marked as EXPERIMENTAL
: trueC-library
Source of glibc
Custom location
: dire ouiCustom location
Custom source location
: pointer vers un répertoire contenant votre version de la glibc sourceoù la glibc a été cloné comme:
Installation 2: tester
Une fois que vous avez construit il de la chaîne que vous voulez, faites le test avec:
Tout semble fonctionner que dans la Configuration 1, sauf que maintenant la bonne exécution des objets ont été utilisés:
Setup 2: échec efficace de la glibc recompilation tentative
Il ne semble pas possible avec crosstool-NG, comme expliqué ci-dessous.
Si vous venez de re-construire;
ensuite vos modifications à la coutume de la glibc l'emplacement de la source sont pris en compte, mais il s'appuie tout à partir de zéro, la rendant inutilisable pour le développement itératif.
Si nous n':
il donne une belle vue d'ensemble de la construction suit:
par conséquent, nous voyons qu'il y a de la glibc étapes confond avec GCC plusieurs étapes, notamment
libc_start_files
vient avantcc_core_pass_2
, qui est probablement le plus cher de l'étape aveccc_core_pass_1
.Dans le but de construire une seule étape, vous devez d'abord choisir l'option "Enregistrer les étapes intermédiaires" dans
.config
option pour le intial construire:Paths and misc options
Debug crosstool-NG
Save intermediate steps
et vous pouvez essayer:
mais malheureusement, la
+
requis comme mentionné au: https://github.com/crosstool-ng/crosstool-ng/issues/1033#issuecomment-424877536et fondamentalement encore fait le reconstruire trop lent pour être réalisable pour le développement, et je ne vois pas comment surmonter ce sans avoir à crosstool-NG.
En outre, à partir de la
libc
étape ne semble pas copier la source à nouveau à partir deCustom source location
, faisant encore cette méthode inutilisable.Bonus: stdlibc++
Un bonus si vous êtes également intéressé par le C++ standard library: Comment modifier et re-construction de la GCC libstdc++ C++ standard library source?