为什么要研究链接器?
于我来说,最主要的原因就是学习了。
去年差不多这个时候,我刚进入大学的计算机系,对于如何学习这个专业尚模糊不清。在开学一个月左右的时候,学院为了探索教学改革,要组建一个虚拟的试验班,让一个老师给我们做了一次宣讲(当时没想到这个老师就是给我重大影响的韩老师)。他先说了一些他所遇见的大牛的例子,这些大牛的共同特征就是基础特别好,对于计算机系统的底层非常了解。所以学院希望通过这个试验班,做一些教学方面的探索,看能不能培养出基础扎实的,更优秀的学生。还抛出了三个愿望:操作系统,编译器,数据库,希望我们走一遍,不仅知道他们的运行机制,还要能够动手实践出一个简单可用的版本。
对韩老师说的打牢基础的说法深以为然。现在IT方面的技术发展很快,封装也是越来越抽象,如何在这种瞬息万变之中积累下真正有用的知识技能,我想唯有以不变应万变,摸清这些知识的根部,才是最好的学习方法。或许最后我们用于工作的是java,是python,是javascript。但是学习汇编,研究操作系统,编译器,会让我们对这些新技术知根知底,进而学习的速度。
如我研究链接器的参考书《程序员的自修养:链接,装载与库》的作者在序言中说的:
“我目前从事的工作和系统底层关系不是很大,现在最常用的都是web前端,MySql数据库等这些应用层面的系统。虽然不是直接与系统底层打交道,但是之前的积累无时无刻不在帮助我取生如理解应用开发。比如MySql系统的内存和文件系统的优化,如果对操作系统的虚拟储存和文件系统机制没有深入了解,那么可能只能在配置参数上做一些“猜测”性质的调整,不断地尝试各种参数,或者参考网络上别人提供的配置参数,但不一定适合自己的应用情况。了解虚存如何运作,进程地址空间的分布等,将会对应用的优化,甚至是架构设计上都会有更高层次的俯视。“
目标:
一个可用的C链接器,可以链接MiniCRT(64位版)
资料:
Oracle的《链接程序和库指南》
《程序员的自我修养:链接,转载与库》
工具:
archlinux 64位版
eclipse + cdt
readelf
objdump
ghex
nm
gcc
ld
edb
这个系列的更新我会同时发在博客园和我的独立博客上:nanshu.pw