随笔分类 - 理论部分
摘要:转自:https://blog.csdn.net/rosetta/article/details/8933200 64KB-4GB-64TB? 我记得大学的汇编课程,组成原理课里老师讲过实模式和保护模式的区别,在很多书本上也有谈及,无奈本人理解和感悟能力实在太差,在很长一段时间里都没真正的明白它们的
阅读全文
摘要:静态库 1.将.c生成.o文件 gcc-cadd.c-o add.o 2.使用ar工具制作静态库 ar rcs lib库名.a add.o sub.o div.o 3.编译静态库到可执行文件中 gcc test.c1ib库名.a-o a.out 制作静态链接库的过程中要用到 gcc 和 ar 命令。
阅读全文
摘要:翻译自:Understanding ld-linux.so.2 前言 ld-linux.so.2是linux的动态加载器(dynamic loader)。本文试图就ld-linux.so.2如何与Linux交互,如何与正在调用的应用程序进行交互 给出一个概述。 什么是ld-linux.so 现在,大
阅读全文
摘要:转自:Chapter 9. Dynamic Linking 参考:Linux动态链接器 Linux加载启动可执行程序的过程(一)内核空间加载ELF的过程 Linux加载启动可执行程序的过程(二)解释器完成动态链接 本文和 理解ld-linux.so.2 内容上有点重复 动态链接器——Dynamic
阅读全文
摘要:参考 静态链接 VS 动态链接 静态库 VS 动态库 实验环境 OS:Windows10 企业版 IDE:Visual Studio 2017旗舰版 前言 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用
阅读全文
摘要:转自:宏与分号 细节决定成败! 如果留心的话,可以看到 linux内核代码经常有这么奇怪的宏定义: 引用 #define wait_event(wq, condition) do { if (condition) break; __wait_event(wq, condition); } while
阅读全文
摘要:原文:C语言字节对齐问题详解 结构体字节对齐的细节和具体编译器实现相关,但一般而言满足三个准则: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 2) 结构体每个成员相对结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal
阅读全文
摘要:定义与声明的关系,其实“强弱符号关系”。 谁是强符号,谁是弱符号 函数定义:强符号 函数声明:弱符号 初始化了的全局变量:强符号,我们常将这种称为定义 未初始化的全局变量:弱符号,我们常将这种称为声明 强弱符号的统一规则 ①不能允许重复出现同名的强符号,但是允许重复出现有同名的弱符号 在a.c中同时
阅读全文
摘要:Linux下c内存映像 大方向分为 应用空间 + 内核空间 他俩内存空间布局差不多。这里重点回顾分析应用空间布局,应用空间分为:代码段 + 数据段(静态数据段+动态数据段) 代码段 为啥是只读的 代码段在编译时就定好了,在程序的运行过程中,不能在代码段去开辟空间,以及释放空间。 包含哪几部分 ELF
阅读全文
摘要:复杂C源码中,往往可以经常看到各种宏的比较深入的用法,所以我们这里举一些宏的比较高级的、比较深入的用法的例子。 使用宏来代替简短函数 参考:C++——引用 例子 #include <stdio.h> void exchange(int *p1, int *p2) { int tmp = 0; tmp
阅读全文
摘要:由于C++兼容C语法,所以C的条件编译,在C++中也适用。 什么是条件编译 从“条件编译”这个名字上就能看出,所谓“条件编译”其实就是“按照条件去编译”。也就是“预编译”时,预编译器处理“条件编译”时,可以通过“条件编译”帮你保留某些代码、以及帮你去掉某些代码,第二阶段编译时就只编译保留的代码。一般
阅读全文
摘要:编译4个过程:预处理,编译,汇编,连接。宏就是在预处理阶段发挥作用。 宏结尾没有;,因为凡是;结尾的东西,都是由第二阶段“编译”来处理的(a.i->a.s),而所有预编译的代码都是在预编译阶段处理的,为了以示区分,所以所有预编译的代码都不需要分号结尾。 宏有两种,一种是有宏体宏,另一种是无宏体宏。
阅读全文
摘要:对比参考:剖析.o文件ELF组成 相比.o的ELF格式,有哪些变化? .rel.text和.rel.data消失了 为什么这两个节会消失? 链接器将各.o中同名的.text和.data节整合到一起时,会对整合后的.text和.data进行重定位。其实重定位时主要针对就是.text和.data节,不过
阅读全文
摘要:参考:剖析.o文件ELF组成 目标文件 .symtab中记录的符号是从.s文件来的,所以.s这个汇编文件很关键。 .symtab所记录符号的种类 示例代码 a.c extern int a_va1 = 100; static float a_va2 = 200.0; static void a_fu
阅读全文
摘要:目标文件种类 有三种 ①可重定位目标文件 被用于静态链接的文件,都是可重定位目标文件。根据这个概念,静态库文件(.a/.lib)和.o文件都是“可重定位目标文件”,因为它们都是静态链接的。 疑问:为什么称为“可重定位”? 因为静态连接时,逻辑地址需要被重定位为运行地址,所以就被称为可重定位目标文件。
阅读全文
摘要:ELF文件结构组成 ①总共13个节 ②每个节都有一个编号。从ELF头开始编号,编号从0开始,编号的作用就是用来索引(找到)不同节的。 ③每个.o的都是这样的结构。链接时要做的就是,将ELF格式的.o全部合成为一个完整的ELF格式可执行文件。 ④.o中每个节的逻辑地址都是从0开始的 ELF头 ELF格
阅读全文
摘要:如何得到库 ①先写好一堆的.c文件(.c:我们所需要的各种工具函数) ②将这些.c编译为对应的.o ③将所有的这些.o打包为一个仓库文件(静态库或者动态库) 静态库:按照静态库的方式打包 动态库:按照动态库的方式打包 因为打包的规则不同,所以得到库也是不同的 共性与个性 二者的共性 都是事先做好的.
阅读全文
摘要:什么是链接? 链接其实就是连接的意思,将所有相关的东西连接起来。 简单理解静态连接和动态链接: 静态链接:编译时完成链接 动态链接:程序运行起来后,根据需求再去链接,这就是动态链接 静态链接 什么是静态链接 所谓静态链接,其实就是在编译时,调用ld/collect2链接程序,将所有的.o中的机器指令
阅读全文
摘要:分析gcc -v的详细信息的意义 首先我们需要清楚一点,我们并不能完全弄清楚gcc -v的所有信息,因为毕竟我们并不是GCC编译器集合的实现者,对于这些信息,他们才是最清楚的。由于我们不能将所有的信息都搞清楚,所以我们只分析关键信息。虽然我们不能将所有信息都全部弄清楚,但是分析里面的关键信息还是非常
阅读全文