【问题标题】:include binary data files into compiled binary without converting to hex arrays [duplicate]将二进制数据文件包含到已编译的二进制文件中而不转换为十六进制数组[重复]
【发布时间】:2020-03-08 00:03:19
【问题描述】:

我经常希望将来自外部文件的二进制数据作为uint8_t 数组包含(编译)到我的程序(嵌入式或裸机)中。

有没有办法无需将它们转换为十六进制数组的额外步骤? 因为这涉及额外的构建步骤,这些步骤有时并不那么容易集成,例如如果是 Arduino 工具链。并且手动执行此操作总是会导致忘记十六进制更新:-)

通常我使用 gcc。因此,如果它是特定于 gcc 的编译指示或其他扩展,我也会很高兴(尽管不如通用解决方案那么高兴)。

可能是这样的

static const __attribute__((rawDataFromFile("myDataFile.bin"))) uint8_t s_data[];

而不是经典的对外方式
bin2hex myDataFile.bin myDataFile.hex

static const uint8_t s_data[] = {
  #include "myDataFile.hex"
};

CC++ 中工作的解决方案将是首选,但也欢迎仅在两者之一中工作的建议。

【问题讨论】:

  • 我不知道。我也很感兴趣,因为我通常只在我的几代人中使用xxd -i filename.bin,这至少具有轻松将依赖规则合并到makefile中的优点。
  • 建议添加std::embed 以标准化方式在源文件中嵌入任意数据,而无需手动将它们转录为字符串文字或十六进制:p1040R0

标签: c++ c gcc


【解决方案1】:

我在大约 20 年前使用 Turbo Pascal 时使用了一个老技巧,即将二进制文件转换为对象文件。 Here it is with C++:

  1. 数据文件data.dat

    ABC
    
  2. 转换成目标文件:

    ld -r -b binary data.dat -o data.o
    

    正如here 解释的那样,使用-b binary <name> 选项,目标文件将包含来自.data 部分中文件<name> 的原始二进制数据,以及三个符号_binary_<name>_start_binary_<name>_end_binary_<name>_size将被创建。

  3. 简单程序:

    #include <cstdint>
    #include <iostream>
    
    extern const std::uint8_t _binary_data_dat_start[];
    extern const std::uint8_t _binary_data_dat_end[];
    
    int main()
    {
        for (auto d = _binary_data_dat_start; d != _binary_data_dat_end; ++d)
            std::cout << (char)*d << ' ';
    }
    
  4. 编译和链接:

    g++ -c test.cpp
    g++ test.o data.o
    
  5. 输出:

    A B C
    

编辑 1

这也引入了数据的外部预处理,甚至引入了了解符号将如何命名的需求

不幸的是,这是真的。你可能想看看this library,它使用内联汇编嵌入二进制数据。

编辑 2 找到一个可能的duplicate question

【讨论】:

  • +1 但是,至少有关于在第 2 步中自动生成符号的评论以及它们在第 3 步中的程序中的样子是很有价值的
  • @FMashiro,会的,谢谢。
  • 感谢您的回答,但这也引入了数据的外部预处理,甚至引入了了解符号将如何命名的需要。
  • @vlad_tepesch,this library 呢?
  • 太棒了,这在我之前的搜索中没有出现。乍一看,那个图书馆看起来不错。我将不得不仔细检查它是否与不同的目标平台兼容,因为它使用内联汇编。
【解决方案2】:

使用ld

ld -r -b binary binaryfile -o objectfile 
objcopy --rename-section .data=.yoursection objectfile

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2014-11-18
    • 2023-04-03
    相关资源
    最近更新 更多