打印
[生态工具]

keil开发:如何让所需函数不被优化?

[复制链接]
268|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
houjiakai|  楼主 | 2023-4-23 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不管是使用gcc还是keil自带的armcc或者armclang进行开发的时候,会遇到一个问题,就是:编译器有时会把我想要用到的函数给优化掉,导致运行时的错误,或者不正常执行。

为什么会这样呢?则是因为,编译器认为,我们的程序没有调用该接口,因此在链接阶段,就不会把该函数链接进去。但,这会产生问题。

实例
比如:


void (*vtable)();          //函数指针



vtable = (void (*)()) (0x08000000);//定位到指定的入口地址0x08000000



(*vtable)();//假如地址0x08000000放的是entry函数,则调用entry()函数

这样编写代码的目的是为了在(*vtable)();处调用entry()函数,但编译器并不知道开发者的意图,仍会按照自己的逻辑把entry()优化掉,因为它认为该函数并未被调用,则在链接阶段,就不会把该函数链接进去。

因此,当执行(*vtable)();时,里面的内容则不是entry()的代码了,可能产生不可预知的错误。

那,我们可以告诉编译器不要去优化entry()这个函数吗?可以的,这时我们可以使用链接器命令:--keep=section_id 此选项保证在删除未使用节时,不能删除指定的输入节。

链接参数
如何让所需函数不被优化?使用:--keep=section_id!怎么使用?举例说明:

我们可以使用--keep=int_handler,来保留int_handler这个节
如果需要保留定义以 _handler 结尾的所有节,可以使用通配符,--keep=*_handler
如果需要缩小范围,只保留某一个目标文件里的section,则可以这样:--keep=vectors.o(*_handler)
如果需要保留所有的节信息,则可以:--keep=*
最后,这个链接参数放在哪里呢?见下图:



使用特权

评论回复
沙发
zhuotuzi| | 2023-4-23 14:11 | 只看该作者
关闭优化功能是不是也可以。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

191

主题

6022

帖子

5

粉丝