Предоставление реализации `malloc` для` newlib-nano` - PullRequest
1 голос
/ 01 февраля 2020

Я хотел бы предоставить реализацию malloc для newlib-nano при использовании его с gcc. В моей ситуации у меня есть некоторый исходный файл, скажем main.c, который вызывает strftime. В newlib-nano реализации strftime используется malloc. В заголовочном файле my_memory.h я объявил функцию void *malloc(size_t size) и предоставил реализацию в соответствующем файле my_memory.c.

При связывании проекта с использованием gcc компоновщик завершается с ошибкой .../libc_nano.a(liba-malloc.o) из-за нескольких определений malloc. Я хотел бы, чтобы компоновщик взял мою реализацию malloc вместо того, чтобы извлекать newlib-nano, но сохранил использование newlib-nano реализации других функций стандартной библиотеки, например memset.

Я искал вариант «исключить объектный файл из stati c library» в g cc, чтобы попытаться исключить libc_nano.a(liba-malloc.o), но безуспешно. Обратите внимание, что компилятор извлекает этот объектный файл, и у меня нет доступа к libc_nano.a компилятора для исправления liba-malloc.o с моим собственным объектным файлом.

В любом случае, я что-то упускаю или не получается достичь того, чего я пытаюсь достичь?

1 Ответ

1 голос
/ 01 февраля 2020

Вероятно liba-malloc.o содержит другие определения функций распределителя, такие как calloc, free, realloc и т. Д. c. и таким образом втягивается для ссылки из-за ссылок на один из них. Вы можете увидеть это с помощью опции -t для ld (передайте -Wl,-t в командной строке gcc при связывании, чтобы использовать его). Если это так, вы можете избежать его связывания, просто убедившись, что вы сами дали определения всех этих функций.

Лучшей идеей может быть избавление от зависимости malloc с помощью другого strftime. Для strftime, особенно для встраиваемой реализации, довольно нелепо вызывать malloc; в этом нет фундаментальной необходимости, и я несколько озадачен тем, как они нашли способ сделать malloc полезным для него. Помимо некоторого t ie -in с локалией, которая может быть довольно легко извлечена, musl lib c '* strftime.c (раскрытие: author = me) очень автономна и, вероятно, может служить в качестве замены для замены.

...