Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PE格式:实现ELF结构解析工具

PE格式:实现ELF结构解析工具

原创
作者头像
王 瑞
发布于 2022-12-24 11:23:55
发布于 2022-12-24 11:23:55
6060
举报

ELF文件格式,是一个开放的可执行文件和链接文件格式,其主要工作在Linux系统上,是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件,ELF文件格式类似于PE格式,但比起PE结构来ELF结构显得更加的简单,Linux文件结构相比于Windows结构来说简单一些.

读取ELF头: 首先需要先来编译一个简单的ELF文件,然后将文件编译并连接.

代码语言:C
AI代码解释
复制
[root@localhost ~]# cat lyshark.c 
#include <stdio.h>

int main()
{
	printf("hello lyshark");
	return 0;
}
[root@localhost ~]# gcc -c lyshark.c 
[root@localhost ~]# gcc -o lyshark lyshark.o 

Linux系统中有一个默认命令readelf -h可以解析指定文件的头结构.

代码语言:shell
AI代码解释
复制
[root@localhost ~]# readelf -h lyshark
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64  64位程序
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V  调用约定
  ABI Version:                       0
  Type:                              EXEC (Executable file)  可执行文件
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x400430            #程序的入口地址
  Start of program headers:          64 (bytes into file)
  Start of section headers:          6464 (bytes into file)
  Flags:                             0x0               #标志
  Size of this header:               64 (bytes)        #本头大小
  Size of program headers:           56 (bytes)        #程序头大小
  Number of program headers:         9
  Size of section headers:           64 (bytes)        #节头大小
  Number of section headers:         31                #节表数量
  Section header string table index: 30                #字符串表索引节头

通过hexdump工具查看文件16进制文件头hexdump -s 0 -n 64 -C lyshark

代码语言:shell
AI代码解释
复制
[root@localhost ~]# hexdump -s 0 -n 64 -C lyshark

00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 3e 00 01 00 00 00  30 04 40 00 00 00 00 00  |..>.....0.@.....|
00000020  40 00 00 00 00 00 00 00  40 19 00 00 00 00 00 00  |@.......@.......|
00000030  00 00 00 00 40 00 38 00  09 00 40 00 1f 00 1e 00  |....@.8...@.....|

linux系统中的节头文件保存在/usr/include/elf.h我通过查找找到了ELF64所对应的结构数据

代码语言:C
AI代码解释
复制
typedef uint16_t Elf64_Half; 16
typedef uint32_t Elf64_Word; 32
typedef uint64_t Elf64_Addr; 64
typedef uint64_t Elf64_Off;  64
#define EI_NIDENT (16)

typedef struct
{
  unsigned char e_ident[EI_NIDENT];     /* 一个字节数组用来确认文件是否是一个ELF文件 */
  Elf64_Half    e_type;                 /* 描述文件是,可执行文件elf=2,重定位so=3 */
  Elf64_Half    e_machine;              /* 目标主机架构 */
  Elf64_Word    e_version;              /* ELF文件格式的版本 */
  Elf64_Addr    e_entry;                /* 入口点虚拟地址 */
  Elf64_Off     e_phoff;                /* 程序头文件偏移 */
  Elf64_Off     e_shoff;                /* 节头表文件偏移 */
  Elf64_Word    e_flags;                /* ELF文件标志 */
  Elf64_Half    e_ehsize;               /* ELF头大小 */
  Elf64_Half    e_phentsize;            /* 程序头大小 */
  Elf64_Half    e_phnum;                /* 程序头表计数 */
  Elf64_Half    e_shentsize;            /* 节头表大小 */
  Elf64_Half    e_shnum;                /* 节头表计数 */
  Elf64_Half    e_shstrndx;             /* 字符串表索引节头 */
} Elf64_Ehdr;

通过编程实现Magic的读取,或者说实现的是文件头e_ident[16]文件的读取,通过定义可得知文件头大小是16字节

