存储只读数据混合汇编和C++

Store read only data mixing assembly and C++

本文关键字:C++ 汇编 混合 只读 数据 存储      更新时间:2023-10-16

我正在设计一些跨平台的工具,我想存储一些只读数据,比如:

  • 程序图标
  • 图像
  • 字符串
  • "制造商…"信息
  • 文件版本信息

我正在尝试对该工具进行编码,可以是"纯c",也可以是"c++"。

我想使用汇编程序存储资源数据,因此,数据可以通过两种方式读取:

(1) 程序或共享库本身读取其数据,作为变量或汇编程序数据段。

(2) 可执行文件或共享库文件可以由其他程序读取,而无需运行或加载。

在编译代码时,数据将只写入一次。

我找到了两种可能的方法。

(1) 内联组件。将asm指令直接添加到"纯c"或"c++"文件中,一些编译器,如Borland、MS、GNU,都有某种形式的asm指令。

(2) 在单独的文件中生成代码和程序集代码,并使用编译器工具(如链接器、构建或编译器)进行编译。

我不想存储汇编指令,只想存储数据

我的目标是x86-32位处理器,Windows,Linux&但是,如果可能的话,BSD可以扩展到其他平台或体系结构。

我知道Windows&Linux使用不同的文件格式,如PE、COFF或ELF二进制文件。

有其他想法或其他想法吗?关于如何做到这一点,有什么建议、手册和链接吗?

谢谢。

这可能有点难看,但有一件事应该是相对可移植的:将数据的全部内容存储为char数组,以魔术序列开始和结束。可能带有校验和。

例如

char data[]={
    't','h','e','_','s','t','a','r','t',0,
    // resource data here
    ....
    't','h','e','_','e','n','d',0,
    // maybe a checksum here
    ...
};

在我熟悉的所有平台上,这些字节都会连续存储在文件中(您可以扫描文件中的签名以加载资源)。当然,当程序运行时,数据在内存中是连续的(并且可以作为"数据"访问)。

如果不能选择这样的内容,您可能需要了解更多关于操作系统可执行文件格式的信息。

一种方法是将要存储的数据附加到编译后的二进制文件的末尾(可能是在编译后的步骤中),并直接在数据之后,将大小存储为32位或64位整数。

然后,要取出数据,在代码中,打开()二进制文件,搜索到末尾,读取大小,然后向后读取,直到获得所有数据。

简单且相当便携。