深入理解静态链接库和动态链接库

为什么要使用链接库?大概有如下几个原因:1.利用前人为我们写好的库,比如数学库libm.so,免去再造轮子的困扰。2.充分使得程序的模块化,方便开发和后期升级。 3. 减小可执行文件的体积。链接库分为静态链接库、动态链接库。动态链接库还有不同的使用形式。那么他们的区别是什么?在什么情况下使用?编程时需要考虑那些方面呢?

原文:小宇的博客

静态库 static linking library

静态库一般命名为libxxx.a,其中xxx是库的名字。利用静态库方式编译生成的可执行程序的体积一般比较大一些。因为整个静态库的内容都会被链接到代码中。由此,我们可以发现他的优点,即编译后的科执行程序不依赖任何外部的库文件。这点可以很好的保证程序的可部署性,因为不用再考虑库的兼容性和依赖性。其缺点也是显而易见,即对库做的修改,必须重新编译整个可执行程序。升级也需要替换整个可执行程序。对于一些不间断运行程序,比如数据库软件,升级后需要重启。
无论静态库还是动态库,都是利用gcc生成的。gcc经过预处理编译链接三个步骤生成可执行文件,静态库的生成只需要前两步,gcc的-c选项就是让gcc只做预处理编译两步。通过这两步由libmy.c生成了libmy.o

$ gcc -c libmy.c

接下来就是用ar命令把一个或几个.o文件放到一个.a文件中。
-c:创建一个a文件
-r:加入新的o文件时候,如果重名,就采取替换的方法
-s:加入一个o文件的索引
-v:输出详细的过程

$ ar -crsv libmy.a libmy.o

下一步就是先编译main.c文件,然后把生成的main.o文件和libmy.a库文件链接到一起。

$ gcc -c main.c
$ gcc main.o -o main -L. -lmy

把上述过程写成Makefile文件

$ cat Makefile 
all:main

main: main.o libmy.a
    gcc main.o -o main -L. -lmy
libmy.a: libmy.o
    ar -crsv libmy.a libmy.o
libmy.o: libmy.c
    gcc -c libmy.c
clean:
    -rm *.o *.a

下面我们看看nm生成的可执行程序的内容。

$ nm main | grep add
0000000000400551 T add

add函数别标记为T:该符号在text section文本段中,说明该函数的内容已经在可执行程序中了。
接下来用objdump来看一下链接库中的add函数内容:

$ objdump -S main
0000000000400551 <add>:
  400551:       55                      push   %rbp
  400552:       48 89 e5                mov    %rsp,%rbp
  400555:       89 7d fc                mo
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《程序员的自我修养:链接,装载与》是一本由林锐、郭晓东、郑蕾等人合著的计算机技术书籍,在该书中,作者从程序员的视角出发,对链接、装载与等概念进行了深入的阐述和解析。 在计算机编程中,链接是指将各个源文件中的代码模块组合成一个可执行的程序的过程。链接可以分为静态链接和动态链接两种方式。静态链接是在编译时将所有代码模块合并成一个独立的可执行文件,而动态链接是在运行时根据需要加载相应的代码模块。 装载是指将一个程序从磁盘上加载到内存中准备执行的过程。在装载过程中,操作系统为程序分配内存空间,并将程序中的各个模块加载到相应的内存地址上。装载过程中还包括解析模块之间的引用关系,以及进行地址重定位等操作。 是指一组可重用的代码模块,通过链接和装载的方式被程序调用。可以分为静态和动态静态是在编译时将的代码链接到程序中,使程序与的代码合并为一个可执行文件。动态则是在运行时通过动态链接的方式加载并调用。 《程序员的自我修养:链接,装载与》对于理解链接、装载和的原理和机制具有极大的帮助。通过学习这些概念,程序员可以更好地优化代码结构和组织,提高程序的性能和可维护性。同时,了解链接、装载和的工作原理也对于进行调试和故障排除具有重要意义。 总之,链接、装载与是计算机编程中的重要概念,对于程序员来说掌握这些知识是非常必要的。《程序员的自我修养:链接,装载与》这本书提供了深入浅出的解释和实例,对于想要学习和掌握这些知识的程序员来说是一本非常有价值的参考书籍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值