《程序员的自我修养--链接、装载与库》

《程序员的自我修养--链接、装载与库》

   个人浅显地认为在编程活动的整个过程中,至少要对程序的2个模型有完整的了解,一个是内存模型,另一个是线程模型。线程模型可以看看多线程编程书籍了解,但是内存模型就复杂了。

       想要了解程序的内存模型,就得从编译和链接开始了,以windows为例,程序对每个源文件生成一个obj文件,每个obj文件内部包含代码段和数据段以及重定位段,因为有些变量和函数可能引用自其他文件,需要在链接的时候对其地址进行重定位,这些信息保存在重定位段。静态库是obj文件的一个组合,当最终生成exe的时候(静态链接),链接器重新生成代码段和数据段,exe程序有一个默认的加载地址,所以程序的起始虚拟地址是固定的,这样代码的和数据段的虚拟地址同样也是固定的,所以可以分析exe文件的数据段和代码的基本可以分析出程序运行的地址分布。

      如果用到dll动态链接库,又有不同了,windows中引入了导入导出表,需要在程序运行的时候进行重定位地址表,linux引入了地址无关的代码。

      程序运行是操作系统加载exe到相应的地址空间,将运行权转交给C运行时库,C库开始一些初始化等工作,然后调用main。

      还有堆怎么分配,栈数据如何分配运行,虚拟地址空间怎么预留,操作系统占用的地址空间,函数参数怎么入栈,怎么出栈,C++的全局构造函数何时调用等一系列的问题需要去分析解决。

      推荐一本书《程序员的自我修养》,这本书介绍了以上你想要理解的全部内容,但是也有瑕疵,技术方面虽然解析的挺好,但是明显的废话太多(有点像写论文凑字数),一些词句表达明显不通顺,后来发现两个作者是在校研究生,且不必过分要求。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值