【问题标题】:Store read only data mixing assembly and C++存储只读数据混合汇编和C++
【发布时间】:2012-02-02 01:26:28
【问题描述】:

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

  • 程序图标
  • 图片
  • 字符串
  • “由...制造”信息
  • 文件版本信息

我正在尝试编写工具,“纯 c”或“c++”。

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

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

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

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

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

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

(2) 在单独的文件中生成代码和汇编代码,并使用编译器工具,如链接器、构建器或编译器来编译所有文件。

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

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

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

还有其他或替代的想法吗? 有关如何执行此操作的任何建议、手册、链接?

谢谢。

【问题讨论】:

  • 此答案可能包含您想要的信息:stackoverflow.com/a/4158997/12711 一种方法仅适用于 GCC 工具链,但另一种方法适用于任何 C 编译器。要允许共享库读取数据,您需要有一些方法来获取指向共享库的数据的指针(如果这对您可行,可以通过函数轻松完成)。

标签: c++ c assembly cross-platform


【解决方案1】:

这可能有点难看,但您可以做一件相对可移植的事情:将数据的全部内容存储为 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
    ...
};

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

如果这样的事情不是一个选项,您可能需要了解更多有关您操作系统的可执行文件格式的信息。

【讨论】:

  • 使用开始标记和结束标记。第三种,替代但实用的方法。我会考虑的。谢谢。
  • 如果它是只读的,它可以是const,所以它可以进入.rodata部分。
【解决方案2】:

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

然后要取出数据,在您的代码中,打开()您的二进制文件,寻找到最后,读取大小,然后向后读取,直到获得所有数据。

简单且相当便携。

【讨论】:

  • 我也会检查这个替代方案。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多