代码语言:C
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>
#include <elf.h>

int main(int argc,char* argv[])
{
        if(argc < 2){ exit(0); }
        FILE *fp;
        Elf64_Ehdr elf_header;

        fp = fopen(argv[1],"r");
        if(fp == NULL) { exit(0); }

        int readfile;
        readfile = fread(&elf_header,sizeof(Elf64_Ehdr),1,fp);
        if(readfile == 0){ exit(0); }

        if(elf_header.e_ident[0] == 0x7F || elf_header.e_ident[1] == 'E')
        {
                printf("头标志: ");
                for(int x =0;x<16;x++)
                {
                        printf("%x ",elf_header.e_ident[x]);
                }
                printf("\n");
        }
        return 0;
}

编译并运行即可读取出文件头部的前16个字节的字节数组,我们最需要关注的就是开头前4个字节,其标志着PE文件的开始

代码语言:shell
AI代码解释
复制
[root@localhost ~]# gcc -std=c99 -o elf elf.c 
[root@localhost ~]# ./elf lyshark
头标志: 7f 45 4c 46 2 1 1 0 0 0 0 0 0 0 0 0 

除此之外,读取其他头结构数据,代码与上方类似,只需要稍微改动一下就好.

代码语言:C
AI代码解释
复制
        if(elf_header.e_ident[0] == 0x7F || elf_header.e_ident[1] == 'E')
        {
                printf("文件类型: %hx\n",elf_header.e_type);
                printf("运行平台: %hx\n",elf_header.e_machine);
                printf("入口虚拟RVA: 0x%x\n",elf_header.e_entry);
                printf("程序头文件偏移: %d(bytes)\n",elf_header.e_phoff);
                printf("节头表文件偏移: %d(bytes)\n",elf_header.e_shoff);
                printf("ELF文件头大小: %d\n",elf_header.e_ehsize);
                printf("ELF程序头大小: %d\n",elf_header.e_phentsize);
                printf("ELF程序头表计数: %d\n",elf_header.e_phnum);
                printf("ELF节头表大小: %d\n",elf_header.e_shentsize);
                printf("ELF节头表计数: %d\n",elf_header.e_shnum);
                printf("字符串表索引节头: %d\n",elf_header.e_shstrndx);
        }

运行后,就可以读取到所有的节头数据.

代码语言:shell
AI代码解释
复制
[root@localhost ~]# gcc -std=c99 -o elf elf.c &&  ./elf lyshark
文件类型: 2
运行平台: 3e
入口虚拟RVA: 0x400430
程序头文件偏移: 64(bytes)
节头表文件偏移: 6464(bytes)
ELF文件头大小: 64
ELF程序头大小: 56
ELF程序头表计数: 9
ELF节头表大小: 64
ELF节头表计数: 31
字符串表索引节头: 30

读取ELF节表: 首先打开elf.h头文件,找到这个声明处Elf64_Shdr.

代码语言:shell
AI代码解释
复制
typedef uint32_t Elf64_Word; 32
typedef uint64_t Elf64_Addr; 64
typedef uint64_t Elf64_Off;  64
typedef uint64_t Elf64_Xword; 64

typedef struct
{
  Elf64_Word    sh_name;                /* 节区名称 */
  Elf64_Word    sh_type;                /* 节区类型 */
  Elf64_Xword   sh_flags;               /* 节区标志 */
  Elf64_Addr    sh_addr;                /* 如果在内存中运行,此处存放数据的内存地址 */
  Elf64_Off     sh_offset;              /* 节区数据相对于文件的实际偏移量 */
  Elf64_Xword   sh_size;                /* 节区大小 */
  Elf64_Word    sh_link;                /* 节头表索引链接,其解释依赖于节区类型 */
  Elf64_Word    sh_info;                /* 额外信息 */
  Elf64_Xword   sh_addralign;           /* 节地址对其约束 */
  Elf64_Xword   sh_entsize;             /* 固定大小项的表 */
} Elf64_Shdr;

