gdb调试
Wei Jieyang Lv4

制作链接库的目的是希望别人使用我们已经实现的功能,但又不希望别人看到我们的源代码
Linux下的静态链接库是以.a结尾的二进制文件,它作为程序的一个模块,在链接期间被组合到程序中。和静态链接库相对的是动态链接库(.so文件),它在程序运行阶段被加载进内存。

静态库生成步骤

1
2
3
4
//1 对所有源文件,只编译不链接
gcc -c test.c
//2 利用ar命令,生成库文件
ar rcs libtest.a test.o

ar是 Linux 的一个备份压缩命令,它可以将多个文件打包成一个备份文件(也叫归档文件),也可以从备份文件中提取成员文件,最常见的用法是将目标文件打包为静态链接库。

对参数的说明:

  • r:用来替换库中已有的目标文件,或者加入新的目标文件。
  • c:表示创建一个库。不管库否存在,都将创建。
  • s:用来创建目标文件索引,这在创建较大的库时能提高速度。
  • -lm:表示连接系统的数学库libm.a
    • 需要放在库之后,不然找不到

Linux 下动态链接库(shared object file,共享对象文件)的文件后缀为.so,它是一种特殊的目标文件(object file),可以在程序运行时被加载(链接)进来。

使用动态链接库的优点是:程序的可执行文件更小,便于程序的模块化以及更新,同时,有效内存的使用效率更高

  1. 如果想创建一个动态链接库,可以使用 GCC 的-shared选项。输入文件可以是源文件、汇编文件或者目标文件。
  2. 另外还得结合-fPIC选项。-fPIC选项作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code);这样一来,产生的代码中就没有绝对地址了,全部使用相对地址,所以代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
1
2
3
4
5
6
# 从源文件生成动态链接库:
$ gcc -fPIC -shared func.c -o libfunc.so
# 从目标文件生成动态链接库:
$ gcc -fPIC -c func.c -o func.o
$ gcc -shared func.o -o libfunc.so
* -fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
  • Post title:gdb调试
  • Post author:Wei Jieyang
  • Create time:2020-12-14 17:56:55
  • Post link:https://jieyang-wei.github.io/2020/12/14/gdb调试/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.