newlib-nano嵌入式项目中printf转iprintf

newlib-nano printf translates to iprintf in embedded project

我有一个 cortex-m0+ 的嵌入式项目,我想 link 和 newlib-nano 库。我正在学习,事情是如何工作的(你需要为某些功能实现存根等)。我已经成功地创建了一个构建的工作示例。

源代码:

int main(void)
{
  uint32_t i = 0;
  printf("Hello Wordl!");
  while (1)
  {
    i += 1;
  }
}

我很好奇,调用了哪些函数,想看看幕后情况,所以我转储了最终的 elf 文件,令我惊讶的是,代码调用了“iprintf”而不是 printf。

但是,我没能找到 iprintf get 映射到 printf 的位置。我希望在 headers 左右有一些宏,但我找不到它。

任何人都可以解释发生了什么或指导我在哪里可以找到这个“映射”吗?

非常感谢

https://github.com/32bitmicro/newlib-nano-1.0/blob/master/newlib/libc/stdio/printf.c iprintfprintf 的别名:

_EXFUN(iprintf, (const char *, ...)
       _ATTRIBUTE ((alias("printf"))));

nano printf() 没有 floating-point 支持,所以 iprintf() 变体是 相同的功能 而在完整的 Newlib 中,它们将是不同的实现。

因为它们引用相同的实现,所以您的 elf 转储是否发出 iprintfprintf 作为匹配符号可能是任意的,并且可能是 non-deterministic - 这是关于链接器符号 table 是如何形成的,也许 objdumpnm 的行为无论您使用什么。它们只是同一事物的不同名称。