Это должно произойти «автоматически», пока поддерживаются настройки вашего libc и linker. Вы не сказали, что такое ваша платформа, так here is one where it does work.
Итак, давайте создадим глупый пример, используя 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;
}
попытка собрать и связать его
$ 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
Необходимо _sbrk
потому newlib *printf
функции используют malloc
, который необходим способ выделения системной памяти. Давайте дадим ему манекен.
/*
* sbrk.c
*/
#include <stdint.h>
#include <unistd.h>
void *_sbrk(intptr_t increment) {
return 0;
}
и скомпилировать его
$ $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
Ну, вот почему вы хотите, чтобы избавиться от printf
и друзей, не так ли? Теперь, замените snprintf
с нашей функцией
/*
* replace.c
*/
#include <stdio.h>
#include <string.h>
int snprintf(char *str, size_t size, const char *format, ...) {
return strlen(format);
}
затем компилировать
$ $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
Обратите внимание, что мы не использовали _sbrk
заглушки на всех. Если вы не указали _sbrk
, вы можете быть уверены, что malloc
не является (не может быть) связан и используется.
[родственный вопрос] (http://stackoverflow.com/questions/29391965/what-is-partial-linking-in-gnu-linker) и [другой связанный вопрос] (http://stackoverflow.com/questions/270984/g-partial-linking-in-archives) – Kenney
Возможный дубликат [Как заменить функцию стандартной библиотеки C?] (Http://stackoverflow.com/questions/9107259/how-to-replace-c- стандартная библиотека-функция) –
Я не рассматриваю это как дубликат, так как мой вопрос: «Могу я сказать компоновщику использовать только подмножество символов из библиотеки», а не «могу ли я заменить эту конкретную функцию.«Основное различие заключается в том, что в моем вопросе компоновщик должен исправить ошибку, если используется символ, который не был явно указан из библиотеки. – FazJaxton