博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第八遍:链接详解
阅读量:4553 次
发布时间:2019-06-08

本文共 770 字,大约阅读时间需要 2 分钟。

目录

一、链接过程详解

1)gcc会对.c文件默认进行预处理操作,-c再来指明了编译、汇编,从而得到.o文件, 所以gcc -c -o hello.o hello.c就把链接前的步骤完成了

2) 链接就是将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行程序

  • 系统库文件

    • crt1.o、crti.o、crtbegin.o、crtend.o、crtn.o是gcc加入的系统标准启动文件对于一般应用程序,这些启动是必需的
    • gcc -v -nostdlib -o hello hello.o会提示因为没有链接系统标准启动文件和标准库文件,而链接失败
      • -nostdlib选项常用于裸机/bootloader、linux内核等程序,因为它们不需要启动文件、标准库文件。
      • 一般应用程序才需要系统标准启动文件和标准库文件;裸机/bootloader、linux内核等程序不需要启动文件、标准库文件。
  • 库文件

    比如:程序中用到的printf就是链接到里libc库文件,通过libc库文件实现了printf函数。

二、动态链接和静态链接区别

  • 动态链接
    • 动态链接使用动态链接库进行链接,生成的程序在执行的时候需要加载所需的动态库才能运行。
    • 动态链接生成的程序体积较小,但是必须依赖所需的动态库,否则无法执行。
    • gcc -o hello_shared hello.o默认就是动态链接
  • 静态链接
    • 静态链接使用静态库进行链接,生成的程序包含程序运行所需要的全部库,可以直接运行
    • 不过静态链接生成的程序体积较大
    • gcc -static -o hello_static hello.o-static选型,进行静态链接

转载于:https://www.cnblogs.com/panrongfeng/p/9512385.html

你可能感兴趣的文章
springboot 端口号
查看>>
使用AChartEngine画动态曲线图
查看>>
安卓项目五子棋代码详解(四)
查看>>
urllib 学习一
查看>>
bzoj4196 [Noi2015]软件包管理器——树链剖分
查看>>
kafka源码阅读环境搭建
查看>>
UI设计
查看>>
androidtab
查看>>
Windows Phone 自定义弹出框和 Toast 通知
查看>>
如何生成静态页面的五种方案
查看>>
php 事件驱动 消息机制 共享内存
查看>>
剑指offer 二叉树的bfs
查看>>
LeetCode Maximum Subarray
查看>>
让我们再聊聊浏览器资源加载优化
查看>>
underscore demo
查看>>
CSS hack
查看>>
C# Enum Name String Description之间的相互转换
查看>>
Android 实现ripple动画
查看>>
PHP wamp server问题
查看>>
Spring Data Redis学习
查看>>