当前位置: 首页 > news >正文

risc-V学习日记(3):编译与链接

早上好啊,大伙。这个专栏的内容基本就是做笔记,只是给我自己和大伙再学习之后如果忘记哪些内容可以很快的来查看,还是建议大伙去看汪辰老师的视频,老师讲的还是很好的。

请添加图片描述

文章目录

  • GCC
    • GCC简介
      • 为什么说GCC是程序员的必备工具?
    • GCC命令格式
    • GCC的主要执行步骤
      • 解析一下它的执行流程
    • GCC涉及的文件类型
  • ELF
    • ELF简介
    • 文件格式
      • 文件头(ELF Header)
      • 核心数据段
        • 程序头表(Program Header Table)
        • 节头表(Section Header Table)
      • 动态链接相关结构
    • 文件处理相关工具:Binutils
  • 感谢大伙观看,别忘了三连支持一下
  • 大家也可以关注一下我的其它专栏,同样精彩喔~
  • 下期见咯~

GCC

GCC简介

由 GNU开发的,遵循 GPL许可证发行的编译器套件。
GCC(GNU Compiler Collection)是Linux系统中最著名的开源编译器套件,支持C、C++、Objective-C、Fortran、Ada等多种编程语言。这个始于1987年的编译器项目,如今已成为开发者构建项目的核心工具链。

为什么说GCC是程序员的必备工具?

跨平台支持:可在Windows/Mac/Linux等系统使用

高度优化:支持-O1到-O3多级代码优化

灵活扩展:可搭配Makefile实现自动化构建

调试友好:生成带调试信息的可执行文件

GCC命令格式

gcc [ options ] [ filenames ]  
常用选项含义
-E只做预处理
-c只编译不链接,生成目标文件“.o”
-S生成汇编代码
-o file把输出生成到由 file 指定文件名的文件中
-g在输出的文件中加入支持调试的信息
-v显示输出详细的命令执行过程信息

GCC的主要执行步骤

  1. 编译
    编译器完成“预处理”和“编译”'预处理”指处理源文件中以“#”开头的预处理指令,譬如 #include、#define 等“编译” 则针对预处理的结果进行一系列的词法分析、请语法分析、语义分析,优化后生成汇编指令,存放在 .o 为后缀的目标文件中。

  2. 汇编(as)
    汇编器将汇编语言代码转换为机器(CPU)可以执行的指令。

  3. 链接(ld)
    链接器将汇编器生成的目标文件和一些标准库(譬如 libc)文件组合,形成最终可执行的应用程序。

在这里插入图片描述

我们这里写一个 .c 文件,然后让它编译一下,给大伙看看它的运行经历了哪些事情。

就写一个梦的开始来做样例吧~
在这里插入图片描述
在前面说过gcc 加上选项 -v 就能返回执行过程。

gcc hello.c -v

如果大家是第一次使用gcc这个指令,它会说没有这个指令,大家按照它的提示安装一下就行了。

在这里插入图片描述

解析一下它的执行流程

预处理和编译,这里就是生成的一个.s的临时文件。
在这里插入图片描述
然后再把这个.s的临时文件,执行as指令,生成一个包含机器码的.o文件。
在这里插入图片描述
最后,它会调用collect2,它会引用很多文件,才能生成最后的可执行文件。
在这里插入图片描述

GCC涉及的文件类型

后缀文件类型
.c:C源文件
.cc/.cxx/.cppC++ 源文件
.i经过预处理的C 源文件
.s/.S汇编语言源文件
.h头(header)文件
.o目标(object)文件
.a/.so编译后的静态库(archive)文件和共享(shared object)文件
a.out可执行文件

ELF

ELF简介

ELF(Executable and Linkable Format)是Linux系统的标准二进制文件格式,堪称可执行文件的"DNA"。无论是我们编译生成的a.out,还是系统级的glibc.so,甚至是内核模块.ko文件,都采用这种统一的文件结构。

ELF的三重身份:

