网站内部链接的作用有哪些,17做网站郑州,wordpress类似网站,dnf卖飞机的网站怎么做的先来个简单的#xff0c;欢迎我们神秘嘉宾——main.c。这是我们第一个c语言代码。
1 int main(void) {
2 while(1);
3 return 0;
4 }它没法再简单啦#xff0c;简单的程序似乎能帮助咱们更容易的理解所学的知识#xff0c;哈哈#xff0c;我说的是似乎#xff0c;其实欢迎我们神秘嘉宾——main.c。这是我们第一个c语言代码。
1 int main(void) {
2 while(1);
3 return 0;
4 }它没法再简单啦简单的程序似乎能帮助咱们更容易的理解所学的知识哈哈我说的是似乎其实再长的代码编译后生成的文件结构也是由那几个部分组成万变不离其宗。这里所说的文件结构是指将来要说的elf文件格式在此不多说留作伏笔。
正如之前所说咱们只有用c语言的语法结构这里没有包含标准库也没有直接的系统调用以后咱们都得按照这种简洁的方式编程啦。另外有的同学已经注意到main.c所在的目录啦本来我还是想卖个关子的但它所在的目录出卖了我在kernel目录下。对如您所想它就是我们第一个内核文件我们在project目录下建立了个子目录kernel今后我们所有与内核相关的模块都要放在此目录下。
您也看到了这个内核文件什么都没做通过while(1)这个死循环一直空兜cpu目的是停在这里。想当初我就因为忘记加这样的语句而导致不知道cpu执行到哪去了当时排错时可晕头了看到执行的指令都不是自己写的甚至都怀疑是虚拟机的问题想想好惭愧啊脸红脸红啊。当然查出来原因之后自然又是满地打滚喜极而泣啦。这个简单粗暴可依赖的死循环仅仅是为了演示elf文件解析以及加载内核的作用今后我们要逐步完善它看着它一点一点长大就像是我们在养育孩子一样尽管我还没有结婚^_^。
生成c语言程序的过程是这样的。先将源程序编译成目标文件由c代码变成汇编代码后再由汇编代码生成二进制的目标文件再将目标文件链接成二进制可执行文件。平时我们写只有一个文件的小程序时编译器也是悄悄在背后这样做的除非加了参数让编译器分成两个动作。由于咱们用的是c语言写的程序想到的是编译器自然是大名鼎鼎的gcc所以我们用gcc编译该程序的参数是:
gcc -c -o kernel/main.o kernel/main.c也许对其中的参数有的同学不太熟没关系在执行gcc –help回车后大家可以看到一些帮助信息其中
-c的作用是编译、汇编到目标代码不进行链接也就是直接生成目标文件。
-o的作用是将输出的文件以指定文件名来存储有同名文件存在时直接覆盖。
经过上面gcc的编译后我们得到了main.o文件目前为止它还是个“半成品”。为什么这么说呢因为它只是个目标文件也称为待重定位文件重定位指的是文件里面所用的符号还没有安排地址这些符号的地址需要将来与其它目标文件“组成”一个可执行文件时再重新定位编排地址这里的符号就是指该目标文件中所调用的函数或使用的变量而这里的“组成”就是指链接。这些符号一般是位于其它文件中所以在编译时不能确定其地址需要在所有目标文件都到齐了将它们链接到一起时再重新定位编排地址。由于不知道可执行文件是由几个目标文件组成所以一律在链接阶段对符号重新定位编排地址。所以说哪怕是可执行文件只是由一个文件组成其目标文件中的符号也是未编址的编址工作即重定位一律统一在链接阶段完成。
编译成目标文件时也不我们可以用file命令检查一下main.o的状态。如file kernel/main.o输出见图 为了让大家更明显地看出目标文件的可重定位属性我将relocatable用方框给大家圈出来了。
目标文件是可重定位文件其中的符号都尚未“定位”也就是符号变量名函数名的地址尚未确定这一点我们可以用linux的nm命令来查看。如图 如图所见由于咱们的main.c过于简单里面只有一个符号即main所以nm只列出了它的符号信息。main函数的地址由于未被指定所以其值为00000000。一会咱们链接后再对比下大家就更清楚了.