zoukankan      html  css  js  c++  java
  • 【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)
    • 在链接时,链接器将只复制被程序引用的目标模块
    创建一个静态库
    链接静态库
    • 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)

    • 转换技巧:
    1. A(10) C(12) F(15)
    2. 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
  • 相关阅读:
    数据压缩和归档
    数据持久化
    文件和目录的使用
    数据及数据处理
    data types
    string services
    logging模块
    指导
    比较两个NSDate类型的参数相差的时间差
    推送 iOS 10
  • 原文地址:https://www.cnblogs.com/protectmonarch/p/7614983.html
Copyright © 2011-2022 走看看