首页 > 其他分享 >cs04 浅谈编译和链接

cs04 浅谈编译和链接

时间:2024-07-22 21:06:45浏览次数:15  
标签:文件 浅谈 汇编 cs04 符号 链接 编译 预处理

C/C++ 语言中编译和链接通常都是自动完成的,win上 VS 全部包圆了,什么都不用操心,linux上使用cmake 编写CMakeLists.txt 也可以使用短短几行代码构建一个工程。

那么编译和链接到底在我们看不到的地方做了什么呢?深入理解计算机系统中有一句话 大多数编译系统提供了编译器驱动程序(compiler driver),它代表用户在需要时调用语言预处理器、编译器、汇编器和链接器。
从这句话中可以知道 要编译一个程序包含几个步骤 1.预处理 2.编译 3.汇编 4.链接 下面逐个分析这几个步骤

  1. 预处理: 这部分由预处理器完成,主要对C源码进行预处理操作,预处理器负责处理源码中的预处理指令,预处理指令以# 开头 比如宏替换,头文件展开等等
  2. 编译: 简单说就是将C代码转换为汇编代码
  3. 汇编: 简单说就是将汇编代码转为目标机器可以理解的二进制代码。linux上默认输出文件名为.o文件
  4. 链接: 这部分重点梳理下,很有意思的一个部分。
    链接器以.o文件作为输入,经过加工处理生成可执行程序或者动态库。
    那么.o文件中是什么呢?我们知道.o是个二进制文件,二进制文件中包含了什么数据呢? .o文件由各种不同的节组成,每个节都是一个连续的字节序列,这个节用英文标识section更好理解一些,就是一个个不同的部分。
    深入理解计算机系统中详细解释了.o中有哪些节,每个节所代表的含义,具体含义这里不做详细解释,只是说明文件结构。

到此我们有了一段段二进制序列,怎么将他们变成可执行程序呢?链接器主要做两件事
1. 符号解析: 什么是符号?符号就是程序中定义的函数、全局变量、静态变量。那么符号解析顾名思义就是解析这些函数、全局变量或静态变量并将程序中对他们的引用和他们的定义位置关联起来。
2. 重定位: 当汇编过程生成.o文件时,它并不知道最终程序在内存中的确切位置,所以编译器和汇编器生成从地址0开始的代码和数据节。在链接阶段,链接器需要处理这些地址,将每个符号定义与一个内存位置关联起来,从而重定位这些节,然后修改所有对这些符号的引用,使得他们都执行这个内存位置。
注意: 链接器使用汇编器产生的重定位条目(relocation entry)的详细指令完成重定位,不自己判断该如何执行重定位逻辑。

标签:文件,浅谈,汇编,cs04,符号,链接,编译,预处理
From: https://www.cnblogs.com/cpp-muggle/p/18316918

相关文章

  • GMSSL2.x编译鸿蒙静态库和动态库及使用
    一、编译环境准备1.1开发工具DevEco-Studio下载。1.2SDK下载​ 下载编译第三方库的SDK有两种方式,第一种方式从官方渠道根据电脑系统选择对应的SDK版本,第二种方式通过DevEco-Studio下载SDK。本文只介绍通过DevEco-Studio下载SDK的方式。安装SDK到本地根据SDK安装位......
  • centos stream9(linux): 编译安装python 3.12.4
    一,官方下载地址:https://www.python.org/downloads/点击进入具体版本的下载页面,我们选择稳定版本,地址:https://www.python.org/downloads/release/python-3124/如图:复制得到下载链接:https://www.python.org/ftp/python/3.12.4/Python-3.12.4.tgz 二,下载:从命令行下载:......
  • busybox一键编译生成arm版本文件系统
    #!/bin/sh#updateimagesforx86_64#gitclonehttps://github.com/torvalds/linux.git--depth=1--verbose#cdlinux#-------#makedefconfig#cparch/x86/configs/x86_64_defconfig.config#modifysomeconfigoption#make-j8bzImage#cd........
  • v4l2-ctl 库的编译和使用
    如果要编写一个使用V4L2的应用层app,最好的例子v4l2-util的应用程序源码下载​https://git.linuxtv.org/v4l-utils.git/tree/Example•get/set/listvideostandard-​​v4l2-ctl-stds.cpp•get/set/listvideoinput-​​v4l2-ctl-io.cpp•get/set/listvideopixel......
  • 都2024年了你还傻傻分不清楚“编译时”和“运行时”吗?
    前言在写vue3编译原理揭秘电子书的时候,发现有不少粉丝还傻傻分不清楚什么是编译时?什么是运行时?这篇文章我们来让你彻底搞清楚编译时和运行时的区别。关注公众号:【前端欧阳】,给自己一个进阶vue的机会编译时我将编译这个词语理解为翻译,这句话是什么意思呢?比如你要和一个老外沟......
  • 交叉编译ethtool(ubuntu 2018)
    参考文章:https://www.cnblogs.com/nazhen/p/16800427.htmlhttps://blog.csdn.net/weixin_43128044/article/details/1379539131、下载相关安装包//ethtool依赖libmulgitclonehttp://git.netfilter.org/libmnl//ethtool源码gitclonehttp://git.kernel.org/pub/sc......
  • 内核模块高级-多文件编译、加载、参数传递、模块依赖
    多文件编译    对于比较复杂的驱动程序,常常会把它的功能进行拆分,由不同的文件实现,这样也能进行并行开发,缩短开发周期。多文件编译的简单例子如下:mod.c://mod.c#include<linux/init.h>#include<linux/module.h>#include"ext.h"//其他文件的头文件ext.hstatic......
  • 浅谈Mike 3D中制作垂向水温分层边界
    前言:给大家更新一篇全新模块的讲解吧,MIKE3D中难点在于制作一种分层DFS2的边界,这种边界必须用实测的数据作为支撑,本次讲解以水温分层为例。step1:打开GridSeries中BlankGird,新建2dgridstep2:进入参数设置界面,坐标与模型设置一致,坐标原点可以设置成边界起点坐标(左手......
  • Windows下编译Havoc
    客户端编译安装msys2​​安装过程一直next,完成后打开终端,更新并安装qt和python,过程回车并输入y继续。#更新pacman-Su#安装QtPythonpacman-Smingw-w64-x86_64-qt-creatormingw-w64-x86_64-qt5pythonpython-devel​​cmake不能用通用版本,要使用mingw-w64-x86_......
  • 2、OpenGL-GLFW下载编译
    文章目录1.GLFW简介2.下载3.编译4.测试4.1测试工程构建4.2创建CMakeLists.txt4.3main.c4.4编译4.5运行测试1.GLFW简介针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口跨平台的窗体生成API系统与OpenGL便捷链接方便的鼠标键盘消息回调函数2......