再不愿错过——GCC与GDB

从C语言与反编译入门逆向工程:理解程序底层原理与实践 逆向工程是理解计算机系统工作原理的重要途径,其核心在于通过分析已编译的二进制程序,反推其内部逻辑与实现机制。从原理上看,它涉及编译器如何将高级语言代码转化为机器指令、程序在内存中的布局与执行流程等底层知识。掌握逆向技术不仅能深化对编程语言(如C语言)的理解,更能提升在软件安全、漏洞分析、系统优化等领域的工程实践能力。通过使用Ghidra等反编译工具,结合GDB动态调试,可以直观地观察变量、函数调用、指针操作在汇编层面的具体表现,从而将抽象的高级语言概念与具体的机器行为对应起来。这一过程对于从事系统编程、嵌入 阅读详情
GCC版本
  使用下面命令,可以知道它的版本:
gcc -v

GCC安装后目录结构
  /usr/lib/gcc-lib/target/version/ (及子目录) 编译器就在这个目录下。
  /usr/bin/gcc可以从命令行执行的二进制程序在这个目录下。
  /usr/target/(bin|lib|include)/ 库和头文件在这个目录下。
  /lib/,/usr/lib和其他目录,系统的库在这些目录下。

符号定义
  使用-V开关,就能看到GCC定义的符号。参见下列实例:
  $ echo 'main(){printf("hello world/n");}' | gcc -E -v -
   Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
   gcc version 2.7.2
  /usr/lib/gcc-lib/i486-box-linux/2.7.2/cpp -lang-c -v -undef
   -D__GNUC__=2 -D__GNUC_MINOR__=7 -D__ELF__ -Dunix -Di386 -Dlinux
  -D__ELF__ -D__unix__ -D__i386__ -D__linux__ -D__unix -D__i386
  -D__linux -Asystem(unix) -Asystem(posix) -Acpu(i386)
  -Amachine(i386) -D__i486__ -

GCC编译器使用简介
  通常后跟一些选项和文件名来使用 GCC 编译器。gcc 命令的基本用法如下:
  gcc [options] [filenames]
  选项指定编译器怎样进行编译。

GCC选项
  GCC 有100个编译选项。这些选项中的许多可能永远都不会用到,但一些主要的选项会经常遇到。很多的 GCC 选项包括一个以上的字符,因此必须为每个选项指定各自的连字符。例如, 下面的两个命令是不同的:
  gcc -p -g test.c
  gcc -pg test.c
  第一条命令告诉 GCC 编译 test.c 时为 prof 命令建立剖析(profile)信息并且把调试信息加入到可执行的文件里。 第二条命令只告诉 GCC 为 gprof 命令建立剖析信息。
  没有选项时,GCC 会生成一个名为 a.out 的可执行文件。
  用 -o 编译选项来为将产生的可执行文件用指定的文件名来命名。例如, 将一个叫 count.c 的 C 程序编译为名叫 count 的可执行文件, 要这样输入命令:
  gcc -o count count.c
  -c 选项告诉 GCC 仅把源代码编译为目标代码。缺省时 GCC 建立的目标代码文件有一个 .o 的扩展名。
  -S 编译选项告诉 GCC 在为 C 代码产生了汇编语言文件后停止编译。 GCC 产生的汇编语言文件的缺省扩展名是 .s 。
  -E 选项指示编译器仅对输入文件进行预处理。当这个选项被使用时, 预处理器的输出被送到标准输出而不是储存在文件里.
  用 GCC 编译 C 代码时, 它会试着用最少的时间完成编译并且使编译后的代码易于调试。 易于调试意味着编译后的代码没有经过优化。必要时,需要让编译器对代码进行优化。
  -O 选项告诉 GCC 对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。 -O2 选项告诉 GCC 产生尽可能小和尽可能快的代码。 -O2 选项将使编译的速度比使用 -O 时慢, 但通常产生的代码执行速度会更快。
  GCC 支持数种调试和剖析选项,常用到的是 -g 和 -pg 。
  -g 选项告诉 GCC 产生能被 GNU 调试器使用的调试信息以便调试你的程序。GCC 提供了一个很多其他 C 编译器里没有的特性, 在 GCC 里你能使 -g 和 -O (产生优化代码)联用。
  -pg 选项告诉 GCC 在编译好的程序里加入额外的代码。运行程序时, 产生 gprof 用的剖析信息以显示你的程序的耗时情况。

