源代码变变变

<!DOCTYPE html>

源代码变变变

源代码变变变

这章讲基础啊,就是源码变exe背后的操作。

《一些术语》 中已经介绍了静态链接库,和动态链接库dll,现在深入探讨下。

先提一提编译、链接:编译就是将高级语言翻译为机器可执行的代码。

链接这步就是为了防止程序过于臃肿,不好查错,在转化为可执行文件(exe、elf)之前,再多出一步。根据程序的功能,划分代码,生成xx.obj 对象文件。


假如你现在去饭店,想点两盘小菜和米饭,吃一顿。但是服务员都是聋子不知道你要吃啥,就把几十道菜都端上来(静态链接)。我擦你发现没有带够钱(内存不够),现在是不是很想砸店。

所以为了解决这个问题,就动态链接。想吃啥,做个菜单,点啥上啥。


将lib.c 编译为共享文件:

gcc -fPIC -shared -o Lib.so Lib.c

需要三个参数,-o指定文件名,-shared 编译为共享文件,重要的是 -fPICposition-independent code),该参数是什么鬼?

首先,在编译成的xx.o也好,xxx.so也好,它们的装载地址都是0,为啥?比如你去买蛋糕,想在上面写郭美美,祝你生日快乐!要是蛋糕店只有写好了的王小明,祝你生日快乐!我猜你肯定不得买,认为蛋糕店老板脑子莫不是有问题啊。

所以链接之前的装载地址是不确定的。

装载时重定位,就好比,你要买蛋糕,告诉店主要写啥名,他就给你写啥名。听起来好像不错哦~但是,等等

你打算把蛋糕(共享文件)送给女神(p1.c),送出去怎么办呢。p2.c就没得咯,万一当时过节好多人要送礼(xxx.o、xxxx.o),你都这么送岂不是要大出血,万一能群发多好。

地址无关代码 position-independent code,你左思右想,还是不写名字,写一封情深意切的电子邮件得了,到时候一群发,省事!

电子邮件怎么写呢,首先,它不能太具体,要是你写什么 死鬼,爱你,么么哒,这就不太合适。

要写 在这金秋佳节,我怀念起了我们在一起度过的欢乐时光!应用范围就广一点。

写好了以后呢,再加上一段具体的回忆啦,感谢啦,这样就显得高端,绝对不是群发的。这时候要分开来发,别发错了。

地址无关代码就是这样,把套路话、非套路话分开,把套路话(指令)和数据放在一起(数据是共享的),厉害吧。

-fPIC 运用地址无关代码,再也不怕共享文件地址找不到了。

静态链接之后只有一个(比较大的)文件,而动态链接,除了可执行文件,还有共享文件(.so)。

preprocess

预处理,又叫做预编译,这一步骤在编译链接之前。目的是为了处理预编译指令,#include #define #if  #ifdef  #elif  #else #endif ……


对这个程序很熟悉吧,今天不讲程序,将预编译,看第一行。

stdio.h 是一个头文件,preprocessing会删除第一行,插入这个stdio头文件。它是标准输入输出库,包含printf之类的函数。

预处理还会删除我们对程序的注释,因为注释对人类有用,对程序执行无用。预处理就是相当于做菜之前洗菜、切块、扔掉不能吃的部分等等处理食材的步骤。