Где gcvt или gcvtf определены в исходном коде gcc? - PullRequest
3 голосов
/ 30 сентября 2011

Я работаю над некоторым старым исходным кодом для встроенной системы на цели m68k, и иногда я вижу большие запросы выделения памяти при вызове gcvtf для форматирования числа с плавающей запятой для отображения. Я, вероятно, могу обойти это, написав свою собственную подпрограмму замены, но природа ошибки делает меня очень любопытным, потому что это происходит только тогда, когда куча начинается с определенного адреса или выше, и исчезает, если я взломаю компоновщик .ld Сценарий или удалить любой набор глобальных переменных (которые помещаются перед кучей в моей карте памяти), которые складываются до достаточного размера в байтах, так что куча начинается ниже таинственного критического адреса.

Итак, я подумал, что посмотрю в исходном коде gcc версию используемого компилятора (m68k-elf-gcc 3.3.2). Я загрузил то, что кажется источником для этой версии в http://gcc.petsads.us/releases/gcc-3.3.2/,, но я нигде не могу найти определения для gcvt или gcvtf. Когда я ищу его, grep находит только некоторую документацию и ссылки .h, но не определение:

$ find | xargs grep gcvt
./gcc/doc/gcc.info:     C library functions `ecvt', `fcvt' and `gcvt'.  Given va
lid
./gcc/doc/trouble.texi:library functions @code{ecvt}, @code{fcvt} and @code{gcvt
}.  Given valid
./gcc/sys-protos.h:extern char *                 gcvt(double, int, char *);

Итак, где эта функция определена в исходном коде? Или я скачал совершенно не то?

Я не хочу изменять этот проект для использования самого последнего gcc из-за стабильности проекта и соображений тестирования, и, как я уже сказал, я могу обойти это, написав собственную процедуру форматирования, но это поведение очень запутанное для меня, и это осквернит мой мозг, если я не пойму, почему он так странно себя ведет.

Ответы [ 2 ]

3 голосов
/ 01 октября 2011

Wallyk правильно, что это определено в библиотеке C, а не в компиляторе.Однако библиотека GNU C (почти всегда) используется только с компиляторами и дистрибутивами Linux.Ваш компилятор, будучи "голым металлом", почти наверняка использует вместо этого библиотеку Newlib C.

Основной веб-сайт для Newlib находится здесь: http://sourceware.org/newlib/,, и эта конкретная функция определена в newlib/libc/stdlib/efgcvt.c файл.Исходники были довольно стабильными в течение долгого времени, поэтому (если это не является результатом ошибки) очень высоки шансы, что текущие источники не слишком отличаются от того, что использует ваш компилятор.

Как и в случае сИсточник GNU C, я не вижу там ничего, что, очевидно, могло бы вызвать эту странность, которую вы видите, но в конечном итоге все это куча оберток вокруг основных sprintf подпрограмм.

2 голосов
/ 30 сентября 2011

Он находится в библиотеке GNU C как glibc/misc/efgcvt.c. Чтобы избавить вас от лишних хлопот, код функции:

char *
__APPEND (FUNC_PREFIX, gcvt) (value, ndigit, buf)
     FLOAT_TYPE value;
     int ndigit;
     char *buf;
{
  sprintf (buf, "%.*" FLOAT_FMT_FLAG "g", MIN (ndigit, NDIGIT_MAX), value);
  return buf;
}

Направления для получения glibc здесь .

...