gcc入门

time will tell Lv4

实验一 入门

小寄巧:上下键可切换之前的命令

gcc基本用法

1.基本指令

1
gcc [options] [filename]

options:编译器所需要的编译选项
filenames:要编译的文件名

实际使用:gcc -O0 main.c -o main

其中-O0可以换成以下优化和执行命令

-O1 -O2 -O3 -c -g(调试必需品)

-o [filenames]用来创建文件的执行程序

如果只有 gcc filename,gcc会给出预制的a.out

2.多文件命令

1
gcc main.c a.c b.c -o main

1
gcc -o main main.c a.c b.c

3、优化上限

在使用GCC编译C语言程序时,有几个常用的优化选项可以帮助提高程序的性能。以下是一些常用的优化选项:

  1. -O1: 开启基本的优化。这是一个较轻的优化级别,能提高性能而不会显著增加编译时间。
  2. -O2: 开启更高级的优化。它会启用更多的优化选项,通常能带来明显的性能提升,适合大多数项目。
  3. -O3: 启用所有的优化选项,包括一些可能导致代码膨胀的高级优化。适用于对性能要求极高的应用。
  4. -Os: 优化代码以减小大小。这在需要节省内存的嵌入式系统中非常有用。
  5. -Ofast: 包含所有-O3的优化,并且不遵循标准的浮点数精度和其他标准约束,可能会导致不符合标准的行为,但性能上会有提升。
  6. -funroll-loops: 展开循环以提高性能,适用于小循环。
  7. -fomit-frame-pointer: 在优化代码时省略帧指针,有助于提高性能,但在调试时可能会增加困难。
  8. -march=native: 针对本地机器架构生成代码,利用特定的处理器指令集和特性。
  9. -flto: 启用链接时优化(Link Time Optimization),在链接阶段对代码进行更进一步的优化。

可以根据你的项目需求选择合适的选项,通常从-O2开始尝试,逐步调整。还可以通过组合不同的选项来进一步优化代码性能。

使用PGO选项进行编译优化

传统编译优化只能通过静态的程序分析及启发式算法预测程序的执行行为。 PGO通过采集程序运行时信息,可以精准的判断代码的冷热、执行的概率,从而完成高效的冷热分区、分支预测、函数重排、寄存器分配、向量化、函数内联等 优化 ,提升cache命中率、分支命中率和数据并行度,减少寄存器压力。

  1. 编译程序以生成配置文件

    1
    gcc -fprofile-generate -o my_program my_program.c
  2. 运行程序以收集配置文件数据

    1
    ./my_program
  3. 使用配置文件数据重新编译程序以进行优化

    1
    gcc -fprofile-use -o my_program_optimized my_program.c
使用技巧

为了避免负优化,建议采取以下措施

  1. 单走ofast,ofast带的优化选项已经足够多,以至于很有可能造成负优化
  2. O+展开循环,这在重复性质的代码中优化非常有效

gbd 基础

1.命令格式

gbd基础命令

1
gdb [option][executable-file[core-file or process-id]]
-加载和退出命令
  • gdb flename:在shell下直接加载文件进行调试
  • file filename:在gdb下通过file命合加载程序进行调试
  • kil:终止正在调试的程序
  • quit:退出gdb调试环境
-断点控制
  • break 函数名或行号[if 条件]
  • Info break:显示程序中设置的断点
  • delete breakpoint 断点号:删除指定的断点
  • clear断点号:作用同上
  • disable breakpoint 断点号:禁用指定的断点
  • enable breakpoint断点号:允许指定的断点
-程序控制指令
  • run:程序开始执行,一直运行到断点才终止
  • continue:运行到下一个断点;
  • next:运行下一条指合;
  • step:运行下一条指合
-变量、参数的设置与查看
  • list:列出产生执行文件的源代码的一部分
  • watch 变量名:当变量改变时,显示变量修改前后的值
  • print 变量名:打印变量值;
  • whatis 变量名或函数名:显示变量或数的类型
  • Ptype:显示数据结构的定义
  • set args:设置程序的运行参数
  • Show args:显示程序的运行参数

2.操作调试举例

  • 1.使用gcc命爷进行编译(务必需要-g选项,gcc-g aa.c-o aa
  • 2.启动gdb进行调试gdb aa
  • 3.使用run命分运行程序r(or run)
  • 4.根据逻辑找出问题,可附加使用list查看代码I(or list)
  • 5.使用break命分设置断点b (or break)lineNumber or functionName
  • 6.使用run命令运行程序r(or run)
  • 7.使用watch命分指定需要跟踪的变量watch Buffer
  • 8.按照终端提示输入input字符串

其他调试操作

  1. stepi/nexti:输出当前指令地址1728832122861
  2. x &n:输出当前变量地址1728832659168

Objdump使用

反汇编命令参数表

  • objdump -x obj:以某种分类信息的形式把目标文件的数据组成输出;<可查到该文件的的所有动态库>
  • objdump -t obj:输出目标文件的符号表()
  • objdump -h obj:输出目标文件的所有段概括()
  • objdump -j ./text/.data -S obj:输出指定段的信息(反汇编源代码)
  • objdump -S obj:输出目标文件的符号表() 当gcc -g时打印更明显
  • objdump -f test 显示test的文件头信息
  • objdump -d test 反汇编test中的需要执行指令的那些section
  • objdump -D test 与-d类似,但反汇编test中的所有section
  • objdump -h test 显示test的Section Header信息
  • objdump -x test 显示test的全部Header信息
  • objdump -s test 除了显示test的全部Header信息,还显示他们对应的十六进制文件代码

有以下命令生成汇编文件和反汇编文件

  • gcc -S -o main.s main.c 显示main.c的汇编代码

  • 目标文件反汇编会使用objdump生成反汇编代码
    gcc -c -o main.o main.c
    objdump -s -d main.o > main.o.txt
    将目标文件的反汇编码输出到main.o.txt

  • 反汇编同时显示原代码
    gcc -g -c -o main.o main.c
    objdump -S -d main.o > main.o.txt

    显示源代码同时显示行号

    objdump -j .text -ld -C -S main.o > main.o.txt

  • Title: gcc入门
  • Author: time will tell
  • Created at : 2024-10-25 15:53:14
  • Updated at : 2024-10-28 13:12:56
  • Link: https://sbwrn.github.io/2024/10/25/gcc/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments