操作系统八股文06-补充-程序相关知识

本文详细介绍了程序的执行步骤,包括预编译、编译、汇编和链接。讲解了静态库和动态库的区别,制作过程以及命名规则。在Linux环境下,演示了如何使用g++编译器创建静态库和动态库,并展示了如何在程序中链接这些库。同时,讨论了静态库与动态库的优缺点,以及动态库的加载方式和依赖关系查询。最后,阐述了程序内存的划分,包括代码段、数据段、堆和栈的分配情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

补充2-程序相关知识

1. 程序执行步骤

  • 预编译:展开头文件、注释、宏替换

    g++ test.cpp -E -o test.i
    
  • 编译:生成汇编代码

    g++ test.i -S -o test.s
    
  • 汇编:生成机器码

    g++ -c test.cpp
    
  • 链接:不同目标文件进行连接,生成可执行文件

    g++ test.s -s -o test.o
    

2. 动态链接、静态链接

2.1 静态链接

  • 静态库:在链接阶段复制到了程序中

  • 命名规则

    • linux: libxxx.a
    • windows: libxxx.lib
  • 制作过程

  1. 使用src中的源文件,制作静态库

    g++ -c add.cpp minis.cpp -I ../include/
    ar rcs libcalc.a minis.o add.o
    
  2. 将创建的静态库移动到lib中

    mv libcalc.a ../lib/
    
  3. 使用静态库编译main.cpp

    g++ main.cpp -o mian -I include/ -L lib/ -l calc
    

g++中,-I 指定头文件位置,-L 指定库文件位置,-l 指定库文件

2.2 动态链接

  • 动态库:运行时由系统加载到内容中供程序调用

    • 命名规则
      • linux: libxxx.so
      • windows: libxxx.dll
    • 制作过程
  1. 使用src中的源文件,制作动态库
g++ -c -fpic add.cpp minis.cpp -I ../include/
g++ -shared *.o -o libcalc.so
  1. 将创建的动态库移动到lib中
mv libcalc.a ../lib/
  1. 使用动态库编译main.cpp

    g++ main.cpp -o mian -I include/ -L lib/ -l calc
    
  2. 添加动态库路径

    • 临时配置

      export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/workspace/WebServr/lession04/lib 
      
    • 永久配置 用户级

      在.bashrc中加入上述指令
      source .bashrc
      
    • 永久配置 系统级

      在/etc/profile中加入上述指令
      source /etc/profile
      
    • 永久配置 系统级

      在/etc/ld.so.conf中加入路径
      ldconfig
      

dll 查询依赖关系

2.3 动态库、静态库对比

  • 静态库

    • 优点

      • 加载速度快
      • 发布程序无需提供静态库、移植方便
    • 缺点

      • 消耗系统资源、浪费内存
        • 更新、部署、发布麻烦
  • 动态库

    • 优点

      • 可以实现进程间资源共享
      • 更新、部署、发布简单
      • 可以控制何时加载动态库
    • 缺点

      • 加载速度慢
        • 发布时需要提供依赖的动态库

3. 程序内存划分

  • 用户区 0-3G

    • .text 代码段

    • .data 已初始化的全局变量

    • .bss 未初始化的全局变量

    • 堆空间 低地址 -> 高地址

    • 共享库

    • 栈空间 高地址 -> 低地址

  • 内核区 3-4G

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值