2010-08-03 26 views
0

J'ai installé GCC 3.4 dans /opt/gcc-3.4, et je l'utilise pour compiler du code hérité qui est incompatible avec GCC 4. signifie également les anciennes versions des bibliothèques standard C (++), binutils et des bibliothèques utilitaires.Comment lier à une version spécifique de la bibliothèque standard (avec gcc)

Cela fonctionne correctement pour certaines bibliothèques, mais échoue lors de la compilation de libtiff, car il récupère les bibliothèques système dans/usr/lib (voir la sortie ci-dessous). Cela peut être un problème d'autotools/configure, mais je ne suis pas sûr. Je ne trouve pas de commutateur de configuration ou de variable d'environnement, et je préfère ne pas modifier mon système /usr/lib/libc.so. Comment s'assure-t-on que le lien vers la bibliothèque standard est dans /opt/gcc-3.4.4/lib, et ignore complètement/lib et/usr/lib?

sortie de make (extrait):

libtool: link: g ++ -shared -nostdlib /usr/lib/crti.o /opt/gcc-3.4.3/lib/gcc/i686-pc -linux-gnu/3.4.3/crtbeginS.o .libs/tif_stream.o -Wl, - archive complète ../port/.libs/libport.a -Wl, - no-whole-archive -Wl, -rpath -Wl,/home/jason/d0src34/prereq/tiff-3.9.4/libtiff/.libs -Wl, -rpath -Wl,/opt/gcc-3.4.3/lib -Wl, -rpath -Wl,/home/jason/d0src34/prereq/usr/lib -Wl, -rpath -Wl,/opt/gcc-3.4.3/lib ../libtiff/.libs/libtiff.so -L/usr/lib/usr/lib/libjpeg.so -lz -L/opt/gcc-3.4.3/lib/gcc/i686-pc-linux-gnu/3.4.3 -L/opt/gcc-3.4.3/lib/gcc/i686-pc-linux-gnu/3.4.3 /../../ .. /opt/gcc-3.4.3/lib/libstdc++.so -L/home/jason/Téléchargements/gcc- 3.4.3/build/i686-pc-linux-gnu/libstdC++ - v3/src -L/home/jason/Téléchargements/gcc-3.4.3/build/i686-pc-linux-gnu/libstdC++ - v3/src/.libs -L/home/jason/Téléchargements/gcc-3.4.3/build/gcc -lm -lc -lgcc_s /opt/gcc-3.4.3/lib/gcc/i686-pc-linux-gnu/3.4.3 /crtendS.o /usr/lib/crtn.o -Wl, -soname -Wl, libtiffxx.so.3 -o .libs/libtiffxx.so.3.9.4

/home/jason/d0src34/prereq/usr/bin/ld: /usr/lib/libc.so: format de fichier non reconnu; traiter comme script éditeur de liens

/home/jason/d0src34/prereq/usr/bin/ld:/usr/lib/libc.so:5: parse error

+0

La page de manuel ld indique: L'éditeur de liens utilise les chemins de recherche suivants pour localiser les bibliothèques partagées requises. (... divers éléments configurables ...) 7. Les répertoires par défaut, normalement/lib et/usr/lib. Donc, peut-être la question est, comment changer les "répertoires par défaut"? Je n'ai trouvé aucune option lors de la configuration de binutils (où réside ld) ... – jdm

Répondre

0

J'ai trouvé un (hackish) répond à ma propre question:

J'ai utilisé binutils 2.15, parce que les versions ultérieures ont une incompatibilité avec GCC 3.4. Dans les versions plus récentes, le format de /usr/lib/libc.so a changé, et les anciens binutils ne peuvent pas l'analyser.

Je temporairement la dernière a commenté la ligne (avec « Groupe »), et mon code compilé:

/* GNU ld script 
    Use the shared library, but some functions are only in 
    the static library, so try that secondarily. */ 
OUTPUT_FORMAT(elf32-i386) 
/* GROUP (/lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED (/lib/ld-linux.so.2)) */ 

Cependant, je ne suis pas vraiment satisfait, puisque je peux à peine dire aux autres personnes qui veulent utiliser le code pour éditer leurs fichiers système. De plus, je ne suis pas sûr si je l'ai lié à la bonne version de la glibc, puisque le système/usr/lib est toujours dans le chemin de recherche, donc je ne peux pas dire avec certitude si les binaires fonctionneront sur d'autres systèmes.