用 gdb 调试 GCC 程序
  Linux 包含了一个叫 gdb 的 GNU 调试程序。在程序运行时能观察程序的内部结构和内存的使用情况。 以下是 gdb 所提供的一些功能:
  监视程序中变量的值
  设置断点,使程序在指定的代码行上停止执行。
  一行行的执行代码

  为了用GDB调试程序,在编译是必须指定调试选项。在命令行上键入 gdb 并按回车键就可以运行 gdb 了。如果一切正常的话, gdb 将被启动并在屏幕上显示:
  GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions.
  There is absolutely no warranty for GDB; type "show warranty" for details.
  GDB 4.14 (i486-slakware-linux), Copyright 1995 Free Software Foundation, Inc.
  (gdb)

  可以在启动GDB时,加入许多选项。也可以在这个命令后面直接指定要调试的程序。
gdb < fname>

gdb 基本命令
gdb 支持很多的命令,这些命令从简单的文件装入到允许检查所调用的堆栈内容的复杂命令。下表列出了你在用 gdb 调试时会用到的一些命令。

命令 描 述
file 装入想要调试的可执行文件
kill 终止正在调试的程序
list 列出产生执行文件的源代码的一部分
next 执行一行源代码但不进入函数内部
step 执行一行源代码而且进入函数内部
run 执行当前被调试的程序
quit 终止 gdb
watch 使你能监视一个变量的值而不管它何时被改变
break 在代码里设置断点, 这将使程序执行到这里时被挂起
make 使你能不退出 gdb 就可以重新产生可执行文件
shell 使你能不离开 gdb 就执行 UNIX shell 命令

gdb 应用举例
  下面列出了将被调试的程序,这个程序被称为 greeting ,显示一个简单的问候, 再用反序将它列出。

#include < stdio.h>
main ()
{
char my_string[] = "hello there";

my_print (my_string);
my_print2 (my_string);
}

void my_print (char *string)
{
printf ("The string is %s/n", string);
}

void my_print2 (char *string)
{
char *string2;
int size, i;
size = strlen (string);
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size - i] = string[i];
string2[size+1] = `/0';
printf ("The string printed backward is %s/n", string2);
}

  用下面的命令编译这个程序:
    gcc -o -g test test.c
  运行编译好的程序,显示如下:
    The string is hello there
    The string printed backward is
  输出的第一行是正确的, 但第二行打印出的东西并不是我们所期望的。我们所设想的输出应该是:
    The string printed backward is ereht olleh
  由于某些原因, my_print2 函数没有正常工作。用 gdb 看看问题究竟出在哪儿, 先键入如下命令:
    gdb greeting
  如果在输入命令时忘了把要调试的程序作为参数传给 gdb ,可以在 gdb 提示符下用 file 命令来载入它:
    (gdb) file greeting
  这个命令载入 greeting 可执行文件,就象在 gdb 命令行里指定启动gdb装入它一样。
  这时就能用 gdb 的 run 命令来运行 greeting 了。 当它在 gdb 里被运行后结果大约会象这样:
  (gdb) run
  Starting program: /root/greeting
  The string is hello there
  The string printed backward is
  Program exited with code 041
  
  这个输出和在 gdb 外面运行的结果一样。问题是, 为什么反序打印没有工作? 为了找出症结所在, 我们可以在 my_print2 函数的 for 语句后设一个断点, 具体的做法是在 gdb 提示符下键入 list 命令三次, 列出源代码:
  (gdb) list
  (gdb) list
  (gdb) list

  第一次键入 list 命令的输出如下:
  1 #include < stdio.h>
  2
  3 main ()
  4 {
  5 char my_string[] = "hello there";
  6
  7 my_print (my_string);
  8 my_print2 (my_string);
  9 }
  10

  如果按下回车, gdb 将再执行一次 list 命令, 给出下列输出:
  11 my_print (char *string)
  12 {
  13 printf ("The string is %s/n", string);
  14 }

  15
  16 my_print2 (char *string)
  17 {
  18 char *string2;
  19 int size, i;
  20

  再按一次回车将列出 greeting 程序的剩余部分:
  21 size = strlen (string);
  22 string2 = (char *) malloc (size + 1);
  23 for (i = 0; i < size; i++)
  24 string2[size - i] = string[i];
  25 string2[size+1] = `/0';
  26 printf ("The string printed backward is %s/n", string2);
  27 }

  根据列出的源程序, 你能看到要设断点的地方在第24行, 在 gdb 命令行提示符下键入如下命令设置断点:
    (gdb) break 24
  该命令的执行结果如下:
    Breakpoint 1 at 0x139: file greeting.c, line 24
    (gdb)
  现在再键入 run 命令, 将产生如下的输出:
    Starting program: /root/greeting
    The string is hello there
    Breakpoint 1, my_print2 (string = 0xbfffdc4 "hello there") at greeting.c :24
