GD32F303 GCC 环境搭建

news2025/1/22 18:04:03

一、引言

在嵌入式开发领域,GD32F303 微控制器以其出色的性能和丰富的功能被广泛应用。为了充分发挥其潜力,搭建一个高效的开发环境并深入理解项目构建过程至关重要。本文将详细介绍如何基于 GCC 工具链搭建 GD32F303 的开发环境,重点聚焦于 Makefile 文件的编写与解析,助力开发者快速上手项目开发。

二、工具链安装

以下是在 Linux 系统上搭建 GCC 工具链的详细步骤:

下载工具链

  • 使用 wget 命令从上述下载链接下载工具链(以下是一个示例,根据你选择的版本更新 URL):
wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2

解压工具链

将工具链解压到 /opt 目录下,这是一个常见的系统级软件安装目录。使用以下命令进行解压:

sudo tar -xvf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 -C /opt

配置环境变量

  • 为了能够在命令行中方便地使用工具链,需要将工具链的 bin 目录添加到系统的 PATH 环境变量中。你可以将以下命令添加到用户的 .bashrc 或系统的 /etc/profile 文件中:
export PATH=$PATH:/opt/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux/bin
  • 为了使环境变量的修改立即生效,执行以下命令(如果你将上述命令添加到 .bashrc):
source ~/.bashrc

三、EmbeddedBuilder 获取相关文件

EmbeddedBuilder 是一款基于 Eclipse 和 Java 平台的软件,用于开发 GD32 系列单片机。它具有图形化界面,方便用户进行引脚和外设的配置,并能自动生成代码。通过EmbeddedBuilder 工具生成我们在gcc环境下所需要的文件和代码。

官网地址及安装步骤

EmbeddedBuilder 的官网地址为:https://gd32mcu.com/cn/download/7 。

安装步骤如下:

  1. 安装 JAVA 环境:在 Oracle 官网下载相应的 Java 安装包(如 jdk-8u152-windows-x64.exe),以管理员身份运行并安装,记住安装路径(如 “D:\Program Files\Java\jdk1.8.0_351”)。然后编辑系统变量,添加 JAVA_HOME 变量,并在 Path 变量中添加相关路径,在系统变量中新建 CLASSPATH 变量。最后在 Windows+R 键打开的 dos 窗口中分别输入 java 和 javac,若能正常输出提示信息则说明配置成功。
  2. 下载 EmbeddedBuilder:从官网下载 EmbeddedBuilder 压缩包。
  3. 解压并运行:解压后双击 “EmbeddedBuilder.exe” 打开 IDE,选择一个路径作为 workspace 的存放位置,确认后即可进入 IDE 页面。|

创建GD32F303工程

  1. 创建新工程:在导航栏依次单击 “File->New->Project…”,选择 C Project,并在可执行文件 “Executable” 选项卡下选择 “GigaDevice ARM C Project”,填写项目名字后进行芯片选择和其他配置。

  2. 导入工程:在导航栏处依次选择 “File->Import”,在导入页面的 General 选项卡下选择 “Existing Projects into Workspace”,选择原有工程的路径,IDE 会自动检索并列出存在的 Embedded Builder 项目,勾选需要导入的项目后单击 Finish 即可。

    在这里插入图片描述

获取相关文件

  1. 官方库:GD32F303 的官方库提供了丰富的驱动函数和底层支持,能够大大简化开发过程。通过 EmbeddedBuilder 可以方便地获取官方库,并将其集成到项目中

  2. LD文件:LD 文件(链接脚本)在项目构建中起着关键作用,它描述了如何将各个目标文件组合成最终的可执行文件,并确定内存布局。

  3. 启动文件:.s 文件通常包含汇编启动代码,是系统启动过程的关键部分。

在这里插入图片描述

GCC工程目录构建

在项目存储路径下创建以下目录结构,已将代码递交到gitee仓库 https://gitee.com/myliujiuri/gd32f303_gcc

在这里插入图片描述

四、Makefile

makefile需要我们自己来实现,以下是一个标准的 Makefile 模板,用户可以根据实际项目情况进行修改。

# target
TARGET = app

# building variables
DEBUG = 1
OPT = -Os

