编译程序编译C语言的过程中,必须要通过操作符号表来确定各个被定义的符号(变量,数组,函数,标签等)的地址,以便于将文本形式的代码翻译为二进制机器码.而所得到的ELF文件(.o/.exe)中的符号表节区(.symtab)只包含存储类型为static/extern的变量,而不包含auto局部变量.那么,局部变量是如何被编译器翻译的?
来源: 编译过程必须依靠符号表来实现.编译过程输出ELF文件,而ELF文件的符号表节区(.symtab)并不包含局部变量.那么,局部变量是如何编译的呢?
自己的思路:
1.ELF文件是编译过程的输出,是最终的结果,它的符号表节区(.symtab)也仅仅是符号表操作的最终结果,无法反映整个编译过程的符号表变化.所以,在编译过程进行的时候,局部变量是会出现在符号表之中的,而编译程序据此确定局部变量的地址(局部变量位于栈中,其地址是相对栈指针sp的偏移量),进而实现对局部变量的翻译.
2.符号表的操作包含增加项目,查找项目,删除项目.在编译过程结束时,会跳出所有的函数与块作用域,相应的,栈内存也会进行出栈操作.而与之相关的局部变量也会从符号表之中被删除掉,只保留静态变量static,全局变量以及外部变量extern.所以,最终的输出ELF文件的符号表节区(.symtab)没有局部变量的内容.
1.上述的思路是否正确?
2.如果不正确,错误在哪?要理解正确的思路,需要查找哪些方面的知识?