我首先用QQ管家下载VMware Workstation中的虚拟机,然后下载Ubuntu64的映像,开启了Linux之路。
搞了些设置后,成功启动Linux ,添加自身Window 和 虚拟机上Linux的共享目录方便传文件。再添加些软链接(快捷方式)来方便访问文件夹。
一般刚开始用VIM 编辑本文,操作起来比较不方便。所以一般现在Window上编辑好,然后将文本复制到Linux中。
首先创建 .c的文件在此下编辑 ,我的时helloworld.c
之后 执行 gcc helloworld.c 后编译成 a.out 的二进制文件
如果没下载gcc 可执行 sudo apt install gcc 即可
执行二进制文件并 传入输入参数
当编译多个文件时 gcc 文件1 文件2 文件3 .......
gcc的编译过程分为三步:
第一步将 文件1.c 文件2.c 文件3.c 分别通过编译器解析成汇编语言 文件1.s 文件2.s 文件3.s 。可执行命令 gcc -S 文件1.s 文件2.s 文件3.s 只激活预处理,和编译
第二步将 文件1.s 文件2.s 文件3.s 分别通过汇编器 文件1.o 文件2.o 文件3.o 。可执行命令 gcc -c 文件1.s 文件2.s 文件3.s 只激活预处理,和编译和汇编,生成obj目标代码文件
第三步将这些文件通过链接器生成 out 的可执行文件 如果不想编译出来成 a.out 名字 可执行命令 gcc -o 新文件名 待编译文件名 如 gcc -o hello.exe helloworld.c
gcc 的相关命令 参考菜鸟教程 https://www.runoob.com/w3cnote/gcc-parameter-detail.html
bss段(Block Started by Symbolsegment)通常是指用来存放程序中未初始化的全局变量和未初始化的静态局部变量的一块内存区域,
汇编代码转成目标代码文件.o包含6部分:
1)文件头:包含代码段,数据段和BSS段的大小
2)代码段: 包含机器指令
3) 数据段:包含了初始化全局变量和初始化静态数据
4) bss 段:存放程序中未初始化的全局变量
5) 指针以及数据和bss 中的偏移量和重定位信息
6) 符号表 : 包含非静态全局变量、函数名称及其属性
合成a.out 的文件过程中将文件头的数据大小,代码段,bss段,数据段 通过符号表中的引用信息来进行合并。
生成出来的a.out 文件包含四部分内容:
1) 文件头 : 包含了文件的加载信息和大小,其中
1.1) tsize = 代码段大小
1.2) dsize = 包含了初始化全局变量和初始化静态局部变量的数据段大小。
1.3) bsize =包含了未初始化的全局变量和未初始化的静态局部变量的bss段大小。
1.4) total_size =加载 a.out文件的总大小
2)代码段:包含了可执行代码
3)数据段: 包含了初始化全局变量和初始化静态数据
4)符号表: 可选,用于调式。
要注意的是bss中的数据和自动局部变量并没用存放在 a.out中。通常来讲 bsize =total_size - tsize - dsize 。bss段用于程序执行期间的动态内存分配,bss上的多余空闲内存称为堆区。