目标文件里有什么
1. .text段是代码段,比如main程序就存放在这里; .data段存放已初始化的数据而且初始化不为0;.bss段存放未初始化或初始化为0的数据(英文含义:以符号开始的块),在这里我们引发出几个问题:
(1)我们都知道.bss段不占空间,它到底不占哪里的空间? 虚拟地址空间还是文件空间?
答案是文件空间,因为对于.bss段来说,分配空间的意义只局限于虚拟地址空间,因为它在文件中并没有内容。而在仅生成.o文件时,.bss是不占.o文件空间的,在以后的链接过程中,链接器会为目标文件分配虚拟地址和空间。
(2).c到.exe过程中有多少个文件产生?为什么?(有解决待)
2.程序从编写到执行经过哪些过程?
一、预编译 生成.i文件(windows下)
(1)展开头文件 (2)替换#define (3)删除注释 (4)添加行号 (5)保留#pragma (6)删除宏:#if #endif等
二、编译 生成.s文件
词法分析,语法分析,语义分析,代码优化等
三、汇编 生成.o文件,也就是目标文件
将代码汇编成机器指令
四、链接 生成.exe文件
(1)符号解析 (2)符号重定位 (3)分配地址空间
3.目标文件和可执行文件都是elf格式的文件(linux下)
4..bss段少了哪个变量?为什么会少了这个变量?
答案是未初始化的 全局变量,它也是一种弱符号,所以所占空间大小未知,因为有可能其它编译单元中该符号所占的空间比本编译单元该符号所占的空间大,(比如char *str = ...我们并不知道),所以编译器此时无法为该弱符号在BSS段分配空间,我们将它标记为COMMON类型的变量。
5.怎么知道.bss段的信息?
ELF头段里有.bss段的信息
6.在局部变量未初始化时,地址是0xcccccccc,原因是访问了内核空间,它是无效值
7.强符号:已初始化的全局变量;弱符号:未初始化的全局变量
8.C语言中强弱符号规则:
两个强符号,报错;一强一弱,取强符号;两个弱符号,由编译器决定
强弱符号是有针对性的。
9.若定义char *p = "hello world";
hello world存储在只读数据段.rodata
10.头文件里放的是声明
11.main参数:int main(int argc,char **argv,char **envp)
12.Linux : user space:3G knel space:1G
Windows 3 1
2 2
13.ZONE_DMA 大概16M 不经过寄存器
ZONE_NAMAL 常用部分 16~896M
ZONE_HIGHMEN 896M~结束