1. 装载时重定位的理解 1. 程序内存地址的不可预测性 在现代操作系统中,每个程序和共享库(如动态链接库)在启动时并不知道它们将被加载到哪一块内存区域。操作系统通过虚拟内存技术为每个进程分配独立的内存空间,虚拟地址空间对于每个进程来说是隔离的。 然而,程序代码和数据中很多地方都需要依赖内存地址来进行访问。例如,程序中的函数调用和全局变量都使用具体的内存地址。 但是,问题在于: ...
1. 从操作系统角度看看可执行文件的加载 1.1进程建立过程 1. 创建一个独立的虚拟地址空间 操作系统通过 execve() 系统调用为新进程创建一个干净的虚拟地址空间。 清理旧地址空间中的内容(如代码段、数据段、堆栈等)。 分配基本的地址空间结构,包括 用户态内存区域 和 内核态内存区域。 创建虚拟地址与物理地址的映射(可做) 2. 读取可执行文件头, 建立 ...
1. ELF 文件结构概览 ELF(Executable and Linkable Format)是一种常见的文件格式,用于可执行文件、目标文件、共享库和核心转储文件。其整体结构如下: ELF 文件的主要组成部分 ELF Header 描述文件的全局信息。 提供 Program Header Table 和 Section Header Table...
1. 有关linux 配置文件 主要区分 全局配置 用户配置 over profile 全局, 全用户配置 一般不建议在/etc/profile文件中添加环境变量,因为在这个文件中添加的设置会对所有用户起作用。 bashrc 系统级 /etc/bashrc,对所有用户生效 用户级 ~/.bashrc,仅对当前用户生效。 ...
1. 有关cpu物理核 # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l # 查看每个物理CPU中core的个数(即核数) cat /proc/cp...
1. 概览 为什么需要动态链接? 静态链接方式对计算机内存和磁盘空间的浪费非常严重。 程序的开发与发布, 一旦程序的一个小部分做出更改, 那么则需要对整个程序进行重新下载。 静态链接的基本思想 把程序的模块互相分割开来,不再将他们静态的链接在一起。 把链接的过程推迟到运行时进行, 即为动态链接。 一...
1. 规则 1.1基本规则 all: echo "Hello World" 输出: make echo "hello word"; hello word make all echo "hello word"; hello word make test make: *** No rule to make target 'test'. Stop. 改动一下呢? ...
以下面一个demo为例说明静态链接: // a.c extern int shared; int main() { int a = 100; swap(&a, &shared); } // b.c int shared = 1; void swap(int *a, int *b) { int* temp = b; b = a; ...
3.1 目标文件格式 目标文件 经过编译器编译后产生的文件叫做目标文件。 可执行文件 链接后的目标文件。 现在pc平台流行的可执行文件格式主要为windows 的 PD 和 Linux 下的ELF文件。 3.2 ELF文件格式 文件头(File Header) 描述文件属性(可执行, 静态链接,动态链接,入口地...
2.1 被隐藏的过程 C语言经典“hello word”,在linux下的编译过程: #include <stdio.h> int main() { printf("hello word"); return 0; } 我们常使用的编译如下: gcc hello.c ./a.out 实时上, 上述过程可以分解为4个步骤,分别为...