通过使用hexdump -s 144从偏移为144的位置开始读取,向后读取100个字节,就是节表所在位置.

代码语言:shell
AI代码解释
复制
[root@localhost ~]# hexdump -s 144 -n 100 -C lyshark
00000090  38 02 40 00 00 00 00 00  1c 00 00 00 00 00 00 00  |8.@.............|
000000a0  1c 00 00 00 00 00 00 00  01 00 00 00 00 00 00 00  |................|
000000b0  01 00 00 00 05 00 00 00  00 00 00 00 00 00 00 00  |................|
000000c0  00 00 40 00 00 00 00 00  00 00 40 00 00 00 00 00  |..@.......@.....|
000000d0  0c 07 00 00 00 00 00 00  0c 07 00 00 00 00 00 00  |................|
000000e0  00 00 20 00 00 00 00 00  01 00 00 00 06 00 00 00  |.. .............|
000000f0  10 0e 00 00                                       |....|

编程实现简单的节表读取,只需要在上方代码基础上进行修改即可.

代码语言:shell
AI代码解释
复制
        if(elf_header.e_ident[0] == 0x7F || elf_header.e_ident[1] == 'E')
        {
                int shnum, x;
                Elf64_Shdr *shdr = (Elf64_Shdr*)malloc(sizeof(Elf64_Shdr) * elf_header.e_shnum);
                temp = fseek(fp, elf_header.e_shoff, SEEK_SET);
                temp = fread(shdr, sizeof(Elf64_Shdr) * elf_header.e_shnum, 1, fp);
                rewind(fp);
                fseek(fp, shdr[elf_header.e_shstrndx].sh_offset, SEEK_SET);
                char shstrtab[shdr[elf_header.e_shstrndx].sh_size];
                char *names = shstrtab;
                temp = fread(shstrtab, shdr[elf_header.e_shstrndx].sh_size, 1, fp);
                printf("节类型\t节地址\t节偏移\t节大小\t节名称\n");
                for(shnum = 0; shnum < elf_header.e_shnum; shnum++)
                {
                        names = shstrtab;
                        names=names+shdr[shnum].sh_name;
                        printf("%x\t%x\t%x\t%x\t%s \n",shdr[shnum].sh_type,shdr[shnum].sh_addr,shdr[shnum].sh_offset,shdr[shnum].sh_size,names);
                }

        }

Linux系统中也可以使用objdump命令读取程序的节表信息.

代码语言:shell
AI代码解释
复制
[root@localhost ~]# objdump -h lyshark
lyshark:     file format elf64-x86-64
Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .interp       0000001c  0000000000400238  0000000000400238  00000238  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .note.ABI-tag 00000020  0000000000400254  0000000000400254  00000254  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .note.gnu.build-id 00000024  0000000000400274  0000000000400274  00000274  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .gnu.hash     0000001c  0000000000400298  0000000000400298  00000298  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .dynsym       00000060  00000000004002b8  00000000004002b8  000002b8  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  5 .dynstr       0000003f  0000000000400318  0000000000400318  00000318  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  6 .gnu.version  00000008  0000000000400358  0000000000400358  00000358  2**1

当然objdump命令,还可以排查文件的SO加载情况.

