第二天——配置环境
安装wsl扩展应用
连接了wsl后,在vscode里安装扩展应用不行。
试了很多种方法还是不行,最后在挂载位置下找了个地方重新创建了文件夹,再安装扩展就行了。
F12跳转用不了
①检查是否有安装C/C++ 扩展在wsl上
②我按F12出来计算器,而不是跳转vscode的定义,原因是windows上功能键我没禁用
按住Fn与Esc即可禁用
开始跟着教程去操作hello world
Step1:去除符号表
去除符号表去进行编译,真的减少了挺多字节。
gcc -s hello.c hello.out
问题1:符号是什么?
源代码中的函数、变量等被编译以后,都变成了符号
使用 nm 我们可以查看一个二进制程序中含有哪些符号。比如:nm hello.out
问题2:为什么此时能够去除符号表呢?
《程序员自我修养》中p128页提到:
对于可执行文件来说,符号表和字符串表是可选的。只有段名字字符串表为用户保存段名,所以必不可少。
教程文中也讲了:这些符号都存储在了 ELF 中,主要用于链接,对于可执行文件来说,符号并没有什么太大作用。
一些参考文章:https://www.jianshu.com/p/af6d0cefdfae
Step2:优化
编译时指令变为
gcc -O3 hello.c -o hello
step3:不用启动文件
原文中提出的问题:谁在调用main函数?
crt1.o 里面提供的 _start 函数是程序事实上的入口,这个函数负责准备 main 函数需要的参数,调用 main 函数以及处理 main 函数的返回值。
我们编写的程序都会被默认链接到 GCC 提供的 C 运行时库,叫做 crt
这些 crt 文件统称为 Start Files。
所以,现在我们的思路是,可不可以不用这些crt启动文件?
_start 函数主要功能有两个,第一是准备参数,我们的 main 不使用任何参数,所以这一部分可以忽略。
第二是处理返回值,具体的处理方式是使用 main 函数的返回值调用 exit 系统调用进行退出。
所以如果我们不使用启动文件的话,只需要自己使用系统调用退出即可。
gcc -e nomain -nostartfiles 编译我们的程序,其中 -e 指定入口,--nostartfiles 作用很明显,告诉 GCC 不必链接启动文件了。
失败,出现了段错误。