【CS】知识索引汇总
Chapter 7
hello.o -> hello (链接)
一、静态链接
- 主要是将符号对应起来
- 两个主要任务:符号解析(符号引用与符号定义的对应)、重定位(符号定义与内存位置的对应)
1. 符号解析
- 解析多重定义的全局符号:规则:强符号(函数和已初始化的全局变量)、弱符号(未初始化的全局变量),1.强强× 2.强弱 强√ 3.弱弱 随机
2. 重定位
- 重定位节和符号定义:将所有相同类型的节合并为同一类型的新个聚合节
- 重定位节中的符号引用:修改代码节中对每个符号的引用,使得它们指向正确的运行时地址,依赖于重定位条目
(1)重定位条目
其中的重定义类型(主要的两个)
- R_X86_64_PC32:重定义一个使用32位PC相对地址的引用,指令中编码的32位值加上PC的当前运行值;PC值通常是下一条指令在内存中的地址。
- R_X86_64_32:重定义一个使用32位绝对地址的引用,指令中编码的32位值
二、动态链接
三、可重定位目标文件(.o)
- 图7-3
- 包含内容:ELF头、已编译程序的机器代码(.text)、对应辅助表:符号集合及符号表(.rodata、.data、.bss、.symtab、.rel.data、【】、.debug、【】、【】)、.text节中位置表(.rel.text)、原C行号与.text节中机器指令间映射表(.line)、字符串表(.strtab)、节头部表
- 节:ELF头~.strtab都是节,节头部表是描述目标文件的节
1. 符号表
- 每个可重定位目标模块m都有一个符号表
- 在链接器的上下文中,有三种符号:定义且能被引用、被引用、定义不能被引用(static 函数 全局变量)
- 符号表格式(.symtab中的ELF符号表)P469:name、binding、section、value、size等
四、可执行目标文件
- 图7-13
- 执行文件的连续的片(chunk)被映射到连续的内存段。程序头部表(program header table)描述了这种映射关系
加载可执行目标文件
- 怎么加载:Linux程序通过调用execve函数来调用加载器(loader)(操作系统代码),加载器来运行该可执行目标文件
- 什么叫加载:将程序复制到内存并运行的过程叫做加载
- (内核:操作系统驻留在内存的部分)
- 图7-15
五、静态库
- 相关的函数可以被编译为独立的目标模块,然后封装成一个单独的静态库文件(.a)
- 在链接时,链接器将只复制被程序引用的目标模块
创建一个静态库
- AR工具
ar rcs libvector.a addvec.o multvec.o- replace create 索引
链接静态库
gcc main2.o libvector.a -static -o prog2c- -static参数告诉编译器驱动程序,链接器应该构建一个完全链接的可执行目标文件
用 静态库来符号解析
- 存档文件(.a):一组连接起来的可重定位目标文件的集合,有一个头部来描述每个成员目标文件的大小和位置。
- 目标文件
- E U D
- 命令行上库、目标文件的顺序
六、动态库(动态链接共享库)
- 共享库(.so)(shared library)(DLL 动态链接库(微软)):目标模块,可以加载到任意的内存地址,并和一个在内存中的程序链接起来,这个过程叫动态链接(dynamic linking),由动态链接器(dynamic linker)程序执行。
创建动态库
gcc addvec.c multvec.c -shared -fpic -o libvector.so
链接动态库
gcc main2.c libvector.so -o prog2l
第一部分:程序结构和执行
chapter2
序言
浮点数
- 编码:表示实数的科学记数法的以2为基数的版本 (???)
- 溢出:值为+∞
- 计算:不可结合的(因精度有限)
值:近似的
- 大量计算机的安全漏洞都是由于计算机算术运算的微妙细节引发的
计算机用几种不同的二进制表示形式来编码数值(如不同长度的整数和浮点数)
信息存储
- 最小可寻址的内存单位:字节
- 虚拟内存:内存,一个非常大的字节数组
- 虚拟地址空间:一个概念性映像,实际的实现是将各种硬件软件结合起来,为程序提供一个看上去统一的字节数组
- 每个程序对象可以简单视为一个字节块,而程序本身就是一个字节序列
- 程序对象:程序数据、指令、控制信息
- gcc -m32 prog.c
十六进制(hex)
- 转换技巧:
- A(10) C(12) F(15)
- 2^n (100000...000)2 (n个0)转换成hex要点:4* +
大端 小端
- 三种需要注意大端 小端的情况
- typedef 可以来命名数据类型
Chapter 10 : 系统级I/O
Unix I/O
- 描述符:应用程序向内核申请打开某文件时,内核返回该文件的描述符,应用程序可用它来标识文件,而对于这个打开文件的所有信息则有内核来记录。
文件
- 文件类型:普通文件、目录、套接字(socket)等
基本操作过程
打卡和关闭文件
- open
- close
读和写文件
- read
- write
用RIO包健壮地读写
- 自动为你处理不足值
- 分类:无缓冲的输入输出函数、带缓冲的输入函数
无缓冲的输入输出函数
- rio_readn 不带缓冲
- rio_readnb 带缓冲
- rio_readlineb 从内部缓冲区复制一个文本行,当缓冲区变空,自动调用read重新填满
- rio_readinitb 创建一个空的读缓冲区,并将一个打开的文件描述符和这个缓冲区联系起来
- rio_writen
读取文件元数据
- stat
- fstat
【CS】知识索引汇总的更多相关文章
- ITPUB网站的知识索引汇总
1. ITPUB知识索引树 http://www.itpub.net/tree/ http://www.itpub.net/pubtree/index.htm 2. ITPUB知识索引贴——全文索引 ...
- mysql基础知识语法汇总整理(一)
mysql基础知识语法汇总整理(二) 连接数据库操作 /*连接mysql*/ mysql -h 地址 -P 端口 -u 用户名 -p 密码 例如: mysql -u root -p **** /* ...
- mysql基础知识语法汇总整理(二)
mysql基础知识语法汇总整理(一) insert /*insert*/ insert into 表名(字段列表) values(值列表); --蠕虫复制 (优点:快速复制数据,测试服务器压力) in ...
- MySQL查询不使用索引汇总 + 如何优化sql语句
不使用索引原文 : http://itlab.idcquan.com/linux/MYSQL/918330.html MySQL查询不使用索引汇总 众所周知,增加索引是提高查询速度的有效途径,但是很多 ...
- 关于DDD领域驱动设计的理论知识收集汇总
原文:关于DDD领域驱动设计的理论知识收集汇总 最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一 ...
- 年底巩固下 CS 知识「GitHub 热点速览 v.21.49」
作者:HelloGitHub-小鱼干 期末到了!是时候来一波 CS 复习资料了,从本科基础知识开始到实用编程技术.本周 GitHub 热点趋势榜给你提供了最全的复习资料:清华的 CS 四年学习资料.W ...
- BW知识问答汇总
什么是sap的星型结构,能不能详细讲解一下? Cube的星型结构中SID技术的优点有哪些? 什么是BW的星型结构,与传统的星型结构的区别是什么? SAP的星型结构相对于传统的星型结构优势? Cube与 ...
- [转]eoe社区cocos2d-x游戏引擎知识大汇总
[eoeAndroid 社区]特意为大家汇总了cocos2d-x知识贴,分量十足,纯正干或.从基础教程到游戏应用的开发,我们不让知识流失,我们要做知识的搬运工还有加工 师.希望大家能够一起的学习,和大 ...
- 【学习】数据处理基础知识(汇总和计算描述统计)【pandas】
pd对象拥有一组常用的数学和统计方法.大部分都属于约简和汇总统计,用于从Series中单个值,如sum 和 mean 或从DF的行或列中提取一个Series. 1. 描述和汇总统计方法 #汇总和计算描 ...
随机推荐
- codeforces 156D Clues(prufer序列)
codeforces 156D Clues 题意 给定一个无向图,不保证联通.求添加最少的边使它联通的方案数. 题解 根据prufer序列,带标号无根树的方案数是\(n^{n-2}\) 依这个思想构建 ...
- 寒假关于计算机课程的学习计划(第二次作业<二>)
由于自己刚从紧张的高中学习中解脱出来,进入大学学习意识不够重视,导致学业与别人相差较大,特别是C语言,所以打算寒假主要先补一补C语言.自己在网上查找了很多资料,包括浙江大学翁凯老师在网易云课堂讲的&l ...
- Java的日期时间
Date类 Date d = new Date() 使用SimpleDateFormat格式化日期. SimpleDateFormat允许用户自定义日期时间格式来运行. package cuiyuee ...
- Java的Stream流
yi.控制台输入输出流, 1.读取控制台输入 Java的控制台输入由System.in完成.为了获得一个绑定到控制台的字符流,可以把System.in包装在一个BufferedReader对象中来创建 ...
- mac使用指南--软件安装部分
最近因为开发需要,换了个mac,发现和Windows下面的操作和习惯真是千差万别啊,在这里记录一下,有需要的也可以参考一下. 安装前强烈建议根据个人习惯设置好触控板!!!什么单击双击选中拖拽的统统设好 ...
- 2018-2019-2 网络对抗技术 20165322 Exp6 信息搜集与漏洞扫描
2018-2019-2 网络对抗技术 20165322 Exp6 信息搜集与漏洞扫描 目录 实验原理 实验内容与步骤 各种搜索技巧的应用 DNS IP注册信息的查询 基本的扫描技术 漏洞扫描 基础问题 ...
- BZOJ1972:[SDOI2010]猪国杀(模拟)
Description 太长就不贴过来了 Solution 这个题是真的不难写……唯一的难度就在于理解题意上面……感觉这就是个阅读理解题啊…… 而且你三国杀玩的越多可能就越难写因为你无法理解那些猪的思 ...
- Kali-linux无线网络嗅探工具Kismet
如果要进行无线网络渗透测试,则必须先扫描所有有效的无线接入点.刚好在Kali Linux中,提供了一款嗅探无线网络工具Kismet.使用该工具可以测量周围的无线信号,并查看所有可用的无线接入点.本节将 ...
- YourUninstaller注册码(可用)
Name:Giveawayoftheday Registration code: 000017-2PNBK2-J59U6F-317E09-R5TGJQ-6B1WNA-AZCYNJ-GVP86A-7VP ...
- python执行linux和window的命令
linux: python执行shell脚本常用的方法 import os val=os.system("shell语句") >>> val=os.system ...