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

时间:2012-02-02 01:26:29

标签: c++ c assembly cross-platform

我正在设计一些跨平台工具,我想存储一些只读数据,一种资源数据(图像或字符串或"由...制造"信息或文件版本信息)。

我正在尝试对该工具进行编码,以及"纯c"或者" c ++"。

我想使用汇编程序存储资源数据,因此,可以直接从程序或共享库文件中读取数据,而无需执行

此外,程序本身也可以在执行时读取数据。

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

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

(1)内联汇编。直接将asm说明添加到"纯c"或" c ++"文件,几个编译器,如Borland,MS,GNU,都有这种形式。

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

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

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

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

任何其他或替代想法? 任何建议,手册,如何做到这一点的链接?

感谢。

2 个答案:

答案 0 :(得分:2)

这可能有点难看,但是你可以做的一件事应该是相对便携的:将数据的全部内容存储为char数组,以魔术序列开头和结尾。可能有校验和。

e.g。

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

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

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

答案 1 :(得分:2)

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

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

简单且相当便携。