代码语言:shell
AI代码解释
复制
[root@localhost ~]# objdump -p /usr/bin/git | grep NEEDED
  NEEDED               libpcre.so.1
  NEEDED               libz.so.1
  NEEDED               libpthread.so.0
  NEEDED               libc.so.6

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【愚公系列】2023年02月 WMS智能仓储系统-016.库存管理和仓内作业(库存管理、仓内加工、库存移动)
文章目录 前言 一、库存管理 1.1 页面代码 1.2 接口代码 二、仓内作业 1.仓内加工 1.1 页面代码 1.2 接口代码 2.库存移动 2.1 页面代码 2.2 接口代码 ---- 前言 这节主要分为两个模块: 库存管理:库存管理的作用是确保有足够的库存量以满足消费者需求,减少库存空置和库存损耗,并有效地控制库存成本。 仓内作业:仓内作业的作用是帮助仓库提高组织效率和完成仓库管理。它提高了仓库存储条件、运输条件和信息系统的效率,并节省了人力成本。 一、库存管理 库存管理数据主要
愚公搬代码
2023/03/16
7700
【愚公系列】2023年02月 WMS智能仓储系统-016.库存管理和仓内作业(库存管理、仓内加工、库存移动)
【愚公系列】2023年02月 WMS智能仓储系统-018.收获管理和发货管理(完结篇)
4.待分拣:收货管理员需要严格按照收货质量标准进行管理,以确保货物的质量,并进行分类;
愚公搬代码
2023/03/16
4850
【愚公系列】2023年02月 WMS智能仓储系统-018.收获管理和发货管理(完结篇)
【愚公系列】2023年02月 WMS智能仓储系统-015.基础设置(商品管理、供应商信息、仓库设置)
文章目录 前言 一、基础设置 1.商品管理 1.1 页面代码 1.2 接口代码 2.供应商信息 2.1 页面代码 2.2 接口代码 3.仓库设置 3.1 页面代码 3.2 接口代码 ---- 前言 基础设置主要分为以下几个模块: 首页 公司信息 角色设置 菜单设置 用户管理 商品类别设置 商品管理 供应商信息 仓库设置 货主信息 运费设置 客户信息 对于商品就要说下SPU和 SKU SPU:SPU(Standard Product Unit):标准化产品单元。是商品信息聚合的最小单位,是一组可复
愚公搬代码
2023/03/16
1.2K0
【愚公系列】2023年02月 WMS智能仓储系统-015.基础设置(商品管理、供应商信息、仓库设置)
【愚公系列】2023年02月 WMS智能仓储系统-011.数据库文档设计
数据库设计文档是一项重要工作,它涉及到数据库设计的方方面面,是保证数据库能够正常工作,运行稳定,以满足用户需求的重要工具。其中包括数据库设计的方案,对不同类型的数据存储,数据存储结构,数据库调优功能,数据库安全方案,数据库实现方式,安装配置和其他内容。
愚公搬代码
2023/03/16
4150
【愚公系列】2023年02月 WMS智能仓储系统-011.数据库文档设计
【愚公系列】2023年02月 WMS智能仓储系统-013.基础设置(首页、公司信息、角色设置)
文章目录 前言 一、基础设置 1.首页 2.公司信息 2.1 页面代码 2.2 接口代码 3.角色设置 3.1 页面代码 3.2 接口代码 ---- 前言 基础设置主要分为以下几个模块: 首页 公司信息 角色设置 菜单设置 用户管理 商品类别设置 商品管理 供应商信息 仓库设置 货主信息 运费设置 客户信息 一、基础设置 1.首页 这就不多说了就是个标题和svg图片 2.公司信息 2.1 页面代码 1、主页面代码 <template> <div class="container">
愚公搬代码
2023/03/16
3520
【愚公系列】2023年02月 WMS智能仓储系统-013.基础设置(首页、公司信息、角色设置)
【愚公系列】2023年02月 WMS智能仓储系统-015.基础设置(货主信息、运费设置、客户信息)
这边需要提下客户和货主的概念:客户是与仓储签订直接合同的甲方,货主是拥有货权的人。
愚公搬代码
2023/03/16
4410
【愚公系列】2023年02月 WMS智能仓储系统-015.基础设置(货主信息、运费设置、客户信息)
【愚公系列】2023年02月 WMS智能仓储系统-014.基础设置(菜单设置、用户管理、商品类别设置)
文章目录 前言 一、基础设置 1.菜单设置 1.1 页面代码 1.2 接口代码 2.用户管理 2.1 页面代码 2.2 接口代码 3.商品类别设置 3.1 页面代码 3.2 接口代码 ---- 前言 基础设置主要分为以下几个模块: 首页 公司信息 角色设置 菜单设置 用户管理 商品类别设置 商品管理 供应商信息 仓库设置 货主信息 运费设置 客户信息 一、基础设置 1.菜单设置 这边菜单是写死的,因为只是WMS需要的不多。 1.1 页面代码 1、主页面代码 <template>
愚公搬代码
2023/03/16
6650
【愚公系列】2023年02月 WMS智能仓储系统-014.基础设置(菜单设置、用户管理、商品类别设置)
数仓分层ods_数仓用来干嘛
1)保持数据原貌不做任何修改,起到备份数据的作用。 2)数据采用LZO压缩,减少磁盘存储空间。100G数据可以压缩到10G以内。 3)创建分区表,防止后续的全表扫描,在企业开发中大量使用分区表。 4)创建外部表。在企业开发中,除了自己用的临时表,创建内部表外,绝大多数场景都是创建外部表。
全栈程序员站长
2022/11/08
8110
数仓分层ods_数仓用来干嘛
【愚公系列】2022年01月 Django商城项目 26-搜索引擎功能实现
搜索引擎进行全文检索时,会对数据库中的数据进行一遍预处理,单独建立起一份索引结构数据。
愚公搬代码
2022/02/02
5310
【愚公系列】2022年01月 Django商城项目 26-搜索引擎功能实现
数仓搭建ODS层_中心仓模式
4)创建外部表。在企业开发中,除了自己用的临时表,创建内部表外,绝大多数场景都是创建外部表。
全栈程序员站长
2022/11/08
8330
数仓搭建ODS层_中心仓模式
【愚公系列】2022年01月 Django商城项目 27-商品详情页功能实现
文章目录 一、商品详情页功能实现 1.后台查询代码 二、详情页面展示 1.前台html代码 2.实际效果 三、包装、规格、售后页面展示 1.前台html代码 2.实际效果 四、404页面 1.前台html代码 2.实际效果 一、商品详情页功能实现 1.后台查询代码 class DetailView(View): def get(self,request,sku_id): # 获取当前sku的信息 try: sku = SKU.objects
愚公搬代码
2022/02/02
3970
【愚公系列】2022年01月 Django商城项目 27-商品详情页功能实现
商城项目-商品查询
接下来,我们自己来实现一下,新建两个组件:MyGoods.vue和MyGoodsForm.vue
cwl_java
2020/02/11
1.6K0
【愚公系列】2022年02月 Django商城项目 33-订单确认功能实现
文章目录 一、订单确认功能实现 1.后台处理逻辑 2.JS 二、订单支付成功页面 1.后台逻辑 2.页面设计 3.实际效果 一、订单确认功能实现 1.后台处理逻辑 class OrderView(LoginRequiredJSONMixin,View): def post(self,request): # 这里省略了很多操作,这些操作不需要事务 # 1.订单信息 # 1.1 获取用户信息 user = request.u
愚公搬代码
2022/02/07
5030
【愚公系列】2022年02月 Django商城项目 33-订单确认功能实现
【愚公系列】2022年02月 Django商城项目 32-订单页面设计
文章目录 一、订单页面设计 1.HTML 2.JS 3.后端业务逻辑 二、页面效果 一、订单页面设计 1.HTML <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http
愚公搬代码
2022/02/05
4430
【愚公系列】2022年02月 Django商城项目 32-订单页面设计
【愚公系列】2022年11月 微信小程序-优购电商项目-商品详情页面
商品详情页是展示商品详细信息的一个页面,承载在网站的大部分流量和订单的入口。京东商城目前有通用版、全球购、闪购、易车、惠买车、服装、拼购、今日抄底等许多套模板。各套模板的元数据是一样的,只是展示方式不一样。目前商品详情页个性化需求非常多,数据来源也是非常多的,而且许多基础服务做不了的都放我们这,因此我们需要一种架构能快速响应和优雅的解决这些需求问题。因此我们重新设计了商品详情页的架构,主要包括三部分:商品详情页系统、商品详情页统一服务系统和商品详情页动态服务系统;商品详情页系统负责静的部分,而统一服务负责动的部分,而动态服务负责给内网其他系统提供一些数据服务。
愚公搬代码
2022/11/14
4730
【愚公系列】2022年11月 微信小程序-优购电商项目-商品详情页面
【愚公系列】2023年02月 WMS智能仓储系统-012.登录功能的实现
http是无状态的通过cookie在客户端记录状态通过session在服务器端记录状态通过token方式维持状态
愚公搬代码
2023/03/16
7320
【愚公系列】2023年02月 WMS智能仓储系统-012.登录功能的实现
商城项目-商品新增
我们刚刚在查询时,已经实现创建了MyGoodsForm.vue,并且已经在MyGoods中引入。
cwl_java
2020/02/11
3.6K0
【第五篇】商城系统-商品属性管理
SPU是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性。通俗点讲,属性值、特性相同的商品就可以称为一个SPU。
用户4919348
2022/09/16
8720
【第五篇】商城系统-商品属性管理
【愚公系列】2023年02月 WMS智能仓储系统-008.Jwt的配置
JWT(Json Web Token)是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。JWT作为一个开放的标准( RFC 7519 ),定义了一种简洁的,自包含的方法用于通信双方之间以Json对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。
愚公搬代码
2023/03/16
4390
【愚公系列】2023年02月 WMS智能仓储系统-008.Jwt的配置
mycat分库分表+springcloud微服务小案例实现
  本案例将模拟电商项目中的商品管理、订单管理、基础信息管理、日志管理模块,对整个系统中的数据表进行分片操作,将根据不同的业务需求,采用不同的分片方式 。 项目结构
