程序员的自我修养——动态链接
动态链接的步骤和实现
动态链接基本上分为3步:先是启动动态链接器本身,然后装载所需要的共享对象,最后是重定位和初始化。
动态链接基本上分为3步:先是启动动态链接器本身,然后装载所需要的共享对象,最后是重定位和初始化。
动态链接确实有很多的优势,比静态链接要灵活的多,但它也是牺牲一部分性能为代价的, ELF 程序在静态链接下要比动态库稍微快一些,大约为 1%~5%。动态链接比静态链接慢的主要原因是动态链接下对于全局和静态的数据访问要通过 GOT 表定位,然后间接寻址,对于模块间的调用也需要 GOT 表,然后进行间接跳转,如此一来,程序的运行速度必定会减慢。另一个原因是动态链接的链接工作在运行时完成,即程序开始执行时,动态链接器需要进行一次链接工作,寻找并装载所需要的共享对象,然后符号查找地址重定位等工作,势必会减慢程序的启动速度。我们将在后面看到如何进行优化。
写这个博客还得起源于潜水快一个学期的老班在班群里提的一个问题:
1 | functions = [] |
输出结果都是16,原因?
个人平常不写算法的博客,主要是太懒太菜,前一段时间离散数学小组展示展示中国邮递员问题现场举例的时候翻车了,这次记录一下中国邮递员问题,来让自己铭记准备不充分,理解不透彻,队友两行泪。
ps:对于我的一些理解错误的地方还请就当看个乐子,还有这次博客巨长(md文件竟然有500+行,对于我平常只写200-300左右,我惊了),测试例子的不多,反正课本上的例子过了,不确定是不是 100% 正确太菜了
2020/4/20 更新,根据给社团新生的讲课内容适当进行了补充