请问CH32V103打开-flto选项后如何避免_write函数被优化掉?

由于RISC-V代码密度低,想尽量压缩代码体积。采取了以下措施:

优化等级-Os体积优化,打开压缩指令RVC,链接器增加了以下选项

--gc-sections --specs=nano.specs --specs=nosys.specs

效果还是不理想,使用-flto选项打开Link-time optimizer以后代码体积减少不少,不过报_write函数找不到。

libg_nano.a(lib_a-writer.o): in function `.L0 ':writer.c:(.text._write_r+0x12): undefined reference to `_write'

看起来是_write函数被优化掉了,这个_write函数是为了使用printf函数实现的,代码中有,不加-flto选项正常。

其它项目都是重写fputc,WCH是重写_write函数,如何在打开-flto选项后如何避免_write函数被优化掉呢?

或者是否还有其它方法可以用来减小代码体积?

同样功能的源代码在ARM上面即使使用速度优化,FLASH空间也十分充足,RISC-V的代码密度还是太拉跨了。

这个问题复现很容易,在CH32V103的EVT中,打开USART_Printf例子,工程设置里面打开-flto选项

先clean,然后build,就会弹出下面的错误提示。

libg_nano.a(lib_a-writer.o): in function `.L0 ':writer.c:(.text._write_r+0x12): undefined reference to `_write'

EVT的代码在debug.c文件中实现了_write函数。


您好,可通过在函数前增加__attribute__((used))语句来避免该函数被优化,具体写法如下图:

130442mnarjugjqpyczgun.png.thumb.jpg



只有登录才能回复,可以选择微信账号登录