rt-thread
rt-thread copied to clipboard
aarch64-gcc编译,rt_memset等函数编译问题
在kservice.c中,提供了rt_memset等标准库函数的等价实现,很方便移植到无libc的平台上。但是gcc似乎并不领情: 在rt_memset末尾有一段针对非对齐地址的逐字节拷贝:
while (count--)
{
*m++ = (char)d;
}
用gcc -O2编译这段代码时,生成了这样的汇编:
其直接调用了memset这个符号,但是当然,这个符号是未定义的。
建议解决方案:
- 使用gcc编译kservice.c文件时,默认加上编译选项-fno-tree-loop-distribute-patterns来阻止编译器自动生成memset等函数调用
或者:
- 在每个CPU平台上分别使用汇编实现memset等函数,并相应定义为rt_memset的别名/宏定义/嵌套调用
使用Segger Embeded Studio GCC编译RISC-V平台代码,同样出现过类似这个问题,默认编译选项-fno-tree-loop-distribute-patterns
的方式,学习了!