首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换__aeabi_dsub以节省空间(-flto问题)

替换__aeabi_dsub以节省空间(-flto问题)
EN

Stack Overflow用户
提问于 2018-09-20 15:49:29
回答 1查看 1.2K关注 0票数 7

我正试图将大量的代码塞进一个相当小的ARM微控制器中。我已经在尺寸优化方面做了大量的工作,我需要双倍算法,但是__aeabi_ddiv__aeabi_dadd__aeabi_dsub是整个设备上最大的功能之一。

__aeabi_dadd__aeabi_dsub都是1700字节,尽管它们做的工作基本上是相同的(最上面的双字节是符号位)。两个函数都不引用另一个函数。

实际上,我所需要做的就是将__aeabi_dsub替换为:

代码语言:javascript
复制
double __aeabi_dsub(double a, double b) {
  // flip top bit of 64 bit number (the sign bit)
  ((uint32_t*)&b)[1] ^= 0x80000000; // assume little endian
  return a + b;
}

我保存了1700字节--因此翻转第二个参数的符号,然后使用__aeabi_dadd添加它们。

我知道,这可能不是100%兼容IEEE规范,但在这个平台上,我可以这样做,以节省超过1%的可用闪存。

我的问题是,当我添加该函数时,链接器会向undefined reference to __aeabi_dsub抱怨--考虑到导致错误的是定义它的行为,这似乎很奇怪。

这似乎是与链接时间优化(-flto)有关-关闭它意味着它所有的工作完美,但它增加了8k的固件大小,它不再适合在可用的闪存!

那么,当链接时间优化处于活动状态时,我需要做什么来替换内置函数__aeabi_dsub呢?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-11 08:34:56

对我来说,解决方案(如@artless噪声所建议的)是使用 compiler flag。GCC有话要说:

断言编译的目标是独立的环境..。独立的环境是标准库可能不存在的环境,程序启动不一定主要在其中。最明显的例子是操作系统内核。

所以对嵌入式环境来说似乎很有意义.

这增加了大约250个字节到固件大小(大约0.1%),因为我想它停止了编译器利用一些关于内置操作符的假设,但是它确实允许我添加我自己的__aeabi_dsub实现,总共节省了1680字节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52428872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档