别团等shy哥发育
2023/02/25
4140
mycat分库分表+springcloud微服务小案例实现
推荐阅读
【愚公系列】2023年02月 WMS智能仓储系统-016.库存管理和仓内作业(库存管理、仓内加工、库存移动)
7700
【愚公系列】2023年02月 WMS智能仓储系统-018.收获管理和发货管理(完结篇)
4850
【愚公系列】2023年02月 WMS智能仓储系统-015.基础设置(商品管理、供应商信息、仓库设置)
1.2K0
【愚公系列】2023年02月 WMS智能仓储系统-011.数据库文档设计
4150
【愚公系列】2023年02月 WMS智能仓储系统-013.基础设置(首页、公司信息、角色设置)
3520
【愚公系列】2023年02月 WMS智能仓储系统-015.基础设置(货主信息、运费设置、客户信息)
4410
【愚公系列】2023年02月 WMS智能仓储系统-014.基础设置(菜单设置、用户管理、商品类别设置)
6650
数仓分层ods_数仓用来干嘛
8110
【愚公系列】2022年01月 Django商城项目 26-搜索引擎功能实现
5310
数仓搭建ODS层_中心仓模式
8330
【愚公系列】2022年01月 Django商城项目 27-商品详情页功能实现
3970
商城项目-商品查询
1.6K0
【愚公系列】2022年02月 Django商城项目 33-订单确认功能实现
5030
【愚公系列】2022年02月 Django商城项目 32-订单页面设计
4430
【愚公系列】2022年11月 微信小程序-优购电商项目-商品详情页面
4730
【愚公系列】2023年02月 WMS智能仓储系统-012.登录功能的实现
7320
商城项目-商品新增
3.6K0
【第五篇】商城系统-商品属性管理
8720
【愚公系列】2023年02月 WMS智能仓储系统-008.Jwt的配置
4390
mycat分库分表+springcloud微服务小案例实现
4140
相关推荐
【愚公系列】2023年02月 WMS智能仓储系统-016.库存管理和仓内作业(库存管理、仓内加工、库存移动)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档