2018-2019-1 20175206《信息安全系统设计基础》第3周学习总结

Posted ldc175206

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018-2019-1 20175206《信息安全系统设计基础》第3周学习总结相关的知识,希望对你有一定的参考价值。

2018-2019-1 20175206《信息安全系统设计基础》第3周学习总结

gcc学习情况

gcc处理文件流程

我们先来看一下gcc处理文件的步骤:

$ cd demo  #进入源文件所在目录
$ touch main.c  #新建空白的源文件
$ gedit main.c  #编辑源文件
$ gcc main.c  #生成可执行程序
$ ./a.out  #运行可执行程序

gcc编译流程

技术图片

而相反的,我经过学习得知
.i文件、.s文件、.o文件这些中间文件都是看不到的,因为在处理时gcc会将其隐藏,我们能看到的就只有其结果所在。

gcc中的编译与链接程序

编译多个源代码文件会生成多个目标文件,每个目标文件都包含一个源文件的机器码和相关数据的符号表。除非使用-c选项指示 GCC 只编译不链接,否则 GCC 会使用临时文件作为目标文件输出:
$ gcc -c main.c
$ gcc -c func.c
这些命令会在当前目录中生成两个目标文件,分别是 main.o 和 func.o。把两个源文件名放在同一个 GCC 命令中,也可以获得同样的结果:
$ gcc -c main.c func.c
一旦所有当前源文件都被编译为目标文件,就可以使用 GCC 来链接它们:
$ gcc main.o func.o -o app.out -lm
GCC 假设扩展名为.o的文件是要被链接的目标文件。

扩展名
.c  
C程序源代码,在编译之前要先进行预处理。
.i  
C程序预处理输出,可以被编译。
.h  
C程序头文件。(为了节省时间,许多源文件会包含相同的头文件,GCC 允许事先编译好头文件,称为“预编译头文件”,它合适情况下自动被用于编译。)
.s  
汇编语言。
.S  
有C命令的汇编语言,在汇编之前必须先进行预处理。

静态链接与动态链接

静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接 库。静态链接库与静态链接库调用规则总体比较如下。
对于静态链接库(比较简单):
首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。
第二,因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!:)
对于动态链接库:
动态链接库的使用需要库的开发者提供生成的.lib文件和.dll文件。或者只提供dll文件。
首先我们必须先注意到DLL内的函数分为两种:
(1)DLL 导出函数,可供应用程序调用;
(2)DLL 内部函数,只能在 DLL 程序使用,应用程序无法调用它们。
因此调用程序若想调用DLL中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数。

1〉动态调用

生成库的.h头文件中的声明格式如下:
extern "C" 函数返回类型 __declspec(dllexport) 函数名(参数表);
在调用程序的.cpp源代码文件中按如下流程调用:
在main函数代码的开始处
定义需要的DLL模块的句柄和此DLL模块模块中需要调用的函数的函数指针。
定义好后紧接着就是标准的三部曲:
取得需要的DLL模块------>返回模块句柄
LoadLibrary("DLL模块路径")
取得需要的函数地址———>返回函数指针GetProcAddress(模块句柄,"函数名")
从内存中卸载DLL模块———>FreeLibrary(模块句柄)

2>静态调用

在调用程序的.cpp源代码文件中按如下流程调用:
告诉编译器与 DLL 相对应的.lib 文件所在的路径及文件名
···
extern "C" 函数返回类型 _declspec(dllimport) 函数名(参数表)分号
int main()

..............

···

本次学习参考了一些网页的参考知识,在这里给出链接
[http://blog.sina.com.cn/s/blog_61ba4898010153zu.html]

以上是关于2018-2019-1 20175206《信息安全系统设计基础》第3周学习总结的主要内容,如果未能解决你的问题,请参考以下文章

2018-2019-1 《信息安全系统设计基础》 20165235 实验五 通信协议设计

2018-2019-1 20165236 《信息安全系统设计基础》第4周学习总结

2018-2019-1 20175234 《信息安全系统设计基础》有关系统调用的部分学习

2018-2019-1 20165316 《信息安全系统设计基础》第1周学习总结

2018-2019-1 20165221 《信息安全系统设计》实验二:固件程序设计-实验报告

2018-2019-1 20165312 《信息安全系统设计基础》第一周学习总结