24 string2[size-i]=string[i]
  你能通过设置一个观察 string2[size - i] 变量的值的观察点来看出错误是怎样产生的, 做法是键入:
    (gdb) watch string2[size - i]
  执行结果如下:
    Watchpoint 2: string2[size - i]
  现在可以用 next 命令来一步步的执行 for 循环了:
    (gdb) next
  经过第一次循环后, gdb 告诉我们 string2[size - i] 的值是 `h`。这是执行next命令后的结果:
  Watchpoint 2, string2[size - i]
  Old value = 0 `/000'
  New value = 104 `h'
  my_print2(string = 0xbfffdc4 "hello there") at greeting.c:23
  23 for (i=0; i< size; i++)

  这个值正是期望的。后来的数次循环的结果都是正确的。当 i=10 时, 表达式 string2[size - i] 的值等于 `e`, size - i 的值等于 1, 最后一个字符已经拷到新串里了。
  如果再把循环执行下去,会看到已经没有值分配给 string2[0] 了, 而它是新串的第一个字符, 因为 malloc 函数在分配内存时把它们初始化为空(null)字符。所以 string2 的第一个字符是空字符。于是就发现了为什么在打印 string2 时没有任何输出了.
  找出了问题出在哪里后, 修正这个错误是很容易的。把代码里写入 string2 的第一个字符的的偏移量改为 size - 1 而不是 size。这是因为 string2 的大小为 12, 但起始偏移量是 0, 串内的字符从偏移量 0 到 偏移量 10, 偏移量 11 为空字符保留。
  为了使代码正常工作有很多种修改办法. 。一种是另设一个比串的实际大小小 1 的变量,下面是这种办法的程序。
