• 2017-2018 20155309南皓芯 信息安全系统基础设计第一周博客


    这是本学期娄老师课程的第一篇博客,新学期应该有一个新的开始,正所谓新学期新气象,希望这学期能够改掉过去的那些坏毛病,能以一个崭新的姿态迎接新学期的到来。首先第一周应该学习的是教材的第一章和第七章。

    首先是第一章的内容

    教材内容学习

    计算机系统漫游

    最开始就是复习一下之前所学到的知识,也就是计算机系统是由硬件与软件系统所组成的。整体泛读一下第一章的内容,我们可以发现第一章大部分来说是基本概念,信息就是位加上文。首先了解到hello程序的生命周期是从一个源文件开始的。然后巩固了一下二进制有关的知识。
    其次就学习到了程序被其他程序翻译成不同的格式,书中有一个类似表格的流程十分重要。也就是预处理器通过hello.i到达编译器接着通过hello.s到达汇编器然后通过Hello.o到达链接器。其次简要的了解一下GNU项目。

    接下来学习的是第七章的内容

    链接

    链接是将各种代码和数据片段收集并组合成为一个单一文件的过程。目标文件有三种,可重定位目标文件,可执行目标文件与共享目标文件。
    可重定位目标文件是我所认真学习的。
    .text:已编译程序的机器代码。

    .rodata:只读数据,比如printf语句中的格式串和开关语句的跳转表。

    .data:已初始化的全局C变量。

    .bss:未初始化的全局C变量。在目标文件中这个节不占据实际的空间,它仅仅是一个占位符。

    .symtab:一个符号表,它存放在程序中定义和引用的函数和全局变量的信息。

    .rel.text:一个.text节中位置的列表,当链接器把这个目标文件和其他文件结合时,需要修改这些位置。

    .rel.data:被模块引用或定义的任何全局变量的重定位信息。

    .debug:一个调试符号表,其条目是程序中定义的局部变量和类型定义,程序中定义和引用的全局变量,以及原始的C源文件。只有以-g选项调用编译驱动程序时才会得到这张表。

    .line:原始C源程序中的行号和.text节中机器指令之间的映射。

    .strtab:一个字符串表,其内容包括:.symtab和.debug节中的符号表,以及节头部中的节名字。字符串表就是以null结尾的字符串序列。

    教材中遇到的问题与解决

    1.对GCC常用参数并不是十分理解
    最开始的时候,对GCC感到十分的陌生,就算是读了几遍课本也无法好好地理解GCC,偶然在博客园看到了一个大神对GCC常用参数的整理。(http://www.cnblogs.com/shuaihanhungry/p/5808369.html)

    -E #预处理后即停止,不进行编译,预处理后的代码送往标准输出
    -S #编译后即停止,不进行汇编,可以使用 -o 选项选择其他名字
    -c #编译或汇编源文件,但是不作连接,编译器输出对应于源文件的目标文件,可以使用 -o 选项选择其他名字

    -o #指定输出文件名。该选项不在乎 GCC 产生什么输出,无论是可执行文件,目标文件,汇编文件还是预处理后的 C 代码

    -MM #和 -M 选项类似,但是输出结果仅涉及用户头文件

    -llibrary #连接名为 library 的库文件,连接器在标准搜索目录中寻找这个库文件,库文件的真正名字是 liblibrary.a
    #搜索目录除了一些系统标准目录外,还包括用户以 -L 选项指定的路径
    -static #在支持动态连接的系统上,阻止连接共享库
    -shared #生成一个共享目标文件,他可以和其他目标文件连接产生可执行文件
    -fPIC #如果支持这种目标机,编译器就输出位置无关目标码,适用于动态连接,即使分支需要大范围转移

    -Idir #在头文件的搜索路径列表中添加 dir 目录
    -Ldir #在 -l 选项的搜索路径列表中添加 dir 目录

    -w #禁止所有警告信息
    -Wall #生成所有警告信息

    -g #以操作系统的本地格式产生调试信息
    -rdynamic #把所有符号(而不仅仅只是程序已使用到的外部符号,但不包括静态符号,比如被static修饰的函数)
    #都添加到动态符号表(即.dynsym表)里,以便那些通过dlopen()或backtrace()
    #(这一系列函数使用.dynsym表内符号)这样的函数使用。

    -O0 #不优化
    -O1 #优化,对于大函数,优化编译占用稍微多的时间和相当大的内存
    -O2 #多优化一些,除了涉及空间和速度交换的优化选项,执行几乎所有的优化工作
    -O3 #优化的更多,除了打开 -O2 所做的一切,它还打开了 -finline-functions 选项
    #-finline-functions,把所有简单的函数集成进调用者,编译器探索式地决定哪些函数足够简单,值得这种集成

    -m32 #产生32位代码

    2.面向对象与面向过程到底是怎么回事?

    面向对象:用线性的思维。与面向过程相辅相成。在软件开发过程中,宏观上,用面向对象来把握事物间复杂的关系,分析系统。微观上,仍然使用面向过程。

    “面向过程”是一种是事件为中心的编程思想。就是分析出解决问题所需的步骤,然后用函数把这写步骤实现,并按顺序调用。

    代码调试过程中遇到的问题以及解决过程

    1.程序翻译成不同的格式遇到了问题
    解决:好好通读课本,理解编译器与汇编器之间的hello.s的转换。

    代码托管

    上周考试错题

    结对及互评

    点评模板:

    博客中值得学习的或问题:
    xxx
    xxx
    ...
    代码中值得学习的或问题:
    xxx
    xxx
    ...
    其他
    本周结对学习情况

    感悟

    虽然说是刚开学,但是由于上学期已经经历过这样的学习,所以还是感觉到十分的紧张,这学期的内容照上学期比较的话,明显增多,所以这学期来讲的话,更需要认真与努力,希望这学期能够有一个非常良好的开端。

    学习进度条

    尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
    耗时估计的公式
    :Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

    参考:软件工程软件的估计为什么这么难,软件工程 估计方法

    计划学习时间:6小时

    实际学习时间:6小时

    (有空多看看现代软件工程 课件
    软件工程师能力自我评价表)

  • 相关阅读:
    java Math类
    JAVA Date类与Calendar类【转】
    java Runtime类
    Java System类
    java 多线程
    java 包
    Java 内部类
    java 抽象类 以及模块方法设计模式,接口
    java 单例模式
    java 关于Java中静态代码块以及构造函数的执行先后顺序
  • 原文地址:https://www.cnblogs.com/nhx19970709/p/7587732.html
Copyright © 2020-2023  润新知