82 votes

Compiler sans libc

Je veux compiler mon code C sans la (g) libc. Comment puis-je le désactiver et quelles fonctions en dépendent?

J'ai essayé -nostdlib mais cela n'aide pas: le code est compilable et s'exécute, mais je peux toujours trouver le nom de la libc dans le hexdump de mon exécutable.

102voto

ataylor Points 31154

Si vous compilez votre code avec -nostdlib, vous ne serez pas en mesure d'appeler les fonctions de la bibliothèque C (bien sûr), mais vous pouvez aussi ne pas obtenir de l'ordinaire C le code de démarrage. En particulier, le véritable point d'entrée d'un programme sur linux n'est pas de main(), mais plutôt une fonction appelée _start(). Les bibliothèques standard fournissent normalement une version de ce que comporte le code d'initialisation, puis appelle la fonction main().

Essayez de compiler avec gcc -nostdlib:

void _start() {
    /* exit system call */
    asm("movl $1,%eax;"
        "xorl %ebx,%ebx;"
        "int  $0x80"
    );
}

Le _start() la fonction doit toujours se terminer par un appel à exit (ou d'autres non-retour de l'appel système comme exec). L'exemple ci-dessus appelle le système de l'appeler directement en ligne de l'assemblée puisque, la plupart exit() n'est pas disponible.

16voto

Adam Shiemke Points 2791

http://blog.ksplice.com/2010/03/libc-free-world/ a une très bonne description du contrôle précis de la sortie programmatique du gcc.

Edit: Ils (ksplice) viennent de publier la partie 2 du tutoriel / guide ci-dessus. Voir ici: http://blog.ksplice.com/2010/04/libc-free-world-2/ Cela concerne principalement les paramètres de l'éditeur de liens pour supprimer les peluches inutiles des fichiers.

13voto

Thomas Pornin Points 36984

La façon la plus simple est de compiler le code C pour les fichiers objets (gcc -c pour obtenir quelques *.o fichiers) et de les lier directement avec l'éditeur de liens (ld). Vous devez lier vos fichiers objets avec un supplément de quelques fichiers d'objets tels que /usr/lib/crt1.o afin d'obtenir un exécutable (entre le point d'entrée, comme on le voit par le noyau, et l' main() de la fonction, il y a un peu de travail à faire). À savoir que lien avec, essayer en lien avec la glibc, à l'aide de gcc -v: cela devrait vous montrer ce qui est normalement inclus dans l'exécutable.

Vous trouverez gcc génère du code qui peuvent avoir des dépendances à quelques fonctions cachées. La plupart d'entre eux sont en libgcc.a. Il peut également être caché appels d' memcpy(), memmove(), memset() et memcmp(), qui sont dans la libc, de sorte que vous devrez peut-être fournir votre propre version (qui n'est pas dur, au moins aussi longtemps que vous n'êtes pas trop pointilleux sur la performance).

Choses pourraient obtenir plus claire à la fois, si vous regardez les produits de l'assemblée (utiliser l' -S drapeau).

9voto

Michał Trybus Points 5113

Voici un excellent article sur l'optimisation des binaires elf qui couvre la suppression de stdlib des exécutables: Un tutoriel Whirlwind sur la création d'exécutables ELF vraiment Teensy pour Linux

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X