C语言解析FLM(ELF)格式文件

C语言解析FLM(ELF)格式文件


代码下载:https://gitee.com/jhembedded/flmparse


1、前言

写这篇博客的目的是因为最近在做一个STM32的离线编程器,离线下载需要用到FLM文件的下载算法,所以实现了一下提取FLM文件中下载算法的C程序。

有关ELF格式的详细说明可查看这个文件:http://flint.cs.yale.edu/cs422/doc/ELF_Format.pdf

推荐一个elf分析软件:http://www.elfparser.com/index.html,软件如下图:


2、快速扫盲

ELF 全称 “Executable and Linkable Format”,即可执行可链接文件格式,目前常见的Linux、 Android可执行文件、共享库(.so)、目标文件( .o)以及Core 文件(吐核)均为此格式。

常见的ELF文件大致结构如下:

  • 如果是LINUX系统,使用GCC编译出来的程序就是该格式,性质等同于windows系统下的.exe格式运行程序;
  • 在keil中,编译完成之后有一个 .axf 文件,这个文件也是elf格式;
  • FLM格式文件是KEIL里的FLASH下载算法文件,他其实就是.axf文件的拷贝,换了个后缀名称而已。

3、运行效果


ends…

  • 8
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
以下是一个简单的C++实现FLM文件解析的示例代码: ```cpp #include <iostream> #include <fstream> #include <vector> struct FLMHeader { char magic[4]; uint32_t version; uint32_t num_fonts; }; struct FLMFontInfo { uint32_t font_id; uint32_t num_glyphs; uint32_t glyph_offset; }; struct FLMGlyphInfo { uint32_t glyph_id; uint32_t glyph_size; uint32_t glyph_offset; }; int main(int argc, char** argv) { if (argc < 2) { std::cout << "Usage: " << argv[0] << " <flm_file>" << std::endl; return 0; } std::ifstream fs(argv[1], std::ios::binary); if (!fs.is_open()) { std::cout << "Failed to open FLM file: " << argv[1] << std::endl; return 0; } FLMHeader header; fs.read(reinterpret_cast<char*>(&header), sizeof(header)); if (strncmp(header.magic, "FLM ", 4) != 0) { std::cout << "Invalid FLM file: " << argv[1] << std::endl; return 0; } std::vector<FLMFontInfo> font_info_list(header.num_fonts); fs.read(reinterpret_cast<char*>(font_info_list.data()), sizeof(FLMFontInfo) * header.num_fonts); for (auto& font_info : font_info_list) { std::cout << "Font ID: " << font_info.font_id << std::endl; fs.seekg(font_info.glyph_offset, std::ios_base::beg); std::vector<FLMGlyphInfo> glyph_info_list(font_info.num_glyphs); fs.read(reinterpret_cast<char*>(glyph_info_list.data()), sizeof(FLMGlyphInfo) * font_info.num_glyphs); for (auto& glyph_info : glyph_info_list) { fs.seekg(glyph_info.glyph_offset, std::ios_base::beg); std::vector<char> glyph_data(glyph_info.glyph_size); fs.read(glyph_data.data(), glyph_info.glyph_size); // Process glyph data here } } fs.close(); return 0; } ``` 这个简单的代码实现了FLM文件头和字体、字形信息的读取,并可以通过文件偏移量读取每个字形的数据。在实际使用中,需要根据具体的需求进一步扩展和优化代码。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

觉皇嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值