存储只读数据混合汇编和C++
Store read only data mixing assembly and C++
我正在设计一些跨平台的工具,我想存储一些只读数据,比如:
- 程序图标
- 图像
- 字符串
- "制造商…"信息
- 文件版本信息
我正在尝试对该工具进行编码,可以是"纯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位整数。
然后,要取出数据,在代码中,打开()二进制文件,搜索到末尾,读取大小,然后向后读取,直到获得所有数据。
简单且相当便携。
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 在 emscripten 网页汇编正在运行期间更新进度条?
- 为什么我们不编写可以处理C++标识符的汇编器和链接器?
- 在什么情况下,我想在 C/C++ 代码中使用内联汇编代码
- 为什么 memcpy() 和其他类似的函数使用汇编?
- [[可能]]和[[不太可能]]影响程序汇编的简单示例?
- 为什么 MSVC C++编译器将一个简单的 Hello World 扩展为 4000 行汇编?
- 英特尔汇编与内部函数,AVX
- 这个x86汇编代码是如何接收和存储子程序返回的数据的
- Capstone cs_disasm仅反汇编一小部分代码
- C++和汇编中的对数
- 卤化物:X86汇编代码生成
- C++:汇编代码包含断言结果
- 在 g++4.4.7 中为复数算术生成快速汇编
- 混合 c++ 和汇编不能将多个参数从C++函数传递到程序集
- 如何使用 gcc 内联汇编器代码访问成员变量
- SSE 内联汇编和可能的 g++ 优化错误
- C++汇编代码分析(使用 clang 编译)
- 设置Qt Creator以链接和编译汇编代码
- 在Cython中使用移动方法时的汇编误差