2011-10-23 2 views
7

La question est relativement simple: comment puis-je construire un GCC de la série 4.x (avec binutils et amis) qui cible un ABI 2.4 sur la même architecture que l'hôte pour le compilateur?Construire GCC moderne (4.x) pour cibler un noyau 2.4.x sur la même architecture que l'hôte?

Le système hôte serait x86 ou x86_64 et la seule exigence est que les fichiers ELF construits s'exécutent sur un ancien noyau tant que l'ABI correspond. (Il existe des sources/en-têtes de noyau)

Une libc compatible serait également nécessaire afin de la lier. Cependant, je peux aussi lier dynamiquement à cela, puisque je connais la version (g) libc.

Tous les pointeurs seraient très appréciés. Je suis un peu familier avec crosstool-ng, mais cela ne semble même plus supporter les noyaux 2.4 (pour des raisons évidentes).

+2

En termes techniques, il cherche à comprendre comment cibler un ABI inférieur à ceux utilisés par la plupart des distributions modernes, et d'obtenir un section correspondante .note.ABI-tag du binaire ELF. Je ne trouve aucune information à ce sujet sur le Web, alors je suppose que c'est une demande assez spécialisée. Vous voulez peut-être envoyer un courriel à la liste de diffusion [email protected] –

+0

@Ken Bloom: merci. Bonne idée. En effet, je ne pouvais pas trouver de pointeurs moi-même, donc j'ai pensé que je demanderais ici :) – 0xC0000022L

Répondre

1

Probablement le moyen le plus simple consiste à installer une chaîne d'outils moderne sur un ancien système d'exploitation. RHEL 2.1 ou 3 pourrait être le meilleur, car ils étaient supportés jusqu'à récemment.

La compilation de gcc 4 peut être difficile car vous aurez aussi besoin de bibliothèques de maths. Vous devrez peut-être faire une approche en plusieurs étapes.

EDIT:

Pour la compilation plus récente gcc:

  1. Compile dernière marque - ajouter à PATH
  2. Déballez gcc
  3. Déballez mpfr, gmp, mpc dans le répertoire gcc
  4. symlink les répertoires versionnés vers la base (mpfr, gmp, mpc).
  5. Construire et installer gcc

Quelque chose comme ceci:

cd ~/software 
tar xjf $DOWNLOAD/gcc/gcc-core-${GCCVER}.tar.bz2 || failure "unpack gcc failed" 
tar xjf $DOWNLOAD/gcc/gcc-g++-${GCCVER}.tar.bz2 || failure "unpack g++ failed" 

cd gcc-${GCCVER} 

tar xjf $DOWNLOAD/gmp-5.0.2.tar.bz2 || failure "unpack gmp failed" 
#tar xjf $DOWNLOAD/gmp-4.3.2.tar.bz2 || failure "unpack gmp failed" 
ln -s gmp-* gmp 
tar xjf $DOWNLOAD/mpfr-2.4.2.tar.bz2 || failure "unpack mpfr failed" 
#tar xjf $DOWNLOAD/mpfr-2.4.2.tar.bz2 || failure "unpack mpfr failed" 
ln -s mpfr-* mpfr 
tar xzf $DOWNLOAD/mpc-0.9.tar.gz || failure "unpack mpc failed" 
ln -s mpc-* mpc 

cd .. 
mkdir gcc-build 
cd gcc-build 
../gcc-${GCCVER}/configure --prefix=/opt/tools || failure "configure failed" 
make || failure "make failed" 
make install || failure "install failed" 
+0

Malheureusement, cela semble être la seule option à gauche. – 0xC0000022L

0

Je crois que vous devriez probablement construire un compilateur croisé GCC dans ce cas, et que vous devriez compiler GLibc qui gèrerait la dépendance à l'ancien noyau 2.4.

Cependant, avez-vous simplement essayé de compiler votre code, et simplement le lier avec l'ancienne bibliothèque Glibc compatible avec le noyau 2.4? Je suppose que cela devrait fonctionner. Et avez-vous essayé d'exécuter votre binaire (obtenu de façon simple sur un système récent en utilisant son récent GCC) sur l'ancien système? Qu'est-ce qui ne fonctionne pas comme prévu?

Cordialement.

+0

Le binaire construit, lorsqu'il est lancé, va lancer une erreur que le noyau est trop vieux. Ou plutôt le chargeur le fera. – 0xC0000022L

Questions connexes