В чистом проекте C/C++ я использую gcc-arm-embedded (в настоящее время наиболее недавнее 4.9-2015-q2).
По некоторым причинам я должен избегать использования некоторых функций, таких как некоторые из stdio и так далее (не хочу использовать ретаргетинг или полухостинг).
Кроме того, я использую FreeRtos с heap_4.c и, например, malloc()
перенаправлено непосредственно на pvPortMalloc()
следующим образом:
void* malloc(size_t s) {
return pvPortMalloc(s);
}
Поэтому я не хочу, чтобы какие-либо части кода управления кучей набора инструментов находились в моем двоичном файле.
Теперь есть некоторые ситуации, когда разработчик моей команды может использовать, например. printf()
, который косвенно ссылается на _malloc_r()
(и некоторые другие), и на самом деле довольно сложно выяснить, откуда на него ссылаются и где его исправить.
(Использование printf()
здесь просто в качестве примера. В моем проекте у меня есть собственная реализация printf(), которая печатает напрямую в uart без использования stdio. Но есть и другие случаи, например, удаление информации о типах, …)
В настоящее время у меня сложилась ситуация, когда мой проект (который состоит примерно из 200 исходных файлов c и c++) хорошо компилируется без какой-либо ссылки на _malloc_r()
, если я строю с gcc 4.8.
Но при сборке с gcc 4.9 я вижу нежелательные ссылки на _malloc_r
и некоторые другие.
Может ли быть инструмент командной строки для анализа моего файла elf, чтобы узнать, откуда ссылаются на определенные функции?
Редактировать 20.07.2015:
- Наконец, я решил основную проблему, заключающуюся в том, что мне нужно собрать весь проект с помощью gcc 4.9 без ссылок на
_malloc_r
внутри моего кода. - Некоторые ссылки я нашел, применив этот ответ.
Далее я узнаю, что есть
__gnu_cxx::__snprintf_lite()
, который ссылается на полноценныйiostream
, который мне не нужен в моем коде. Этот__gnu_cxx::__snprintf_lite()
используется некоторыми исключениями реализацииgcc
stl
(например, на которые ссылается__throw_out_of_range_fmt()
). (Да, мой код используетstd::map
). Мой способ избавиться отiostream
заключался в том, чтобы просто предоставить свой собственный__gnu_cxx::__snprintf_lite()
следующим образом (имея собственный небольшой следvsnprintf
):namespace __gnu_cxx { int __snprintf_lite(char* buf, size_t bufsize, const char* fmt, va_list ap) { return vsnprintf(buf, bufsize, fmt, ap); } }
Это можно проверить, просмотрев исходники библиотеки gcc-4.9 (например,
src/gcc/libstdc++-v3/src/c++11/snprintf_lite.cc
).
_malloc_r
. - person Joe   schedule 27.06.2015objdump -d
для дизассемблирования всех исполняемых разделов и перенаправления вывода в файл и поиска в нем_malloc_r
с помощью текстового редактора. - person 4566976   schedule 27.06.2015