Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 存储只读数据混合组件和C++;_C++_C_Assembly_Cross Platform - Fatal编程技术网

C++ 存储只读数据混合组件和C++;

C++ 存储只读数据混合组件和C++;,c++,c,assembly,cross-platform,C++,C,Assembly,Cross Platform,我正在设计一些跨平台的工具,我想存储一些只读数据,比如: 程序图标 图像 弦 “制造商…”信息 文件版本信息 我正在尝试编写这个工具,或者是“纯c”或者“c++” 我希望使用汇编程序存储资源数据,因此,可以通过两种方式读取数据: (1) 程序或共享库本身读取其数据,作为变量或汇编程序数据段 (2) 其他程序可以读取可执行文件或共享库文件,而无需运行或加载 编译代码时,数据将只写入一次 我找到了两种可能的方法 (1) 内联汇编。将asm指令直接添加到“纯c”或“c++”文件中,一些编译器,如B

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

  • 程序图标
  • 图像
  • “制造商…”信息
  • 文件版本信息
我正在尝试编写这个工具,或者是“纯c”或者“c++”

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

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

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

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

我找到了两种可能的方法

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

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

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

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

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

有其他的或替代的想法吗? 有没有关于如何做到这一点的建议、手册和链接


谢谢。

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

e、 g

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


如果这样的东西不是一个选项,你可能需要更多地了解你的操作系统的可执行文件格式。

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

e、 g

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


如果这样的选项不可用,您可能需要更多地了解操作系统的可执行文件格式。

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

然后在代码中,打开二进制文件,搜索到底,读取大小,然后向后读取,直到获得所有数据


简单且可移植。

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

然后在代码中,打开二进制文件,搜索到底,读取大小,然后向后读取,直到获得所有数据


简单且可移植。

这个答案可能有您想要的信息:一个方法只适用于GCC工具链,而另一个方法适用于任何C编译器。要允许共享库读取数据,您需要有一些方法将指向数据的指针获取到共享库(如果这对您来说可行的话,可以通过函数轻松实现)。这个答案可能包含您想要的信息:一个方法仅适用于GCC工具链,而另一个方法适用于任何C编译器。要允许共享库读取数据,您需要有一些方法来获取指向共享库的数据指针(如果对您来说可行的话,通过函数很容易做到)。使用开始标记和结束标记。第三种,可供选择的,但实际可行的方法。我会考虑的。谢谢。如果它是只读的,它可以是
const
,因此可以进入
.rodata
部分。使用开始标记和结束标记。第三种,可供选择的,但实际可行的方法。我会考虑的。谢谢。如果它是只读的,它可以是
const
,这样就可以进入
.rodata
部分。我也会检查这个选项。谢谢。我也会检查这个替代方案。谢谢
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
    ...
};