gcc源代码中定义的gcvt或gcvtf在哪里?

gcc源代码中定义的gcvt或gcvtf在哪里?,gcc,embedded,Gcc,Embedded,我正在为m68k目标上的嵌入式系统编写一些旧的源代码,有时调用gcvtf格式化浮点数以供显示时,我会看到大量内存分配请求。我可能可以通过编写自己的替换例程来解决这个问题,但错误的性质让我非常好奇,因为它只在堆开始于某个地址或高于某个地址时发生,如果我破解.ld链接器脚本或删除任何一组全局变量(在内存映射中放在堆之前),它就会消失这将增加足够的字节大小,以便堆从神秘的关键地址以下开始 因此,我想在gcc源代码中查找我正在使用的编译器版本(m68k elf gcc 3.3.2)。我在下载了这个版本的

我正在为m68k目标上的嵌入式系统编写一些旧的源代码,有时调用
gcvtf
格式化浮点数以供显示时,我会看到大量内存分配请求。我可能可以通过编写自己的替换例程来解决这个问题,但错误的性质让我非常好奇,因为它只在堆开始于某个地址或高于某个地址时发生,如果我破解.ld链接器脚本或删除任何一组全局变量(在内存映射中放在堆之前),它就会消失这将增加足够的字节大小,以便堆从神秘的关键地址以下开始

因此,我想在gcc源代码中查找我正在使用的编译器版本(m68k elf 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,正如我所说的,我可以通过编写自己的格式化例程来解决此问题,但这种行为让我非常困惑,如果我不知道它为什么表现得如此怪异,它会折磨我的大脑。

它作为glibc/misc/efgcvt.C在GNU 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的说明如下。

Wallyk是正确的,它是在C库而不是编译器中定义的。然而,GNUC库(几乎总是)只用于Linux编译器和发行版。作为一个“裸机”编译器,您的编译器几乎肯定会使用newlibc库

Newlib的主要网站在这里:,这个特殊的功能在
Newlib/libc/stdlib/efgcvt.c
文件中定义。源代码已经相当稳定很长一段时间了,所以(除非这是一个bug的结果)当前源代码与编译器使用的代码没有太大差异的可能性是相当大的


与GNU C源代码一样,我没有看到任何明显会导致您看到的这种奇怪的东西,但最终都是围绕基本
sprintf
例程的一堆包装器。

谢谢!当然,这并不能解释堆分配的奇怪性。哦,好吧,现在我将把我的好奇心放在次要位置,并在项目完成后进一步研究。正如我在回答中指出的,GNU C将是Linux编译器的正确答案,但这似乎是一个裸机编译器(根据目标中的“-elf-”),因此将使用Newlib。谢谢!我找到了我正在使用的newlib版本(1.11.0)的源代码,gcvt实际上调用了一个函数_dtoa_r,它调用了一些分配函数。我很确定奇怪的行为就在那里。