难度:★★本文首发于我的嵌入式技术公众号「OneChan」,未经授权禁止转载。如果你同时用过 Keil、IAR 和 GCC 开发 Cortex-M3,一定被一件事折磨过:同一个芯片,三个编译器的启动文件长得完全不一样。Keil 的是startup_stm32f10x_md.s,里面一堆AREA、EXPORT、DCD。IAR 的是startup_stm32f10x_md.s,里面全是SECTION、PUBLIC、DC32。GCC 的启动文件叫startup_stm32f10x_md.S(注意大写 S),写的是.section、.global、.word。你试图把 Keil 的启动文件复制到 GCC 工程里,编译器直接报几十个错,根本认不出那些伪指令。明明是同一个芯片,干的也是同一件事(设置栈、建向量表、调 main),为什么启动文件不能统一?答案藏在三个字里:ABI 差异。今天我们把这个问题拆开,看看不同编译器的启动文件到底差在哪,为什么差,以及——如果你被迫换编译器,应该怎么改。
为什么不同的编译器(Keil/IAR/GCC)启动文件不一样?
难度:★★本文首发于我的嵌入式技术公众号「OneChan」,未经授权禁止转载。如果你同时用过 Keil、IAR 和 GCC 开发 Cortex-M3,一定被一件事折磨过:同一个芯片,三个编译器的启动文件长得完全不一样。Keil 的是startup_stm32f10x_md.s,里面一堆AREA、EXPORT、DCD。IAR 的是startup_stm32f10x_md.s,里面全是SECTION、PUBLIC、DC32。GCC 的启动文件叫startup_stm32f10x_md.S(注意大写 S),写的是.section、.global、.word。你试图把 Keil 的启动文件复制到 GCC 工程里,编译器直接报几十个错,根本认不出那些伪指令。明明是同一个芯片,干的也是同一件事(设置栈、建向量表、调 main),为什么启动文件不能统一?答案藏在三个字里:ABI 差异。今天我们把这个问题拆开,看看不同编译器的启动文件到底差在哪,为什么差,以及——如果你被迫换编译器,应该怎么改。