# paths
BUILD_DIR = build

# source
C_SOURCES = \
Firmware/CMSIS/GD/GD32F30x/Source/system_gd32f30x.c \
# 其他 C 源文件路径省略

C_INCLUDES =  \
-IFirmware/CMSIS \
# 其他头文件路径省略

ASM_SOURCES =  \
Firmware/CMSIS/GD/GD32F30x/Source/GCC/startup_gd32f30x_hd.S

ARM_TOOCHAIN?=./Toolchain/arm-gnu-toolchain/bin

# binaries
PREFIX = $(ARM_TOOCHAIN)/arm-none-eabi-
ifdef GCC_PATH
CC = $(GCC_PATH)/$(PREFIX)gcc
AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp
CP = $(GCC_PATH)/$(PREFIX)objcopy
SZ = $(GCC_PATH)/$(PREFIX)size
else
CC = $(PREFIX)gcc
AS = $(PREFIX)gcc -x assembler-with-cpp
CP = $(PREFIX)objcopy
SZ = $(PREFIX)size
endif
HEX = $(CP) -O ihex
BIN = $(CP) -O binary -S

# CFLAGS
CPU = -mcpu=cortex-m4
FPU = 
FLOAT-ABI = 
MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)
AS_DEFS = 
C_DEFS =  \
-DUSE_STDPERIPH_DRIVER \
-DGD32F30X_HD
AS_INCLUDES = 
ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections
CFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections -std=c99
ifeq ($(DEBUG), 1)
CFLAGS += -g -gdwarf-2
endif
CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"

# LDFLAGS
LDSCRIPT = Firmware/Ld/gd32f30x_flash.ld
LIBS = -lc -lm -lnosys 
LIBDIR = 
LDFLAGS = $(MCU) -u_printf_float -specs=nosys.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections -Wl,--print-memory-usage 

# default action: build all
all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin

# build the application
OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))
vpath %.c $(sort $(dir $(C_SOURCES)))
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.S=.o)))
vpath %.S $(sort $(dir $(ASM_SOURCES)))

$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) 
    $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@

$(BUILD_DIR)/%.o: %.S Makefile | $(BUILD_DIR)
    $(AS) -c $(CFLAGS) $< -o $@

$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
    $(CC) $(OBJECTS) $(LDFLAGS) -o $@
    $(SZ) $@

$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
    $(HEX) $< $@
    
$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
    $(BIN) $< $@	
    
$(BUILD_DIR):
    mkdir $@		

# program
program:
    openocd -f /usr/share/openocd/scripts/interface/cmsis-dap.cfg -f /usr/share/openocd/scripts/target/stm32f1x.cfg -c "program build/$(TARGET).elf verify reset exit"

# clean up
clean:
    -rm -fR $(BUILD_DIR)

