GCC – 如何阻止malloc被链接?

我正在努力将我的代码缩小到最小的裸骨大小! 我使用的STM32F0只有32k闪存,需要大部分闪存用于数据存储。 我的代码已经有大约20k的闪存大小! 其中一些原因是由于使用了STM32 HALfunction,我可以根据需要对其进行解释和优化。

但是,我最大的flash消费者是所有隐含的库例程。 我似乎无法删除这些function。 它们不会在我的代码或任何HAL代码中的任何位置调用。 诸如_malloc_r(1.3k字节)和__vfiprintf_r(3kB)以及许多其他function正在使用我的闪存的很大一部分。 我认为这些都是libc函数。 我不使用这些并希望它们消失!

有谁知道如何删除这些?

我尝试了不同的优化级别和链接器选项但到目前为止没有运气。 我试过-nostdlib和–specs = nosys.specs没有变化。 如果我删除我的文件与_exit等函数的定义我得到一个链接器错误,表明该库仍然包含在内,需要这些。 链接器映射也确认存在许多不需要的function!

有什么建议?

解决了……我的一些代码包括在内并称为assert。 我删除断言的那一刻调用我的代码大小减半! 我改为使用STM32 HALs assert_param宏,它是一个轻量级断言,只是重定向到用户定义的函数。

如果有人能够向我解释当调用assert时gcc如何决定包含库函数会有所帮助? 我看到assert.h声明了一个外部函数__assert_func。 链接器如何知道从库中引用它而不是仅仅说“未定义引用__asert_func”?

当您想知道什么需要空间,或者为什么链接函数和库时,生成带有交叉引用的映射文件 – 类似于“-Wl,-Map = program.map, – cref”。 使用文本编辑器查看文件,您可以看到为什么包含了像malloc这样的函数。