当前位置: 技术问答>linux和unix
[100分]有没有关于binutils的深入的资料?或者深入底层的资料?
来源: 互联网 发布时间:2016-10-31
本文导语: 最近打了一段时间的酱油,东搞搞西搞搞,但始终离不一基本目标:深入底层。 这个底层并非指与硬件、芯片打交道,并非涉及时序、操作。 这个“底层”以我现在的水平不好定义,这里只能给出一些关键字:静态...
最近打了一段时间的酱油,东搞搞西搞搞,但始终离不一基本目标:深入底层。
这个底层并非指与硬件、芯片打交道,并非涉及时序、操作。
这个“底层”以我现在的水平不好定义,这里只能给出一些关键字:静态库、动态库、程序如何加载、ld-linux-so.x、程序地址空间分布、堆、栈、linux平台入口函数和初始化函数……
binutils很久就遇到过了,最开始有印象应该是做LFS时候吧。最近研究了一下linux下的动态库,用过其中的一些工具,如ojbdump、nm、strip、readelf,等等。网上有很多资料,可惜,这些资料大部分都是讲如何使用这些工具、这些工具如何重要,再深入一些的话,就没有了。到官方网站上,也找到一些manual而已,想多点了解readelf输出结果,也没有什么资料介绍,只能靠平时专业英语的感觉理解,比如OJBECT、FUNC、GLOBAL、DEFAULT等等。——谁都知道程序中了很多符号表,但里面的含义、字段似乎就不知道了。
有几本书还是讲得比较好的,比如《Linux性能详解》、《程序员的自我修养》等等。
并非在下钻牛角尖,我只是觉得,作为一个刚出来混的程序员,有必要去了解这些东西——更何况,目前还处于打酱油阶段,何不趁有时间再研究研究?天知道以后还会不会有现今这心情、这时间!
在IBM的devoloperworks看到一句话:
“其实有很多东西只要勤于思考,还是能够自己悟出一些道理的。国外有一些高手就是通过能够大家都能见到的的一点点资料,自己摸索出来很多不为人知的秘密。”
“学习计算机很关键的一点在于一定要富于探索精神,要让自己做到知其然并知其所以然。”
辛苦不怕,动手不怕,师父领进门,修行靠各人,奈何无半点指导,凭自己摸索,漫漫长路,走得坎坷,亦无人知。而且,这么久,还不一样走过来。不过,现在工作了就要注意效率与时间了。
主要是想了解一下进程在main执行之前做了什么、之后又做了什么,谁在做等等问题,但比较少资料情况下感慨一下,大家有什么好的资料不妨介绍一下,100分,不多。
这个底层并非指与硬件、芯片打交道,并非涉及时序、操作。
这个“底层”以我现在的水平不好定义,这里只能给出一些关键字:静态库、动态库、程序如何加载、ld-linux-so.x、程序地址空间分布、堆、栈、linux平台入口函数和初始化函数……
binutils很久就遇到过了,最开始有印象应该是做LFS时候吧。最近研究了一下linux下的动态库,用过其中的一些工具,如ojbdump、nm、strip、readelf,等等。网上有很多资料,可惜,这些资料大部分都是讲如何使用这些工具、这些工具如何重要,再深入一些的话,就没有了。到官方网站上,也找到一些manual而已,想多点了解readelf输出结果,也没有什么资料介绍,只能靠平时专业英语的感觉理解,比如OJBECT、FUNC、GLOBAL、DEFAULT等等。——谁都知道程序中了很多符号表,但里面的含义、字段似乎就不知道了。
有几本书还是讲得比较好的,比如《Linux性能详解》、《程序员的自我修养》等等。
并非在下钻牛角尖,我只是觉得,作为一个刚出来混的程序员,有必要去了解这些东西——更何况,目前还处于打酱油阶段,何不趁有时间再研究研究?天知道以后还会不会有现今这心情、这时间!
在IBM的devoloperworks看到一句话:
“其实有很多东西只要勤于思考,还是能够自己悟出一些道理的。国外有一些高手就是通过能够大家都能见到的的一点点资料,自己摸索出来很多不为人知的秘密。”
“学习计算机很关键的一点在于一定要富于探索精神,要让自己做到知其然并知其所以然。”
辛苦不怕,动手不怕,师父领进门,修行靠各人,奈何无半点指导,凭自己摸索,漫漫长路,走得坎坷,亦无人知。而且,这么久,还不一样走过来。不过,现在工作了就要注意效率与时间了。
主要是想了解一下进程在main执行之前做了什么、之后又做了什么,谁在做等等问题,但比较少资料情况下感慨一下,大家有什么好的资料不妨介绍一下,100分,不多。
|
呵呵,很久没有看到这么爱学习的同鞋了,鼓励一下~
1 从你的文章来看,我认为你已经熟悉linux的基本操作,(shell,代码的编辑,编译,运行等基础)
2 然后你开始思考了:
但是你提到的这些所谓底层的东西实际上只是表面,这些东西(binutils,objdump,strings...)都只是对OS,编译器,加载器的一个具体实现而已(linux下)。
可能你真正需要的是去__潜心__看__一本__描述如何实现那些经典的计算机理论的书(比如linker&loader,computer system:a programmer‘s perspective;UEAP),这些书描述了如何在linux环境实现代码/进程的加载运行,运行状态变化,相互之间的通信。。。。
但是,本质上,这些都只是具体环境实现,进程完全可以不用这样编译,不用这样加载,就像windows下的编译后binary和linux下的完全不一样,加载实现也不一样。但是他们的本质是一样的。
其实我还有很多话想说,但是我真的太懒了,而且这些东西最终还是要靠自己“悟”
PS
你的学习方法不对,linux的美在于OpenSource,去看别人的代码,看bintuils的代码。
Linus Torvalds这个鸟人曾经很niubility的说过:
Read The Fu*king Source Code!!
我曾经说过:
Code tell the turth!
1 从你的文章来看,我认为你已经熟悉linux的基本操作,(shell,代码的编辑,编译,运行等基础)
2 然后你开始思考了:
但是你提到的这些所谓底层的东西实际上只是表面,这些东西(binutils,objdump,strings...)都只是对OS,编译器,加载器的一个具体实现而已(linux下)。
可能你真正需要的是去__潜心__看__一本__描述如何实现那些经典的计算机理论的书(比如linker&loader,computer system:a programmer‘s perspective;UEAP),这些书描述了如何在linux环境实现代码/进程的加载运行,运行状态变化,相互之间的通信。。。。
但是,本质上,这些都只是具体环境实现,进程完全可以不用这样编译,不用这样加载,就像windows下的编译后binary和linux下的完全不一样,加载实现也不一样。但是他们的本质是一样的。
其实我还有很多话想说,但是我真的太懒了,而且这些东西最终还是要靠自己“悟”
PS
你的学习方法不对,linux的美在于OpenSource,去看别人的代码,看bintuils的代码。
Linus Torvalds这个鸟人曾经很niubility的说过:
Read The Fu*king Source Code!!
我曾经说过:
Code tell the turth!
|
静态库、动态库、程序如何加载,这些很少有书讲吧,难以成书,研究下加载函数吧。
程序地址空间分布、堆、栈,这是编译原理,
linux平台入口函数和初始化函数,什么初始化函数?
ld-linux-so.x是我想了解的,待研究中。
感觉还是要有项目来驱动你,不然你确实无从下手。
程序地址空间分布、堆、栈,这是编译原理,
linux平台入口函数和初始化函数,什么初始化函数?
ld-linux-so.x是我想了解的,待研究中。
感觉还是要有项目来驱动你,不然你确实无从下手。
|
第一点,《程序员的自我修养》这本书讲了不少,它的副标题就是链接加载与库。
第二点, 一个图就说明了http://liar.pangwa.com/wp-content/uploads/2008/04/mem.bmp
第三点,《程序员的自我修养》也讲了。
有东西来驱动很重要,呵呵,有动力学东西快。