Cela devrait se faire "automatiquement" tant que votre configuration de libc et de linker le supporte. Vous n'avez pas dit quelle est votre plateforme, donc here is one where it does work. Donc, créons un exemple stupide en utilisant snprintf.
/*
* main.c
*/
#include <stdio.h>
int main(int argc, char **argv) {
char l[100];
snprintf(l, 100, "%s %d\n", argv[0], argc);
return 0;
}
essayer de compiler et de le lier
$ CC=/opt/gcc-arm-none-eabi-4_7-2013q3/bin/arm-none-eabi-gcc
$ CFLAGS="-mcpu=arm926ej-s -Wall -Wextra -O6"
$ LDFLAGS="-nostartfiles -L. -Wl,--gc-sections,-emain"
$ $CC $CFLAGS -c main.c -o main.o
$ $CC $LDFLAGS main.o -o example
/opt/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/lib/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0x18): undefined reference to `_sbrk'
collect2: error: ld returned 1 exit status
Il a besoin _sbrk
parce newlib *printf
fonctions utilisent malloc
qui a besoin d'un moyen d'allouer de la mémoire du système. Donnons-lui un mannequin.
/*
* sbrk.c
*/
#include <stdint.h>
#include <unistd.h>
void *_sbrk(intptr_t increment) {
return 0;
}
et compiler
$ $CC $CFLAGS -c sbrk.c -o sbrk.o
$ $CC $LDFLAGS -Wl,-Map,"sbrk.map" main.o sbrk.o -o with-sbrk
$ /opt/gcc-arm-none-eabi-4_7-2013q3/bin/arm-none-eabi-size with-sbrk
text data bss dec hex filename
28956 2164 56 31176 79c8 with-sbrk
Eh bien, c'est la raison pour laquelle vous souhaitez vous débarrasser de printf
et les amis, est-ce pas? Maintenant, remplacez snprintf
avec notre fonction
/*
* replace.c
*/
#include <stdio.h>
#include <string.h>
int snprintf(char *str, size_t size, const char *format, ...) {
return strlen(format);
}
compilez
$ $CC $CFLAGS -c replace.c -o replace.o
$ $CC $LDFLAGS -Wl,-Map,"replace.map" main.o replace.o -o with-replace
$ /opt/gcc-arm-none-eabi-4_7-2013q3/bin/arm-none-eabi-size with-sbrk
text data bss dec hex filename
180 0 0 180 b4 with-replace
Notez que nous n'avons pas utilisé le talon _sbrk
du tout. Tant que vous ne fournissez pas _sbrk
, vous pouvez être sûr que malloc
n'est pas (ne peut pas être) lié et utilisé.
[question connexe] (http://stackoverflow.com/questions/29391965/what-is-partial-linking-in-gnu-linker) et [une autre question connexe] (http://stackoverflow.com/questions/270984/g-partial-linking -file-of-archives) – Kenney
Copie possible de [Comment remplacer la fonction de bibliothèque standard C?] (Http://stackoverflow.com/questions/9107259/how-to-replace-c- standard-library-function) –
Je ne considère pas cela comme un doublon, car ma question est "puis-je dire à l'éditeur de liens d'utiliser uniquement un sous-ensemble de symboles d'une bibliothèque" et non "puis-je remplacer cette fonction spécifique."La principale différence est que dans ma question, l'éditeur de liens devrait renflouer avec une erreur si un symbole qui n'a pas été explicitement nommé à partir de la bibliothèque est utilisé – FazJaxton