如何限制函数在其自己的部分中的可用性

时间:2016-05-12 09:34:21

标签: c gcc optimization ld

我正在使用具有有限且不相交的程序存储器的嵌入式项目。

我遇到一个问题,优化器有时会为case语句创建跳转表,它会调用__switch并在调用后放置一个偏移表。

这个想法是__switch计算表中的偏移量,将其添加到其地址并执行短的相对jmp。

问题是调用__switch函数的case语句可能是0x600xxxxx而_switch是0x80xxxxx,创建的短相对jmp无法返回到0x600xxxxx。

我可以使用脚本来检测这个并使构建失败,我们可以使用if语句而不是case语句来解决。

我想要的是告诉链接器如果距离很远则不使用_switch,即不要从code::_switch调用code2::xx

专有编译器基于gnu gcc 4.7.3。

有什么想法吗?

备选答案可能是在两个部分中生成给定函数(__switch)的副本,以及使优化器选择最接近的方法。

更新

我找到--fno-jump-tables选项,听起来像是一个很好的解决方法。 编译器理解它,但它对生成的代码没有任何影响。 我正在使用LTO,所以链接器可能需要了解它,但是我会退出,将其视为未知选项。

同样-fno-tree-switch-conversion,会更改大量生成的代码,但不会删除我的问题。

0 个答案:

没有答案