c++ - 存储只读数据混合程序集和 C++

标签 c++ c assembly cross-platform

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

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

我正在尝试编写该工具的代码,无论是“纯 c”还是“c++”。

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

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

(2) 可执行文件或共享库文件在未运行或未加载的情况下可以被其他程序读取。

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

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

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

(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
    ...
};

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

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

关于c++ - 存储只读数据混合程序集和 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9105886/

相关文章:

c++ - 如何实际上在C++中 “clear”一个 vector ?

c++ - 为什么非成员函数不能用于重载赋值运算符?

c++ - 出错时返回第一条指令

c++ - 无需源代码即可调试/绕过 BSOD

assembly - i386汇编问题: why do I need to meddle with the stack pointer?

c - 我在这个 c 程序中遇到错误

c++ - Linux:如何测量进程内线程的内存使用情况?

c - 在字符串中使用下划线

assembly - ASM : operand type mismatch for `cmp'

assembly - 堆栈参数在使用 C 调用约定的程序集中消失