![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux
文章平均质量分 90
以Android性能优化实战为线索,由点到面深入Linux各个环节,结合Android掌握Linux系统原理,提高工程化编码能力和思维能力。
林树杰
输入->输出,在coding和记录中成长。
“如果你不能很好的教会别人,那么你就没有掌握这个技能”
希望我的记录能够帮助大家在技术前进的路上少走一点弯路,贡献一份微薄的力量。
欢迎关注,一起成长!
展开
-
Linux:动态链接
Linux系统为动态链接器提供了一个简单的接口,允许应用程序在运行时加载和链接共享库。dlopen 函数加载和链接共享库 filename。用已用带 RTLD_GLOBAL 选项打开了的库解析 filename中的外部符号。如果当前可执行文件是带-rdynamic 选项编译的,那么对符号解析而言,它的全局符号也是可用的。flag 参数必须要么包括 RTLD_NOW,该标志告诉链接器立即解析对外部符号的引用,要么包括 RTLD_LAZY 标志,该标志指示链接器推迟符号解析直到执行来自库中的代码。原创 2023-12-22 18:56:00 · 276 阅读 · 0 评论 -
Linux:ELF 可执行文件的解析与其加载的原理
文章目录ELF 可执行文件需要的前置知识ELF 可执行文件的程序头部表加载可执行目标文件QA加载器如何工作?参考ELF 可执行文件我们已经看到链接器如何将多个目标文件合并成一个可执行目标文件。我们的 C程序,开始时是一组 ASCII 文本文件,现在已经被转化为一个二进制文件,且这个二进制文件包含加载程序到内存并运行它所需的所有信息。图 7-13 概括了一个典型的 ELF 可执行文件中的各类信息。可执行目标文件的格式类似于可重定位目标文件的格式。ELF 头描述文件的总体格式。它还包括程序的入口点(原创 2023-12-21 10:50:14 · 305 阅读 · 0 评论 -
Linux 链接器如何使用静态库来解析引用
链接器通过在链接过程中查找静态库中的目标文件,将其合并到可执行文件中,从而解析了对静态库中定义的函数和变量的引用。这样,程序就能够在运行时访问静态库中的功能。这也是静态库在编译时被链接到可执行文件中的基本原理。原创 2023-12-14 23:48:27 · 612 阅读 · 0 评论 -
linux :与静态库链接
我们知道,链接器可以读取一组可重定位目标文件,并把它们链接起来,形成一个输出的可执行文件。实际上,所有的编译系统都提供一种机制,将所有相关的目标模块打包成为一个单独的文件,称为静态库(static library),它可以用做链接器的输入。当链接器构造一个输出的可执行文件时,它只复制静态库里被应用程序引用的目标模块。原创 2023-12-12 11:49:00 · 99 阅读 · 0 评论 -
Linux:符号和符号表
想象一下你在学校里,老师在黑板上写了一些字母和数字,比如"A"、“B”、“1”、“2”。这些字母和数字就是符号。在计算机编程或数学中,符号就是用来代表某个特定概念或值的标记。举个例子,假设你写了一个计算机程序,里面有一个变量叫做"score",用来表示游戏中的分数。在这里,"score"就是一个符号,它代表了一个特定的值,即分数。符号可以是字母、数字或其他字符的组合,它们被赋予特定的含义,让程序员或计算机能够理解并操作这些符号代表的信息。原创 2023-12-11 21:30:27 · 376 阅读 · 0 评论 -
Linux:ELF
预处理器处理的文件是源代码文件,生成的文件通常是.i后缀的中间文件,例如hello.i。链接:使用链接器将程序中的不同模块连接起来,并生成可执行文件。编译器处理的文件是预处理器生成的.i文件,生成的文件通常是.s后缀的汇编代码文件,例如hello.s。处理的文件是编译器生成的.s文件,生成的文件通常是.o后缀的目标文件,例如hello.o。在整个编译过程中,涉及到的文件可以分为源代码文件(.c文件)、预处理生成的文件(.i文件)、编译器生成的文件(.s文件、.o文件)和链接器生成的文件(可执行文件)。原创 2023-12-11 18:55:10 · 357 阅读 · 0 评论 -
计算机的目标文件是什么? 在程序中充当什么角色?
ELF头以一个 16 字节的序列开始,这个序列描述了生成该文件的系统的字的大小和字节顺序。其中包括 ELF头的大小、目标文件的类型(如可重定位、可执行或者共享的)、机器类型(如 x86-64)、节头部表(section header table)的文件偏移,以及节头部表中条目的大小和数量。不同节的位置和大小是由节头部表描述的,其中目标文件中每个节都有一个固定大小的条目(entry)。.debug:一个调试符号表,其条目是程序中定义的局部变量和类型定义,程序中定义和引用的全局变量,以及原始的 C 源文件。原创 2023-12-05 11:24:10 · 244 阅读 · 0 评论 -
什么是静态链接?有什么用?
在编译器的语境中,符号(Symbol)是指用户定义的名称、变量、函数、类、模块等实体的名称,也可以理解为程序中标识某个变量或函数的标签或名字。在编译器将源代码转化为目标文件的过程中,编译器会将这些符号存储在目标文件的符号表中。在链接时,链接器会读取多个目标文件中的符号表,并将它们合并起来,以便能够在程序中正确地访问各个变量和函数。符号解析(Symbol Resolution)是指在链接阶段确定每个符号最终所代表的地址或实现,并将符号引用替换成符号定义,从而使得程序能够正确地运行。原创 2023-12-05 10:50:09 · 227 阅读 · 0 评论 -
什么是链接?
链接(linking)是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载(复制)到内存并执行。原创 2023-11-28 10:40:29 · 102 阅读 · 0 评论 -
虚拟内存的基本概念
代码和数据区在进程一开始运行时就被指定了大小,与此不同,当调用像 malloc 和 free 这样的 C标准库函数时,堆可以在运行时动态地扩展和收缩。大约在地址空间的中间部分是一块用来存放像 C标准库和数学库这样的共享库的代码和数据的区域。在 Linux 中,地址空间最上面的区域是保留给操作系统中的代码和数据的,这对所有进程来说都是一样。对所有的进程来说,代码是从同一固定地址开始,紧接着的是和C全局变量相对应的数据位置。地址空间的底部区域存放用户进程定义的代码和数据。《深入理解计算机系统》原创 2023-11-27 10:17:28 · 124 阅读 · 0 评论 -
程序的执行原理(下)
处理器从程序计数器指向的内存处读取指令,解释指令中的位,执行该指令指示的简单操作,然后更新 PC,使其指向下一条指令。比如,在运行 Linux 的 x86-64 机器上,short 类型的数据需要 2个字节,int 和 float 类型需要 4 个字节,而 long和 double类型需要 8个字节。从逻辑上来说,存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从零开始的。寄存器文件是一个小的存储设备,由一些单个字长的寄存器组成,每个寄存器都有唯一的名字。原创 2023-11-22 15:32:02 · 62 阅读 · 0 评论 -
计算机系统的存储原理
针对这种处理器与主存之间的差异,系统设计者采用了更小更快的存储设备,称为高速缓存存储器(cache memory,简称为 cache 或高速缓存),作为暂时的集结区域,存放处理器近期可能会需要的信息。比如说,一个典型系统上的磁盘驱动器可能比主存大 1000 倍,但是对处理器而言,从磁盘驱动器上读取一个字的时间开销要比从主存中读取的开销大 1000 万倍。系统可以获得一个很大的存储器,同时访问速度也很快,原因是利用了高速缓存的局部性原理,即程序具有访问局部区域里的数据和代码的趋势。原创 2023-11-22 16:29:05 · 60 阅读 · 0 评论 -
程序的执行原理(上)
hello程序的生命周期是从一个源程序(或者说源文件)开始的,即程序员通过编辑器创建并保存的文本文件,文件名是 hello.c。但是,为了在 C程序中做出好的编码选择,我们确实需要了解一些机器代码以及编译器将不同的 C语句转化为机器代码的方式。printf 函数存在于一个名为 printf.o的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到我们的 hello.o程序中。系统中所有的信息一一包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串bit表示的。原创 2023-11-22 09:57:17 · 367 阅读 · 0 评论 -
Linux线程概况
对于一个进程,它在被执行前其实是一个可执行程序。这个程序是被放在磁盘上的,当它要被执行的时候,它先被加载到内存当中,然后再放入到寄存器中,最后再让cpu执行该程序,这个时候一个静态的程序就变成了进程。轻量级进程(light-weight process),也有PCB,创建线程使用的底层函数和进程一样,都是clone。从内核里看进程和线程是一样的,都有各自不同的PCB,但是PCB中指向内存资源的三级页表是相同的。也有PCB,但没有独立的地址空间(共享),Linux下最小的执行单位,调度的基本单位。原创 2023-11-17 20:48:29 · 639 阅读 · 0 评论 -
Linux可执行文件的装载与进程1
有人做过一个很有意思的比喻,说把程序和进程的概念跟做菜相比较的话,那么程序就是菜谱,计算机的 CPU就是人,相关的厨具则是计算机的其他硬件,整个炒菜的过程就是一个进程。比如上例中,操作系统创建进程后,会在进程相应的数据结构中设置有一个text 段的 VMA:它在虚拟空间中的地址为0x08048000~0x08049000,它对应 ELF 文件中偏移为0的text,它的属性为只读(一般代码段都是只读的),还有一些其他的属性。上面的例子中,我们描述的是最简单的只有一个段的可执行文件映射的情况。原创 2023-11-02 18:58:24 · 102 阅读 · 0 评论 -
Linux可执行文件的装载与进程2
最近打算抽空学习张绍文老师的《Android开发高手课》。想要彻底理解的实现原理。发现理解起来都没有那么容易,在阅读代码的过程中,发现C++、linux、native hook、framework等方面的功底均有所不足。张绍文老师说过:“看再多的文章,不去思考文章所讲的内容和意图也是没用的;思考再多,不去动手真正实践也是没用的。“把进阶的各个主题由点到线串联起来,但这背后必然少不了一些基础的、底层的知识进行支撑”。这里就把空缺的知识进行补足。原创 2023-11-03 16:39:07 · 86 阅读 · 0 评论 -
Linux动态链接1:动态链接的基本概念
在现在的 Linux 系统中,一个普通程序会使用到的C语言静态库至少在 1MB 以上,那么,如果我们的机器中运行 100 个这样的程序,就要浪费近 100 MB 的内存:如果碰盘中有 2 000 个这样的程序,就要浪费近2 GB 的盘空间很多 Linux 的机器中,/usr/bin 下就有数千个可执行文件。任何一个进程访问的只是自己的那个副本,而不会影响其他进程。对于同一个进程的两个线程来说,它们访问的是同一个进程地址空间,也就是同一个 lib.so 的副本,所以它们对 G 的修改,对方都是看得到的。原创 2023-11-01 19:08:59 · 179 阅读 · 0 评论 -
Linux动态链接2:动态链接的相关结构
首先操作系统会读取可执行文件的头部,检查文件的合法性,然后从头部中的“ProgramHeader”中读取每个“Sgment”的虚拟地址、文件地址和属性,并将它们映射到进程虚拟空间的相应位置,这些步骤跟前面的静态链接情况下的装载基本无异。动态链接器在 Linux 下是 Glibc 的一部分,也就是属于系统库级别的,它的版本号往往跟系统中的 Glibc 库版本号是一样的,比如我的系统中安装的是 Glibc 2.6.1,那么相应的态链接器也就是/ib/ld-2.6.1.so。原创 2023-11-02 19:01:23 · 173 阅读 · 0 评论 -
Linux动态链接3:动态链接的实现和步骤
最近打算抽空学习张绍文老师的《Android开发高手课》。想要彻底理解本地监控APP内存的框架的实现原理。发现理解起来都没有那么容易,在阅读代码的过程中,发现C++、linux、native hook、framework等方面的功底均有所不足。张绍文老师说过:“看再多的文章,不去思考文章所讲的内容和意图也是没用的;思考再多,不去动手真正实践也是没用的。“把进阶的各个主题由点到线串联起来,但这背后必然少不了一些基础的、底层的知识进行支撑”。这里就把空缺的知识进行补足。原创 2023-11-03 18:21:49 · 44 阅读 · 0 评论 -
Linux动态链接4:运行时链接
最近打算抽空学习张绍文老师的《Android开发高手课》。想要彻底理解本地监控APP内存的框架的实现原理。发现理解起来都没有那么容易,在阅读代码的过程中,发现C++、linux、native hook、framework等方面的功底均有所不足。张绍文老师说过:“看再多的文章,不去思考文章所讲的内容和意图也是没用的;思考再多,不去动手真正实践也是没用的。“把进阶的各个主题由点到线串联起来,但这背后必然少不了一些基础的、底层的知识进行支撑”。这里就把空缺的知识进行补足。原创 2023-11-03 18:50:22 · 86 阅读 · 0 评论 -
操作系统(二)从图灵机到现代计算机
一:从白纸到图灵机图灵机是英国数学家A.C.图灵于1936年提出的一个模型。小孩子算数在聊图灵机之前,我们先来想象这样一个场景:一个小孩想要计算一条算式:2 + 4 = ?。于是小孩在大脑里面想要计算的是2 + 4,然后把“2 + 4”写到白纸上。然后使用他的手指数数,左手摆出了两个手指,右手摆出四个手指。于是数两个手的手指一共是六个。最后把结果6写到白纸上。好,以上就是小孩执行一个计算的 全过程。图灵机图灵想到的是如何使用机器来模拟人类计算一道算术题的过程。他创造了这样一个机器,一个控制原创 2021-06-14 19:54:46 · 1145 阅读 · 2 评论 -
操作系统(一)什么是操作系统
要了解操作系统是什么,要从计算机说起。那么什么是计算机?计算机,我们平日习惯叫做电脑。实际上,确切地说是计算机硬件。以下是计算机硬件的大概原理图。原创 2021-06-14 15:14:54 · 2743 阅读 · 1 评论