2010-08-15 3 views
3

J'ai une base de dispositif de pare-feu sur linux qui a glibc-2.3.4, et je n'ai pas gcc pour compiler un programme pour cela. quand je compile un programme par une autre machine Linux, un message d'erreur dit:Compilez le programme C sous Linux avec une librairie glibc différente

nécessitent glibc.x.x.x

Comment puis-je compiler un programme c dans une autre machine linux pour cette version de glibc?

+0

[Il existe une question similaire] (http://stackoverflow.com/questions/2071325/relink-a-shared-library-to-a -different-version-of-libc). –

Répondre

1

L'outil apbuild-apgcc définit les éléments à lier par rapport aux anciennes versions des symboles de la glibc.

+0

c'est une très bonne réponse, mais je veux utiliser inotify qu'il est dans le noyau 2.6.13 et plus tard, mais avec apgcc je peux, t l'utiliser. – hamSh

1

Généralement, vous devez utiliser l'environnement de construction approprié qui contient toutes les bibliothèques cibles avec les versions nécessaires ou compatibles. La différence entre les variantes libc n'est pas seulement dans le nom de la bibliothèque liée elle-même. Par exemple, les fichiers de configuration requis peuvent différer. Certaines interfaces peuvent être fournies avec des wrappers en ligne au niveau de l'en-tête qui ont muté entre les versions. Il est généralement sûr d'exécuter un binaire avec une version de bibliothèque plus récente, mais pas avec une version plus ancienne. Mais, si vous avez un paquet de développement de la libc cible installé en plus sur votre système, vous pouvez construire un binaire directement avec lui en utilisant les commutateurs -nostdinc et -nostdlib (ou appelez un éditeur de liens explicitement) et en spécifiant explicitement les bibliothèques requises . L'exemple pourrait être obtenu à partir de gcc -v sortie. De mon système, il est commande de liaison finale:

 
/usr/bin/ld --eh-frame-hdr -V -dynamic-linker /libexec/ld-elf.so.1 \ 
    -o t /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtbegin.o \ 
    -L/usr/lib -L/usr/lib /tmp//ccCb5j33.o -lgcc --as-needed -lgcc_s \ 
    --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed \ 
    /usr/lib/crtend.o /usr/lib/crtn.o 

Selon cible libc détails, vous devez remplacer certaines de ces instructions à un autre ceux. En particulier, le démarrage (crt1.o et crti.o), le nettoyage (crtend.o, crtn.o), la libc elle-même (chemin explicite au lieu de -lc) doit être remplacé; facultativement, le même devrait rencontrer le lieur dynamique.

P.S. Je vois que c'est une question trop ancienne, mais il a été réédité tout à l'heure :)

Questions connexes