1)库文件:某些功能模块的集合,项目之间代码的共享,模块化开发。预先编译好的方法的集合。比如:我们提前写好一些数据公式的实现,将其打包成库文件以后只需使用库文件即可,而不需要重新编写。

  2)静态库和动态库(共享库)的区别

       静态库: windows  .lib    linux  .a

       静态库在链接过程中使用,使用静态库编译的的可执行程序包含静态库的内容,所以可执行文件的执行不依赖静态库。(静态库是功能的“.o”的集合)

       动态库: windows  .dll    linux  .so

       动态库在执行过程中使用,在执行中需要动态库的支持,将动态库动态加载到内存中,所以可执行文件的执行依赖动态库。(是没有main函数的可执行文件)

       静态库在链接过程中,将代码拷贝到可执行文件当中,当它多次被使用时就会有多份没用的拷贝存在内存中,当然在程序文件本身中也存在重复代码,这浪费了许多内存和磁盘空间。而动态库在运行时才被加载到内存中,不同的程序可以得到内存中相同的动态库的副本,这就为我们节省了内存空间。

3)静态库的生成

     3.1)将源文件编译生成中间文件(*.o)

     3.2)ar crv libxxx.a *.o(所有的中间文件)

     3.3)gcc -o main main.c -L -lxxx

          -L  指定静态库路径  -l  指定静态库名称

(1)动态库的生成

     gcc -shared -fPIC -o libxxx.so *.c

     gcc -o main main.c -L -lmath

 

库函数:在函数库文件中。执行时在用户态中。库函数可能还会转调系统调用函数,比如:fopen,printf 。也可能不需要,比如:strlen,strcopy

系统调用(英语:system call):指运行在用户空间的应用程序向操作系统内核请求某些服务的调用过程。 系统调用提供了用户程序与操作系统之间的接口。一般来说,系统调用都在内核态执行。由于系统调用不考虑平台差异性,由内核直接提供,因而移植性较差(几乎无移植性)。在内核中实现。

 

 系统调用函数触发0x80中断,将相应系统调用号存入eax寄存器中,陷入内核,内核开始执行中断处理程序,在系统调用表中查找对应的系统内核函数并调用,执行完成后将数据通过eax寄存器带到用户空间。