小虫,最近在做RTOS底层移植,在程序调试过程中发现,printf 面目全非!?不见了!赶紧打开汇编code查看一番,没错就是最简单的 hello world, 可是你真的了解hello world吗?
首先公布答案:这一波操作是因为gcc编译优化导致的:在打印简单字符串时,puts比printf更高效,这是优化场景之一。
因为在gcc内部设定了若干条优化规则,当满足这些规则时,gcc将帮助你做代码优化函数替换,来达到较高的运行效率。而且这个转化是汇编级的不可逆的,即使单步调试,也将进入到puts中
如果真的需要printf保留原始可通过增加编译选项去除该优化: -fno-builtin-printf / -ffreestanding 具体选项含义参见官方链接:https://gcc.gnu.org/onlinedocs/gcc/Option-Index.html#Option-Index
![a3ac5ab4fefc5c1beaefb22603c4808d.png](https://i-blog.csdnimg.cn/blog_migrate/6bc9d6d271aedd7e117b161265e5d9d3.png)
最后奉上我查到的最好的资料
http://www.ciselant.de/projects/gcc_printf/gcc_printf.htmlwww.ciselant.de https://www.coder.work/article/1543152www.coder.work