#include < stdio.h>
main ()
{
char my_string[] = "hello there";
my_print (my_string);
my_print2 (my_string);
}
my_print (char *string)
{
printf ("The string is %s/n", string);
}
my_print2 (char *string)
{
char *string2;
int size, size2, i;
size = strlen (string);
size2 = size -1;
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size2 - i] = string[i];
string2[size] = `/0';
printf ("The string printed backward is %s/n", string2);
} 
企业微信会话存档SDK集成与动态库加载实战 本文详细解析了企业微信会话存档SDK的集成与动态库加载实战,重点解决Windows与Linux环境下动态库加载的差异问题。通过实战案例和优化建议,帮助开发者高效完成企业微信API集成,确保合规存档功能稳定运行。 阅读详情

相关推荐

从零开始利用MATLAB进行FPGA设计(一):建立脉冲检测模型的Simulink模型2

上一期分析了MATLAB的黄金算法原理,这一期进行Simulink模块分析。

WZT725的博客 2086

gcc & gdb

1.什么是gcc & gdb. gcc gcc是由GNU组织开发的一款编译器,刚开始只可以编译C语言,经过之后的发展,扩展为能支持更多语言的编译器,例如:如Fortran、Pascal、Objective -C、Java、Ada、Go以及各类处理器架构上的汇编语言等,现在被大多用于类UNIX操作系统的标准编译器. gdb gdb也是由GNU组织发行的一款调试器,被应用于UNIX以及类UNIX操作系用下的一款出色的调试工具. 2.gcc的使用. gcc作为一款编译器,其主要功能就是对源代码进行

qq_43941389的博客 2131

Trae编程工具Cline插件深度集成与Claude 3.7 API Key高级配置实战

本文详细介绍了如何在Trae编程工具中深度集成Cline插件并配置Claude 3.7 API Key的高级技巧。通过实战案例,展示了如何提升代码补全质量、实现多轮对话记忆及自定义代理设置,特别适合全栈工程师和需要私有化AI服务的团队。文章还涵盖了安装流程、API Key获取方式及企业级部署的最佳实践。

weixin_28829903的博客 436

【 gcc & gdb】

gcc和gdb用法详解 -c、-o、-Wall、-D、-I、-g list、break、info break、delete、run、continue、ignore、step、finish、q

qq_55805517的博客 1400

AI学习记录 - transformer的位置编码的理解

先看三角函数为什么可以,我们看下三角函数的图像先提一个点:位置信息肯定是唯一的,或者是在很长的文字当中,起码重复度不会太高,x轴代表位置,y轴代表叠加上去的值1、假设只使用一个三角函数sin,我们将第2和第14两个位置输入到sin,他们的值很像,在神经网络的训练中,很容易把第2个位置和第14个位置当成是一个位置,不满足我们上面说到的要求位置唯一性。sin2sin14。

weixin_43954090的博客 1412

ESP32驱动GC9A01圆形屏实战:Arduino平台LVGL移植与图像显示优化

本文详细介绍了在Arduino平台上使用ESP32驱动GC9A01圆形屏的实战指南,包括硬件连接、LVGL移植与图像显示优化。通过SPI配置、LVGL库安装和双缓冲机制等技巧,帮助开发者快速实现高效显示效果,适用于智能家居控制面板等应用场景。

weixin_29182481的博客 734

系统编程--gcc编译与gdb调试工具

以上是gcc编译的四步骤,每个步骤生成对应的文件。

长安1108的博客 1792

一张图看懂 ABAP CDS 两大子语言:CDS DDL 与 CDS DCL 以及缺席的 DML

ABAP CDS 的核心设计思想围绕语义数据模型(DDL)与数据访问控制(DCL)展开,而非单纯作为SQL查询工具。其DDL通过声明式语法定义业务导向的数据视图,强调模型稳定性与复用性;DCL则将访问控制逻辑下沉到模型层,实现行级权限过滤。ABAP CDS刻意剥离DML功能,交由ABAP SQL处理数据变更,形成清晰的分层架构。这种设计使数据定义、访问控制与应用逻辑解耦,为现代ABAP应用提供更安全、可维护的数据治理方案。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 975

编译器gcc/g++的使用以及调试工具gdb的使用(有一点基础就能学会!)

Linux下重要工具的使用Linux下重要工具的使用作者:@专栏:@作者简介:大一学生 希望能向其他大佬和同学学习!本篇博客简介:主要介绍了Linux下程序的编译和调试,以及在Linux下提交代码到gitub上。

xuecde的博客 2837

基于Python的上市公司年报PDF文本抓取与财务风险分析系统

随着大数据时代的到来,金融数据分析已成为投资决策和风险管理的重要工具。上市公司年报包含了丰富的财务信息和经营数据,通过对这些数据的提取和分析,可以评估公司的财务状况和潜在风险。本文将详细介绍如何使用Python构建一个完整的上市公司年报文本抓取与财务风险分析系统,涵盖PDF文本提取、数据清洗、财务指标计算和风险分析等全流程。

2201_76125261的博客 311

199、影像技术 roadmap 规划:未来移动影像的技术趋势与芯片算力展望

本文探讨了未来移动影像技术的发展趋势与芯片算力规划。作者从实际案例出发,指出影像技术演进需平衡传感器、ISP、算力和功耗。文章分为三部分:1)传感器将从堆像素转向提升信息密度,重点关注双层晶体管结构、混合快门和多光谱技术;2)ISP架构将向可编程计算单元转型,强调神经网络加速、硬件化多帧融合和语义处理;3)芯片算力瓶颈在于数据搬运,需优化存算一体架构、专用DMA和统一内存。最后给出五点建议:避免盲目追高像素、重视持续功耗、平衡ISP灵活性、预留算力余量、加强传感器与ISP协同设计。作者强调,影像技术的突破在

sundong_81的博客 57

gcc gdb 基础操作

本文操作均在 Linux 环境下完成 要了解 gcc 的使用先要了解源代码 (.c) 文件生成可执行文件的过程,分为两个环境: 具体参考:https://blog.youkuaiyun.com/m0_46606290/article/details/120604689 程序的翻译环境和运行环境: (1):程序的翻译环境: 预处理 编译 汇编 链接 (2):运行环境 这里 gcc 完成的是翻译环境 1.创建源文件 首先在当前目录下新建一个新目录并且切换到该目录下(mkcd),直接用 vim

TGRD4的博客 1702

python基于pingouin统计分析:rm_corr计算两个变量之间的重复测量相关性(Repeated measures correlation、plot_rm_corr函数可视化重复测量相关性图

python基于pingouin包进行统计分析:使用rm_corr函数计算两个变量之间的重复测量相关性(Repeated measures correlation)、plot_rm_corr函数可视化重复测量相关性图

statistics+insight+vista+power 679

GDB教程

1.GCC的使用: 假设您有一个名为 main.cpp 的文件,其中包含您的 c++ 代码。您应该使用以下命令编译它: g++ main.cpp -o main 虽然这可以正常工作并生成一个名为main的可执行文件,但您还需要放置一个-g标志来告诉编译器您可能希望稍后调试程序。 因此,最终命令将变为: g++ main.cpp -g -Wall -Werror -o main 如果你想让编译器将警告视为错误-这意味着你甚至没有得到可执行文件,你可以使用-Werror标志。这将确保您不会错过任

rosemaryandthyme的博客 166

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

GDB常用命令

命令 解释 示例 file <文件名> 加载被调试的可执行程序文件。 因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径。 (gdb) file gdb-sample r Run的简写,运行被调试的程序。 ...

u011797343的专栏 484

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

简单上手GDB调试

关注、星标公众号,不错过精彩内容直接来源:嵌入式软件开发交流什么是GDBGDB, 又称GNU调试器,是用来帮助调试我们程序的工具。GDB有几个基本功能:1. 给程序设置断点2. 当程序...

strongerHuang 710

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C/C++学习笔记第一天:MAC OS下搭建GCC和Sublime Text环境

本科的时候学了C C++ 这一路搞研究 也不太需要太多的编程,多半是算法仿真,所以编程感觉越来越差,趁这个暑假赶快拾起来。

冯*诺曼底 6935

GCC 14发布已半年,你还在用旧版编译?这8个新选项不容错过

掌握GCC 14编译选项配置,提升代码性能与安全性。本文详解8个实用新选项,覆盖优化、调试和兼容性场景,助你高效升级编译流程。旧版迁移不再难,值得收藏。

CompiShoal的博客 1069

GDB调试工具入门

从windows转到linux下已经有一段时间了,每次刷算法题碰到问题需要调试的时候,就分分钟想关机,切换到windows上调试。于是,花了一点时间来搜索一下linux下常见的调试工具,这不搜不知道,一搜吓一跳,居然差点错过了这么好的调试利器GDB。上手十分简单,几分钟就可以开开心心调试你的代码了。GDB概述GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大

ZeeCoder 1067

GCC的gcc和g++区别

关注+星标公众号,不错过精彩内容素材来源| Linux公社其实在这之前,我一直以为gcc和g++是一个东西,只是有两个不同的名字而已,今天在linux下编译一个c代码时出现了错误才找了一...

strongerHuang 509

C++项目上线前必做的GDB检查清单,错过一条就可能引发生产事故

掌握C++ GDB用法,精准排查线上隐患。针对C++项目上线前的关键调试环节,梳理GDB核心用法:断点设置、内存检查、多线程调试与崩溃定位,覆盖生产环境常见问题。提升代码稳定性,规避运行时错误,值得收藏。

Instrustar的博客 400

linux下的程序调试工具,GDB调试工具入门

从Windows转到Linux下已经有一段时间了,每次刷算法题碰到问题需要调试的时候,就分分钟想关机,切换到Windows上调试。于是,花了一点时间来搜索一下Linux下常见的调试工具,这不搜不知道,一搜吓一跳,居然差点错过了这么好的调试利器GDB。上手十分简单,几分钟就可以开开心心调试你的代码了。GDB概述GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强...

weixin_28951683的博客 196

linux里调试step和next区别,GDB调试工具入门

从Windows转到Linux下已经有一段时间了,每次刷算法题碰到问题需要调试的时候,就分分钟想关机,切换到Windows上调试。于是,花了一点时间来搜索一下Linux下常见的调试工具,这不搜不知道,一搜吓一跳,居然差点错过了这么好的调试利器GDB。上手十分简单,几分钟就可以开开心心调试你的代码了。GDB概述GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强...

weixin_29309213的博客 882

Dev-C++编译器升级指南:从GCC 4.9.2到现代C++17/20

编译器是软件开发的核心工具,负责将高级语言代码转换为机器可执行的指令。其工作原理涉及词法分析、语法分析、语义分析、优化和代码生成等多个阶段。现代编译器不仅提供基础编译功能,还通过持续更新支持新的语言标准、优化算法和安全修复,这对提升代码质量、开发效率和软件性能至关重要。在C++开发领域,随着C++11、14、17乃至20标准的推出,诸如自动类型推导、lambda表达式、智能指针和文件系统库等现代特性已成为工程实践中的常见需求。这些特性依赖于新版编译器的支持,例如GCC或MinGW-w64的高版本。本文以轻量

weixin_30924087的博客 362

我的ARM开发环境

楼主: 我的ARM开发环境 编译器。 我用的是GCC,CODE SOURCERY公司的GCC套件,不用装CYGWIN就可以用,现在的最新版本是4.2.1,版本很高。 他的优点: 1. GCC的编译效率也非常令人称道,4.0以后版本的GCC可以跨函数深层优化,已经足够智能了。 2. 免费,无需破解,不用怕侵权,不用支付高额的费用来买。 3. 网上资料多,用起来方面,移植

zealane的专栏 2324
上一篇: Love me if you dare
下一篇: 二叉搜索树的基本操作(C代码实现)
DaNmarner
博客等级 码龄21年 27粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值