可执行文件:可以直接运行的独立程序
共享目标文件:.so动态链接库
可重定位文件:.o中间目标文件

ELF 文件类型说明实例
可重定位文件(Relocatable File)内容包含了代码和数据,可以被链接成可执行文件或共享目标文件。Linux 上的 .o文件
可执行文件(Executable File)可以直接执行的程序Linux 上的a.out
共享目标文件(Shared Object File)内容包含了代码和数据,可以作为链接器的输入,在链接阶段和其他的 Relocatable File或者 Shared Object File一起链接成新的 Obiect File;或者在运行阶段,作为动态链接器的输入,和 Executable File 结合,作为进程的一部分来运行Linux 上的 .so
核心转储文件(Core Dump File)进程意外终止时,系统可以将该进程的部分内容和终止时的其他状态信息保存到该文件中以供调试分析Linux上的core 文件

文件格式

在这里插入图片描述

文件头(ELF Header)

使用readelf -h查看文件头信息,包含以下关键字段:

字段说明典型值示例
Magic Number文件标识(7F 45 4C 46)7F 45 4C 46
Class32/64位架构ELF64
Type文件类型(EXEC/DYN/REL)DYN (Position-Independent Executable)
Entry point address程序入口地址0x400520
Start of program headers程序头表偏移64
Start of section headers节头表偏移13912

核心数据段

程序头表(Program Header Table)
  1. 描述段(Segment)信息,用于程序执行
  2. 查看命令:readelf -l
段类型作用说明
LOAD需要加载到内存的段
DYNAMIC动态链接信息
INTERP指定动态链接器路径
节头表(Section Header Table)
  1. 描述节(Section)信息,用于链接和调试
  2. 查看命令:readelf -S
关键节功能说明
.text代码段(机器指令)
.data已初始化的全局变量
.bss未初始化的全局变量
.rodata只读数据(字符串常量等)
.symtab符号表
.strtab字符串表

动态链接相关结构

  1. .dynamic段:记录依赖的共享库
  2. .got(全局偏移表):支持位置无关代码
  3. .plt(过程链接表):实现延迟绑定
# 查看动态段信息
readelf -d /usr/bin/ls

# 输出示例:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libselinux.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

文件处理相关工具:Binutils

网址:Binutils

ar:归档文件,将多个文件打包成一个大文件。

as:被 gcc 调用,输入汇编文件,输出目标文件供链接器 ld 连接。

ld:GNU 链接器。被 gcc 调用,它把目标文件和各种库文件结合在一起,重定位数据,并链接符号引用。

objcopy:执行文件格式转换。

objdump:显示 ELF 文件的信息

readelf:显示更多 ELF 格式文件的信息(包DWARF 调试信息)

例如说下面用 readelf 命令查看头 ——
在这里插入图片描述

感谢大伙观看,别忘了三连支持一下

大家也可以关注一下我的其它专栏,同样精彩喔~

下期见咯~

请添加图片描述

相关文章:

  • MySQL 安全与权限管理:数据库的城堡守卫系统
  • DPDK核心优化技术总结
  • 如何在 Linux 上安装 Python
  • leetcode104 二叉树的最大深度
  • Spring Boot中自定义注解的创建与使用
  • C语言编译和链接错题
  • IDEA/WebStrom操作之commit前批量清除console.log()与debugger
  • Java基础 4.5
  • Fortran 中读取 MATLAB 生成的数据文件
  • 基于SpringBoot的养老院信息管理系统(源码+数据库)
  • Java的Selenium的特殊元素操作与定位之模态框
  • 7-9 趣味游戏
  • Ubuntu-安装redis
  • 【Kubernetes】ConfigMap 和 Secret 的作用是什么?它们如何影响应用配置?
  • d202545
  • 【MediaPlayer】基于libvlc+awtk的媒体播放器
  • April Fools Day Contest 2025 A-F(没有E) 题解
  • 软件工程面试题(二十八)
  • [ 计算机网络 ] | HTTP协议(一)
  • MySQL:查询