# dependencies
-include $(wildcard $(BUILD_DIR)/*.d)

五、Makefile 详解

目标与变量定义

  1. 目标(Target)
    • TARGET = app:定义了最终生成的可执行文件的名称为 app。在后续的构建规则中,所有的中间文件和最终输出文件都围绕这个名称展开,如 $(BUILD_DIR)/$(TARGET).elf$(BUILD_DIR)/$(TARGET).hex$(BUILD_DIR)/$(TARGET).bin 分别表示生成的 ELF 格式可执行文件、十六进制文件和二进制文件。
  2. 构建变量
    • DEBUG = 1:用于控制是否开启调试信息。当 DEBUG 为 1 时,在 CFLAGS 中会添加调试相关的编译选项 -g -gdwarf-2,这些选项使得生成的可执行文件包含调试符号,方便在调试器中进行源代码级别的调试。
    • OPT = -Os:指定了优化级别为 Os,这是一种针对代码大小的优化选项。GCC 提供了多种优化级别,如 -O0(不优化)、-O1(基本优化)、-O2(更高级别的优化)、-O3(激进的优化)等,-Os 会在保证一定性能的前提下尽量减小代码体积,适用于资源受限的嵌入式系统。
  3. 路径变量
    • BUILD_DIR = build:定义了构建过程中生成的中间文件和最终输出文件的存放目录为 build。在后续的规则中,所有的目标文件(.o 文件)、可执行文件等都会存放在这个目录下,通过这种方式可以保持项目目录的整洁,便于管理和清理构建产物。

源文件与头文件路径

  1. C 源文件(C_SOURCES)
    • 这里列出了项目中所有的 C 语言源文件路径,包括来自固件库(如 Firmware/CMSIS/GD/GD32F30x/Source/system_gd32f30x.c)和用户自定义的源文件(如 User/main.c 等)。这些源文件是项目的核心代码部分,在构建过程中会被编译成目标文件(.o 文件),然后链接成最终的可执行文件。在实际项目中,随着功能的增加,可能会不断添加新的源文件到这个列表中。
  2. C 头文件路径(C_INCLUDES)
    • 定义了 C 语言源文件在编译时所需的头文件搜索路径。例如 -IFirmware/CMSIS 表示编译器会在 Firmware/CMSIS 目录下搜索头文件。这些头文件包含了函数声明、宏定义和类型定义等信息,对于源文件的正确编译至关重要。如果头文件路径设置不正确,编译器将无法找到相应的头文件,导致编译错误。

工具链相关定义

  1. 工具链路径(ARM_TOOCHAIN)
    • ARM_TOOCHAIN?=./Toolchain/arm-gnu-toolchain/bin:指定了 ARM GNU 工具链的安装路径。这里使用了条件赋值 ?=,如果在外部没有定义 ARM_TOOCHAIN 变量,就会使用这个默认值。工具链包含了编译器(gcc)、汇编器(as)、链接器(ld)等工具,是将源代码转换为可执行文件的关键。
  2. 工具前缀(PREFIX)
    • PREFIX = $(ARM_TOOCHAIN)/arm-none-eabi-:定义了工具链中各个工具的前缀。例如,$(PREFIX)gcc 就是实际调用的 ARM 架构的 GCC 编译器。这个前缀确保了在系统中安装了多个工具链或存在不同版本工具链时,能够准确地调用所需的工具。
  3. 编译器及相关工具定义
    • 根据是否定义了 GCC_PATH 变量,分别设置了编译器(CC)、汇编器(AS)、目标文件复制工具(CP)和文件大小查看工具(SZ)的具体路径。如果定义了 GCC_PATH,则会在该路径下查找工具,否则使用默认的 PREFIX 路径下的工具。例如,CC = $(PREFIX)gcc 表示使用默认路径下的 GCC 编译器进行 C 语言源文件的编译。

编译参数(CFLAGS 和 ASFLAGS)

  1. 通用编译参数
    • CPU = -mcpu=cortex-m4:指定了目标处理器为 Cortex-M4 内核。这是因为 GD32F303 基于 Cortex-M4 内核,编译器需要针对这个内核进行特定的代码生成和优化。
    • MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI):综合了处理器设置、Thumb 指令集启用以及浮点运算相关设置(这里 FPUFLOAT-ABI 根据实际情况可能为空或有特定设置)。-mthumb 表示启用 Thumb 指令集,这是一种在 ARM 架构中常用的指令集模式,能够减小代码体积。
    • CFLAGSASFLAGS 都包含了 $(MCU)$(OPT)-Wall-fdata-sections-ffunction-sections 等参数。-Wall 启用了所有常见的警告信息,有助于在编译过程中发现潜在的问题。-fdata-sections-ffunction-sections 分别将数据和函数放入独立的节区,这在链接阶段可以实现更精细的内存管理和优化,例如可以只链接实际使用到的节区,减小最终可执行文件的大小。
  2. 调试相关参数
    • DEBUG = 1 时,CFLAGS += -g -gdwarf-2-g 选项开启调试信息生成,-gdwarf-2 指定了调试信息的格式为 DWARF-2,这是一种广泛支持的调试信息格式,使得调试器能够正确解析源代码和变量信息,方便开发者进行调试。
  3. 依赖信息生成参数
    • CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)":这些参数用于自动生成源文件的依赖关系信息。-MMD 表示生成依赖文件(.d 文件),-MP 会为每个依赖添加一个虚拟的目标,避免在头文件更新时出现不必要的错误,-MF 则指定了依赖文件的名称格式,其中 $(@:%.o=%.d) 表示将目标文件(.o 文件)的扩展名替换为 .d 作为依赖文件的名称。这些依赖文件在后续的构建过程中会被 Makefile 自动包含,确保在源文件或头文件发生变化时,能够正确地重新编译相关的文件。

链接参数(LDFLAGS)

  1. 链接脚本(LDSCRIPT)
    • LDSCRIPT = Firmware/Ld/gd32f30x_flash.ld:指定了链接脚本文件的路径。链接脚本详细描述了可执行文件的内存布局,包括代码段、数据段在 Flash 和 RAM 中的位置和大小等信息。对于 GD32F303 项目,这个链接脚本需要根据芯片的内存映射进行定制,确保程序能够正确地加载和运行。
  2. 库文件与链接选项
    • LIBS = -lc -lm -lnosys:列出了链接过程中需要链接的库文件。-lc 是 C 标准库,-lm 是数学库,-lnosys 通常用于提供一些系统调用的空实现,在嵌入式系统中可能不需要完整的操作系统级别的系统调用,这个库可以提供一些基本的替代实现。
    • LDFLAGS 还包含了 -u_printf_float-specs=nosys.specs-Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections -Wl,--print-memory-usage 等参数。-u_printf_float 确保链接器在链接时包含浮点格式的 printf 函数。-specs=nosys.specs 指定了链接器的规范文件,用于调整链接行为。-Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref 会生成一个链接映射文件,该文件详细展示了可执行文件中各个节区的内存地址分配、符号引用等信息,方便开发者分析程序的内存布局。-Wl,--gc-sections 启用了链接器的垃圾回收功能,会删除未使用的节区,进一步减小可执行文件的大小。-Wl,--print-memory-usage 则会在链接过程中输出内存使用情况的统计信息,帮助开发者了解程序的内存占用情况。

构建规则

  1. 目标文件生成规则

    • $(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR)$(BUILD_DIR)/%.o: %.S Makefile | $(BUILD_DIR):这两条规则分别定义了如何从 C 源文件和汇编源文件生成目标文件(.o 文件)。对于 C 源文件,使用 $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@ 命令进行编译。其中 $(CC) 是前面定义的 C 编译器,-c 表示只进行编译不进行链接,$(CFLAGS) 是编译选项,-Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) 是传递给汇编器的选项,用于生成汇编列表文件(.lst 文件),$< 表示第一个依赖文件(即源文件),$@ 表示目标文件。对于汇编源文件,使用 $(AS) -c $(CFLAGS) $< -o $@ 进行编译,其中 $(AS) 是汇编器,过程类似。
  2. 可执行文件生成规则

    • $(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile:这条规则定义了如何从所有的目标文件生成最终的 ELF 格式可执行文件。使用 $(CC) $(OBJECTS) $(LDFLAGS) -o 命令进行链接,其中(CC) 是编译器,是前面生成的所有目标文件列表,(LDFLAGS) 是链接选项,表示目标文件(即(BUILD_DIR)/)。链接完成后,还使用(SZ) 命令查看生成的可执行文件的大小信息,这里(SZ) 是前面定义的文件大小查看工具。
      \3. 十六进制和二进制文件生成规则

      • $(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR):这两条规则分别定义了如何从 ELF 格式可执行文件生成十六进制文件和二进制文件。对于十六进制文件,使用 $(HEX) $< $@ 命令,其中 $(HEX) 是前面定义的目标文件转换工具,$< 表示输入文件(即 ELF 文件),$@ 表示目标文件(即十六进制文件)。对于二进制文件,使用 $(BIN) $< $@ 命令,过程类似。
      1. 目录创建规则
        • $(BUILD_DIR)::这条规则定义了如何创建构建目录 $(BUILD_DIR)。使用 mkdir $@ 命令创建目录,如果目录已经存在,该命令不会产生错误。这个目录在构建过程中用于存放中间文件和最终输出文件,确保项目目录结构的清晰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2280493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

路径规划之启发式算法之二十八:候鸟优化算法(Migrating Birds Optimization, MBO)

候鸟优化算法(Migrating Birds Optimization, MBO)是一种基于群体智能的元启发式优化算法,其灵感来源于候鸟迁徙时的“V”字形飞行队列。这种队列结构能够有效减少能量消耗,同时提高飞行效率。MBO算法通过模拟候鸟的迁徙行为,利用群体间的协作和信息共享来优化问题的解。 …

ESP8266 MQTT服务器+阿里云

MQTT私有平台搭建&#xff08;EMQX 阿里云&#xff09; 阿里云服务器 EMQX 搭建私有MQTT平台 1、搜索EMQX开源版本 2、查看各版本EMQX支持的UBUNTU版本 3、查看服务器Ubuntu版本 4、使用APT安装模式 5、按照官网指示安装并启动 6、下载安装MQTTX测试工具 7、设置云服务…

【机器学习实战中阶】使用SARIMAX,ARIMA预测比特币价格,时间序列预测

数据集说明 比特币价格预测&#xff08;轻量级CSV&#xff09;关于数据集 致谢 这些数据来自CoinMarketCap&#xff0c;并且可以免费使用该数据。 https://coinmarketcap.com/ 数据集:链接: 价格预测器 源代码与数据集 算法说明 SARIMAX&#xff08;Seasonal AutoRegressive …

Postgresql源码(140)理解PG的编译流程(make、Makefile、Makefile.global.in)

PG16 PG中使用的makefile看起来代码比较多&#xff0c;但是实际逻辑比较简单&#xff0c;这里做一些抽象总结。 总结 Makefile.global.in的$(recurse)宏自动生成了target&#xff0c;可以方便的进入内存目录进行编译。 all: all-common-recurse all-common-recurse: submak…

Java数据结构——优先队列

目录 引言1. 优先队列2. 优先队列的实现2.1 堆的概念2.2 堆的创建2.2.1 堆的向下调整2.3 堆的插入2.4 堆的删除 3. 总结 引言 前面一篇文章讲了二叉树&#xff0c;本篇将讲述数据结构中的优先队列&#xff0c;优先队列则需要用到完全二叉树来实现。 1. 优先队列 队列&#x…

51c大模型~合集105

我自己的原文哦~ https://blog.51cto.com/whaosoft/13101924 #刚刚&#xff0c;ChatGPT开始有了执行力&#xff01; 现在 AI 智能体可以 24*7 小时为你打工。 2025 刚过去了半个月&#xff0c;OpenAI 在智能体领域「开大」了。 今天&#xff0c;OpenAI 正在为 ChatGPT 推出…

从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CICD)

从零到上线&#xff1a;Node.js 项目的完整部署流程&#xff08;包含 Docker 和 CI/CD&#xff09; 目录 项目初始化&#xff1a;构建一个简单的 Node.js 应用设置 Docker 环境&#xff1a;容器化你的应用配置 CI/CD&#xff1a;自动化构建与部署上线前的最后检查&#xff1a;…

《自动驾驶与机器人中的SLAM技术》ch4:基于预积分和图优化的 GINS

前言&#xff1a;预积分图优化的结构 1 预积分的图优化顶点 这里使用 《自动驾驶与机器人中的SLAM技术》ch4&#xff1a;预积分学 中提到的散装的形式来实现预积分的顶点部分&#xff0c;所以每个状态被分为位姿&#xff08;&#xff09;、速度、陀螺零偏、加计零偏四种顶点&am…

Ubuntu系统更改IP,保姆级教程

原理概述 本篇文章所用工具&#xff1a; Xshell&#xff1a;点击下载 VMware Workstation Pro&#xff1a;点击下载 密钥需要自行搜索所下载的VMware对应版本密钥。 IP 地址 IP 地址&#xff08;Internet Protocol Address&#xff09;是分配给每个连接到计算机网络的设备的…

【Linux】进程管理(一篇入门-进程:基本概念、PCB进程块、进程的创建、等待、终止、状态,exec函数族的使用)

本节主要内容&#xff1a;进程的一些基本概念&#xff0c;进程控制块PCB&#xff0c;以及如何在一个C程序里创建进程、终止进程、等待进程&#xff0c;包括孤儿进程、僵尸进程等特殊状态的进程&#xff0c;并涉及回收进程的概念。最终是exec函数族的函数使用方法及用途。 程序与…

RabbitMQ 在实际应用时要注意的问题

1. 幂等性保障 1.1 幂等性介绍 幂等性是数学和计算机科学中某些运算的性质,它们可以被多次应⽤,⽽不会改变初始应⽤的结果. 应⽤程序的幂等性介绍 在应⽤程序中,幂等性就是指对⼀个系统进⾏重复调⽤(相同参数),不论请求多少次,这些请求对系统的影响都是相同的效果. ⽐如数据库…

EXCEL+Python搞定数据处理(第一部分:Python入门-第1章:为什么要用Python为Excel编程)

参考资料&#xff1a; ExcelPython飞速搞定数据分析与处理&#xff0c;[瑞士] 费利克斯朱姆斯坦 著&#xff0c;中国工信出版社、人民邮电出版社出版(“Python for Excel, by Felix Zumstein (O’Reilly). Copyright 2021 Zoomer Analytics LLC, 978-1-492-08100-5”) 将不定…

MPLS VPN 部署与应用

一.简介 MPLS&#xff0c;称之为多协议标签交换&#xff0c;在九十年代中期被提出来&#xff0c;用于解决传统IP报文依赖查表转发而产生的瓶颈&#xff0c;现多用于VPN技术&#xff0c;MPLS报头封装在数据链路层之上&#xff0c;网络层之下。本文为结合了华为技术和新华三技术…

麒麟操作系统服务架构保姆级教程(十三)tomcat环境安装以及LNMT架构

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 之前咱们学习了LNMP架构&#xff0c;但是PHP对于技术来说确实是老掉牙了&#xff0c;PHP的市场占有量越来越少了&#xff0c;我认识一个10年的PHP开发工程师&#xff0c;十年工资从15k到今天的6k&am…

67,【7】buuctf web [HarekazeCTF2019]Avatar Uploader 2(未完成版)

进入靶场 和上一题一母同胞&#xff0c;先把上一题的答案拖进去看看 区别在于上一题这块直接显示了flag&#xff0c;这里并没有 看看源码 加载不出来&#xff0c;ctrlu <!-- 上传头像的提示信息&#xff0c;说明上传要求 --><p>Please upload a PNG image less th…

QD Laser携“Lantana”激光器参展SPIE光子学西部展2025,聚焦紧凑型设计

据悉&#xff0c;QD Laser公司将在2025年SPIE光子学西部展览会上展出其最新产品——世界最小一体化紧凑型可见光激光器“Lantana”。该展会将于1月28日至30日在旧金山的Moscone中心举行。 在展会期间&#xff0c;QD Laser公司将现场展示这款超小型、轻便设备—— “Lantana”。…

63,【3】buuctf web Upload-Labs-Linux 1

进入靶场 点击pass1 查看提示 既然是上传文件&#xff0c;先构造一句话木马&#xff0c;便于用蚁剑连接 <?php eval($_POST[123])?> 上传木马 文件后缀写为.php.jpg 右键复制图片地址 打开蚁剑连接 先点击测试连接&#xff0c;显示成功后&#xff0c;再点击添加即可 …

不重启JVM,替换掉已经加载的类

不重启JVM&#xff0c;替换掉已经加载的类 直接操作字节码 使用ASM框架直接操作class文件&#xff0c;在类中修改代码&#xff0c;然后retransform就可以了 下边是BTrace官方提供的一个简单例子&#xff1a; package com.sun.btrace.samples;import com.sun.btrace.annotati…

使用插件SlideVerify实现滑块验证

作者gitee地址&#xff1a;https://gitee.com/monoplasty/vue-monoplasty-slide-verify 使用步骤&#xff1a; 1、安装插件 npm install --save vue-monoplasty-slide-verify 2、在main.js中进行配置 import SlideVerify from vue-monoplasty-slide-verify; Vue.use(SlideV…

Kafka 和 MQ 的区别

1.概述 1.1.MQ简介 消息中间件&#xff0c;其实准确的叫法应该叫消息队列&#xff08;message queue&#xff09;&#xff0c;简称MQ。其本质上是个队列&#xff0c;有FIFO的性质&#xff0c;即first in first out&#xff0c;先入先出。 目前市场上主流的MQ有三款&#xff…