Comment éviter STT_GNU_IFUNC des symboles dans le binaire?
J'ai besoin de déployer sur une Red Hat 4.1.2 zone (qui a gcc 4.1.2). J'utilise GCC 4.6.1 sur Ubuntu 11.10 pour le développement. Malheureusement, certains binaires que mon processus de construction crée ne sont pas utilisables sur la RedHat machine. La raison semble être un ABI changement, qui selon une autre question Stackoverflow le résultat de l'introduction de STT_GNU_IFUNC symboles. Est-il possible d'empêcher l'exportation de ces symboles, de sorte que mon binaires pouvez utiliser la vieille ABI? J'ai utilisé nm à regarder pour tous les symboles du "je" de type sur mon binaire, mais n'en trouva aucun.
Je pose cette question car certains de mes autres fichiers binaires ainsi que quelques-3e partie libs-je construire (tbb, boost) ne sont pas à l'aide de la nouvelle ABI et donc à fonctionner correctement sur la machine RedHat.
Espère que c'est clair. Merci à l'avance.
OriginalL'auteur samwise | 2012-01-12
Vous devez vous connecter pour publier un commentaire.
En général, les systèmes UNIX support arrière de la compatibilité binaire (un binaire construit sur une ancienne machine continue de fonctionner sur une version plus récente), mais pas l'inverse. Vous ne pouvez pas s'attendre à un binaire construit sur un nouveau système pour fonctionner sur une version plus ancienne.
STT_GNU_IFUNC
n'est que le première de nombreux problèmes que vous allez rencontrer.Si vous avez besoin de créer un fichier binaire sur une machine plus récente qui sera exécuté sur une ancienne, voir cette document.
- Il, "apgcc: GCC wrapper pour le rendre portable binaires" qui fait cela facile (il est référencé à partir de ci-dessus), mais il semble avoir disparu ;-(
L'option la plus facile est de construire sur une vieille machine (j'ai utilisé pour construire sur RedHat 6.2, et le binaire résultant couru partout). Vous n'avez pas à exécuter RH 6.2 sur une machine physique, il suffit de le mettre dans une machine virtuelle.
L'autre option est relativement facile à construire dans un
chroot
, de nouveau à l'aide d'outils et de bibliothèques à partir d'un vieux de la distribution (par exemple, RH 6.2).Vous habituellement construire une nouvelle Python et GCC sur une vieille machine, puis de l'utilisateur. La version de GCC n'a pas beaucoup d'importance pour la portabilité de la bibliothèque qui en résulte; seule la version de la glibc.
vous avez marqué ma question comme un doublon (stackoverflow.com/questions/54532815/...) pour cette question, il ne l'est pas. Veuillez supprimer le bouton [dupliquer] marque ou d'envisager une réponse appropriée.
OriginalL'auteur Employed Russian
Cross-compilation pour un vieux linux peut être très difficile, et ce n'est qu'un des nombreux problèmes que vous rencontrerez.
Cela dit, l'ABI compatibilité problème peut être résolu par l'ajout d'
-Wl,-fno-jump-tables
.OriginalL'auteur Adam Azarchs
Comme APGCC ne semble plus disponible. Ces glibc-têtes semble être actuellement le moyen le plus pratique pour générer portable binaires Linux à partir d'un code C en incluant l'un des plus anciens fichiers d'en-tête.
OriginalL'auteur JSchmitty