C语言编译时,全局变量的地址是在什么阶段分配的?

总结一句话:C语言编译时,全局变量的存储地址时什么时候,由谁确定的?
具体问题:
使用IAR集成开发环境发现一个不理解的问题: IAR中有个链接文件Linker configuration file,其内容是定义所用MCU的FLASH,RAM等地址空间,并将其分配为项目需要的堆/栈/静态存储区等等空间。 因为名字是“链接文件”,所以我认为其是在“链接”阶段生效(预处理->编译->汇编->链接)。

那么问题来了: C语言在“编译”阶段就应该确定了地址分配,汇编之后就已经生成了二进制文件已经不可更改,然后链接时才使用.icf里的地址信息 ? 怎么感觉这是个悖论? 如果芯片地址信息在编译时要用,为什么叫“链接配置文件”,而如果编译时没用此文件,那编译时是怎么分配的地址?

运行的时候才分配的
全局变量只是作用域不同,具体分配和临时变量没有什么区别。不是动态分配的都在堆上

全局变量的内存在编译时被确定,在程序运行时分配。全局变量具有静态存储期,static表明它是内部链接,extern表明它是外部链接。不管是内还是外链接,它都具有文件作用域,内链接使它只能在这个文件里使用,外链接使它可以在别的文件里被使用。编译时的链接与上面的链接不同,编译和链接是为将用户程序从硬盘上调入内存并将其转换成可执行程序服务的。用编译器时的compile就是在进行编译,link就是链接,运行程序可以看到。