• 1.Unix,Linux起源与编译原理


    一.UNIX操作系统 
     作者:丹尼斯.里奇,肯.汤普逊
     版权:贝尔实验室
     时间:1971
     特点:多用户,多任务(多进程),多CPU(多种CPU架构),高安全,高可靠,高性能,高稳定
     应用:构建大型服务器的商业服务器,移动终端的嵌入式手持设备。
     三大派生版本:
      各大公司对Unix进行的升级扩展:
       IBM,SUNOracle,HP
      有界面支持的:
       MacOS
      开源免费的:
       Linux
    二.Linux操作系统
     类Unix系统,开源免费,应用于消费类电子,网络设备,服务器等,Linux严格来说指的是内核,各个公司对它添加界面形成不同风格的发现版。
     
     标志:企鹅,意味着它属于全世界。
     
     相关知识:
      1.Minix:在各大学免费开源的Unix,Linux就起源于它
      2.GNU工程:世界上最大的开源组织,也是Linux的维护者,所以Linux也叫GNU Linux
      3.POSIX标准:统一的系统编程接口规范,Unix和Linux都支持遵守此规范,所以这两个系统的接口基本通用。
      4.GPL公共许可证:A遵循了GPL标准,那么使用A开发的出来的B也不能收费。
     
     
    Linux:
    版本号:
      A-B-C
      A:内核大幅更新
      B:重要修改,奇数代表测试,偶数代表稳定版
      C:有补丁要升级
     
     
      2003年之后 A-B-C-D-E 前面三个不变
      D:内核构建的次数
      E:添加的一些描述信息
     
     
     特点:
      1.遵循了GPL
      2.开放 目前全世界的程序员还对它进行着升级改造
      3.继承了Unix,多用户,多任务
      4.设备具有独立性
      5.丰富的网络通信
      6.安全,可靠
      7.可移植性强
     
     
     常见的发行版:
      Ubuntu(市场占有率第一)
      StartOS(国有比较好)
      CentOS(做服务器用这个比较好)
      debian
      redhat
      Oracle
     
     
    四:编译器
     GNU编译框架
     1.支持众多编译语言
      C++,C,JAVA,Objective-C,Ada
     2.支持各种编译平台
      ULW
     3.构建过程(build)
      a.c -> a.out
      a.c -> a.i 预处理 gcc -E
      a.i -> a.s 汇编 gcc -S
      a.s -> a.o 编译 gcc -c
      a.o -> a.out 链接gcc a.o
     
     4.查看版本信息
      通过gcc -v来查看
      编译器的版本号 gcc version 4.8.1
      编译器位数 i686 -linux0-gnu
      所支持的语言 C/C++
      头文件路径 /usr/include
     
     5.文件类型
      .c 源代码文件
      .h 头文件
      .i 预处理文件
      .s 汇编文件
      .o 目标文件
      .a 静态库文件
      .so 共享库文件
      .gch 编译后的头文件,file.h file.gch(优先使用)
     
     6.编译单个文件
      -c 只编译不链接
      -E 预处理
      -S 汇编
      -Wall 尽可能多的生成警告信息
      -Werror 把警告信息当作错误处理
      -g 生成调试信息,gdb来调试
      -x 指定要编译的语言
      -pedantc 以ANSI标准检查语法(本来默认以GNU标准进行检查编译,但是GNU兼容ANSI,而且会多一些自己私有的语法,用这个参数就会只用ANSI这个标准来检查)
     
     7.编译多个文件
      ①头文件的作用
       声明一些外部变量和外部函数
       定义宏常量,宏函数
       类型的设计,类型重定义
       在头文件中包含其他头文件
       借助“头文件卫士”防范重复包含
      ②防止头文件相互包含
       a.h -> b.h ->a.h
       这个时候定义c.h把两者共用的部分移动到c.h
      ③包含头文件与不包含头文件
       如果没有头文件,编译器会猜测函数的格式(返回值猜测成int,参数根据实参的类型去猜测)
       #include ""先在当前文件夹寻找,如果找不到,再到系统指定的位置去查找
       #include <>系统指定的位置去查找
       编译器也可以指定头文件的查找路径 -I path
     
      ④编译单个.c文件 然后再合并生成可执行文件
       gcc -c code.c -> code.o
       gcc code.o -> a.out
     
      ⑤编写Makefile脚本
     
     8.预处理指令
      #include 包含头文件
      #define 定义宏常量或宏函数
      #undef 取消宏定义
      #if 判断
      #elif 当if为假再次进行判定
      #else if判断为假
      #endif 结束判断
      #ifndef 判断没有定义宏
      #ifdef 判断定义宏
      ## 连接两个标识符形成一个新的标识符
      # 转换字符串字符串字面值
      #error 生成错误信息
      #warning 生成警告信息
     
      #pragma pack(1/2/4) 设置结构体补齐,对齐的字节数(大于所设置的这个数,才改这个类型的对齐数)
     
      #pragma GCC poison key 将key设置为病毒(一旦使用key,编译的时候就会报错使用病毒)
     
      #line 设置代码的行号
     
     9.预定义的宏
      __BASE_FILE__ 当前编译的文件名(都是双下划线)
      __FILE__ 代码所在的文件名
      __LINE__ 获取行号
      __FUNCTION__ 获取函数名
      __func__ 同上
      __DATA__ 获取日期
      __TIME__ 获取时间
      __cplusplus 判定是C编译器还是C++编译器
     
     10.与编译器相关的环境变量
      vi ~/.bashrc
      C_INCLUDE_PATH 设置C语言头文件路径
      export CPATH=/home/wangdama/ 设置C语言头文件路径
      LIBRARY_PATH 设置查找库文件路径(静态和共享,编译时查找)
      LD_LIBRARY_PATH 动态加载库文件路径(运行时)
      添加环境变量:source ~/.bashrc
      删除环境变量要关闭重新打开才有效(这是我所用的终端的一个BUG)
    五:库
     库(库文件):就是代码的集合,把若干个目标文件合并在一起形成的集合
     1.分久必合(方便使用),合久必分(文件维护)
     2.库文件的分类:
      静态库:调用者把所需的代码从静态库中直接拷贝到可执行文件中
      共享库(动态库):调用者把所需的代码先在共享库中确认,当执行会把共享库和可执行文件一起加载,当需要执行共享库的代码时,直接从可执行文件中跳转过去,.so,.dll
     3.静态库:编译出的静态库相对比较大,不易修改,但是执行效率高
     4.共享库:编译出的共享库相对比较小,容易修改,但是执行效率不高(相对而言)
     
    六:静态库
     创建静态库:
      1.gcc -c code.c -> code.o
      2.ar -r libname.a code.o .....若干个.o文件
     调用静态库:
      静态库是需要与调用者一起编译(拷贝)。
      1.直接调用(调用者和静态库在同一目录下)
       gcc hello.c libname.a
      2.设置环境变量LIBRARY_PATH,配合-lname
      vi ~/.bashrc
      export LIBRARY_PATH = $LIBRARY_PATH:path
      关闭终端
       gcc hello.c -lname
      3.-Lpath配合-lname
       gcc hello.c -L/home/wangdama/pratice -lmath
     
      ar命令:
       -r生成静态库
       -q 向静态库中追加目标文件
       -t向静态库中删除目标文件
       -t显示静态库中所有的目标文件
       -x 把静态库展开成目标文件
     
      练习:
      1.实现strlen strcat strcpy strcmp 函数,制作成libstring.a,并用三种方法调用
    七:共享库
     创建共享库
     -fpic位置无关,代码段的地址都使用的是相对位置
     1.gcc -fpic -c code.c ->code.o
     2. gcc -shared -o libname.so code.o
     与调用静态库的方法一致
     当静态库和共享库同时存在时候,优先调用共享库 -static强制调用静态库
     
     共享库的运行
      调用共享库的可执行文件运行时候需要共享库一起加载并执行。
      运行时查找共享库需要从LD_LIBRARY_PATH指定的位置加载
      export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:path
     
      共享库相关命令:
       -fpic:小模式,生成的位置无关目标文件相对较小,速度较快,但是只有个别平台支持
     
       -fPIC:大模式,生成的位置无关目标文件相对较大,速度相对较慢,但所有平台都支持
     
       ldd:查看可执行文件所依赖的共享库文件
     
       ldconfig:
        LD_LIBRARY_PATH环境变量所配置的路径会记录到ld.so.conf,每次开机时会把共享库加载到ld.so.cache文件中,以此来提高共享库的运行速度,ldconfig可以重新生成ld.so.cache,而不用等到开机
     
     动态加载共享库
      在编译时不再查找共享库,在运行时才去查找加载共享库
      #include <dlfcn.h>
     
      打开共享库
      void *dlopen(const char *filename, int flag);
      filename:库名或路径,如果只有库名则其LD_LIBRARY_PATH去查找
      flag:
       RTLD_LAZY延迟加载,使用的时候才加载
       RTLD_NOW立即加载,程序执行时就被加载
      返回值:成功返回共享库的句柄,失败返回NULL
     
      查找函数
      void *dlsym(void *handle, const char *symbol);
      handle:共享库的句柄,dlopen的返回值
      symbol:函数名
      返回值:成功返回函数指针,失败返回NULL
     
     
      关闭共享库
      int dlclose(void *handle);
      handle:共享库的句柄,dlopen的返回值
      返回值:返回0成功,非零失败
     
      查看错误
      char *dlerror(void);
      当dlopen,dlsym,dlclose执行出错再调用此函数获取错误信息
     
      编译时gcc main.c -ldl
     
     
    八:辅助工具
     nm:查看目标文件,静态库,共享库,可执行文件中的符号列表。
     
     strip:减肥,删除目标文件,静态库,共享库,可执行文件中的符号。
     
     objdump:显示二进制模块的汇编信息
     
     

    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

    附件列表

  • 相关阅读:
    js中验证身份证号码是否正确支持15位和18位身份证号
    vue-element-admin-i18n 前端框架的使用
    根据年份选择周数-js
    js 计算开始日期和结束日期跨度几个月份的方法
    Java上传图片到服务器
    c# List<Object>和List<实体>相互转化
    GC 相关详细参数
    Groovy脚本和Groovy类反编译文件
    dev 控件中点击TreeList节点高亮显示GridControl中存在的行
    spring容器
  • 原文地址:https://www.cnblogs.com/LyndonMario/p/9362260.html
Copyright © 2020-2023  润新知