10
votes

Comment éviter les symboles STT_GNU_FUNCUNCUNC dans votre binaire?

J'ai besoin de déployer sur une boîte rouge 4.1.2 (qui a GCC 4.1.2). J'utilise GCC 4.6.1 sur Ubuntu 11.10 pour le développement. Malheureusement, certains des fichiers binaires que mon processus de construction ne sont pas utilisables sur la machine RedHat. La raison semble être un changement abi, qui, selon Une autre question Stackoverflow résulte de l'introduction de STT_GNU_IFUNCONCCONCCUM. Existe-t-il un moyen d'éviter d'exporter de tels symboles afin que mon binaire puisse utiliser l'ancien ABI? J'ai utilisé Nm pour rechercher des symboles de type "i" sur mon binaire mais trouvé aucun.

Je pose cela parce que certains de mes autres fichiers binaires ainsi que des tiers libs que je construites (TBB, Boost) n'utilise pas le nouveau ABI et fonctionnent donc bien sur la machine RedHat.

J'espère que c'est clair. Merci d'avance.


0 commentaires

3 Réponses :


10
votes

En général, les systèmes UNIX prennent en charge la compatibilité binaire arrière (un binaire construit sur une ancienne machine continue de fonctionner sur un plus récent), mais pas l'inverse. Vous ne pouvez pas vous attendre à ce qu'un binaire construit sur un nouveau système fonctionne sur un plus ancien. stt_gnu_ifuncununc est seulement le premier de nombreux problèmes que vous rencontrerez.

Si vous avez besoin de construire un binaire sur une machine plus récente qui fonctionnera sur un plus ancien, voir Ce document .

Il y avait "APGCC: un wrapper GCC pour créer des fichiers binaires portables" qui a rendu cela facile (il est référencé d'en haut), mais il semble être parti; - (

L'option la plus simple consiste à construire sur une ancienne machine (je pouvais construire sur RedHat 6.2, et le binaire résultant couru partout ). Vous n'êtes pas obligé d'exécuter RH-6.2 sur une machine physique, faites-le simplement dans une machine virtuelle.

L'autre option relativement facile est de créer dans un chroot , à nouveau à l'aide d'outils et de bibliothèques à partir d'une ancienne distribution (par exemple RH-6.2).


4 commentaires

Merci, c'est ce que je craignais. Le problème est que mon environnement de construction profite des caractéristiques relativement nouvelles de Python et de GCC. Je vais devoir tonifier ça.


Vous êtes généralement peut construire un nouveau Python et GCC sur une ancienne machine, puis les utilisateurs. La version de GCC n'a pas d'importance pour la portabilité de la bibliothèque résultante; Seule la version de Glibc.


@EmployedRussian vous avez marqué ma question en double ( stackoverflow.com / Questions / 54532815 / ... ) à cette question que ce n'est pas le cas. Veuillez supprimer la marque [duplicate] ou envisager une réponse appropriée.


Je me demande la justification de l'utilisation d'un chroot. Pour toutes les fins pratiques, le lien entre les derniers symboles (si nous coupons .SyMVER hors de la discussion) se produit au moment de la liaison (c'est-à-dire lorsque l'exécutable est liée). Cela signifie que vous pouvez aussi bien donner à la liaison un plus ancien libc.so et le pointez-le -rpath-link . Bien que cela provoque des problèmes lorsque vous utilisez des symboles plus récents que disponibles, je pense que nous pouvons convenir que tout le point de cet exercice est de vous limiter aux symboles plus anciens et à un lien dynamique vers une version égale de celles disponibles .



0
votes

La compilation croisée à un plus ancien Linux peut être très difficile, ce n'est qu'un des nombreux problèmes que vous rencontrerez.

Cela dit, le problème de compatibilité ABI peut être résolu en ajoutant -WL, -Fno-saut-tables . .


0 commentaires

1
votes

comme APGCC < / a> ne semble plus disponible (sauf peut-être peut-être ici et ici ). Ces Les en-têtes Glibc semblent être le moyen le plus pratique de générer des binaires Linux portables à partir d'un code C en incluant un des fichiers d'en-tête les plus âgés.


1 commentaires

Avez-vous vérifié que cela fonctionne avec des bibliothèques statiques? C'est-à-dire que les bibliothèques statiques ne contiennent généralement que le nom de la fonction Bare à laquelle ils veulent faire référence. Mais disons que j'ai une bibliothèque statique référençant memcpy et dans mon propre code ( .c fichiers, .s . ..) Je prends soin de dire à l'assembleur de mon désir d'utiliser memcpy@2.2.5 (sur AMD64), les fichiers d'objet de la liberme statique memcpy@2.2.5 ou vont-ils faire référence au nouveau memcpy (ie memcpy@2.14 )?