由于openssl代码非常复杂,尤其是用到了非常多不太常用的C技巧,像n多的宏定义,使得我们在查找一些函数,变量定义的时候非常麻烦,无论什么样的代码工具都没法定位到函数的原始定义处。
对于通过宏来定义的函数和变量,如果我们去一层层的将宏扩展开来分析,将会是非常麻烦的,就像我之前所作的那样,需要不少的时间,而且有的时候不一定对。
幸好编译器在预编译阶段已经帮我们将所有的宏都展开,所以我们可以利用这一点来获取预编译的结果。
对于MSVC的编译器CL,有一个选项/P可以将预编译的结果写到一个文件中,如xxx.c写为xxx.i,然后只需要打开xxx.i就可以看到完整的预编译结果,包括include了哪些头文件,信息非常的全。/P输出的内容太全,所以文件会比较的大,/EP会少很多,但是/EP是输出到标准输出,不是直接到文件的,也不好,也可以将/EP的结果重定向到文件来比较完美的解决这个问题。
对于GCC,有更多的选项可以做到,像-E, –S,-c等等,可以仔细去看下GCC的帮助文档。
当然,预编译的结果不像代码本身那样组织的很好,便于阅读,只能用于参考还行。