GCC - 如何停止链接 malloc?
GCC - How to stop malloc being linked?
我正在努力将我的代码缩减到最小的骨架大小!我正在使用只有 32k 闪存的 STM32F0,并且需要闪存的很大一部分用于数据存储。我的代码已经有大约 20k 闪存大小了!其中一些是由于使用了 STM32 HAL 函数,如果需要,我可以稍后进行解释和优化。
但是,我最大的闪存消耗者是所有隐式包含的库例程。我似乎无法删除这些功能。它们不会在我的代码或任何 HAL 代码中的任何地方被调用。 _malloc_r(1.3k 字节)和__vfiprintf_r(3kB)等函数以及许多其他函数占用了我闪存的很大一部分。我认为这些都是 libc 的功能。我不使用这些,希望它们消失!
有人知道如何删除这些吗?
我已经尝试了不同的优化级别和链接器选项,但到目前为止没有成功。我试过 -nostdlib 和 --specs=nosys.specs 没有改变。如果我删除包含 _exit 等函数定义的文件,我会收到一个链接器错误,提示该库仍包含在内并且需要这些。链接器映射也确认存在很多不需要的函数!
有什么建议吗?
已解决...我的一些代码包含并调用了断言。在我删除 assert 调用的那一刻,我的代码大小减少了一半以上!我改为使用 STM32 HALs assert_param 宏,它是一个轻量级断言,仅重定向到用户定义的函数。
如果有人可以向我解释 gcc 如何决定在调用 assert 时包含库函数,那将会很有帮助?我看到 assert.h 声明了一个外部函数 __assert_func。链接器如何知道从库中引用它而不是仅仅说 "undefined reference to __asert_func"?
当您想知道什么需要 space,或者为什么链接函数和库时,生成一个带有交叉引用的映射文件 - 类似于“-Wl,-Map=program.map ,--cref”。用文本编辑器查看文件,你会明白为什么包含了像malloc这样的函数。
我正在努力将我的代码缩减到最小的骨架大小!我正在使用只有 32k 闪存的 STM32F0,并且需要闪存的很大一部分用于数据存储。我的代码已经有大约 20k 闪存大小了!其中一些是由于使用了 STM32 HAL 函数,如果需要,我可以稍后进行解释和优化。
但是,我最大的闪存消耗者是所有隐式包含的库例程。我似乎无法删除这些功能。它们不会在我的代码或任何 HAL 代码中的任何地方被调用。 _malloc_r(1.3k 字节)和__vfiprintf_r(3kB)等函数以及许多其他函数占用了我闪存的很大一部分。我认为这些都是 libc 的功能。我不使用这些,希望它们消失!
有人知道如何删除这些吗?
我已经尝试了不同的优化级别和链接器选项,但到目前为止没有成功。我试过 -nostdlib 和 --specs=nosys.specs 没有改变。如果我删除包含 _exit 等函数定义的文件,我会收到一个链接器错误,提示该库仍包含在内并且需要这些。链接器映射也确认存在很多不需要的函数!
有什么建议吗?
已解决...我的一些代码包含并调用了断言。在我删除 assert 调用的那一刻,我的代码大小减少了一半以上!我改为使用 STM32 HALs assert_param 宏,它是一个轻量级断言,仅重定向到用户定义的函数。
如果有人可以向我解释 gcc 如何决定在调用 assert 时包含库函数,那将会很有帮助?我看到 assert.h 声明了一个外部函数 __assert_func。链接器如何知道从库中引用它而不是仅仅说 "undefined reference to __asert_func"?
当您想知道什么需要 space,或者为什么链接函数和库时,生成一个带有交叉引用的映射文件 - 类似于“-Wl,-Map=program.map ,--cref”。用文本编辑器查看文件,你会明白为什么包含了像malloc这样的函数。