是否有任何标准的方式embedded资源到Linux可执行映像?

通过Windows API将二进制资源embedded到PE映像(EXE,DLL)中非常容易(请参阅http://msdn.microsoft.com/zh-cn/library/ms648008(v=VS.85).aspx )。

Linux中是否有类似的标准API?

或者可能是某种事实上的资源embedded方法?

目标是将一些静态的二进制和/或文本数据embedded到可执行文件中,例如图片,HTML等。这样,程序二进制分发就像制作一个文件拷贝一样简单。 ( 假设所有库依赖关系都可以

更新:

根据bdk的build议,我已经尝试了使用gcc mingwembedded二进制blob中描述的解决scheme,它为我工作。 虽然有一些值得一提的问题:我的项目(在Code :: Blocks中)包含许多C ++文件,并将二进制数据添加到任何相应的对象文件中,使得它们无用地破坏构buildobjdump -x将显示大部分的符号已经在embedded后(我没有find如何解决这个问题)。 为了克服这个问题,我添加了一个空的.cpp文件到项目中,唯一的目的是提供一个对象文件来播放,并为该文件写了下面的自定义构build步骤,很好地完成了这项工作(例如使用Code :: Blocksmacros):

 $compiler $options $includes -c $file -o $object ld -Ur -b binary -o $object <binary payload path> 

Solutions Collecting From Web of "是否有任何标准的方式embedded资源到Linux可执行映像?"

使自己成为一个汇编文件,blob.S:

  .global blob .global blob_size .section .rodata blob: .incbin "blob.bin" 1: blob_size: .int 1b - blob 

使用gcc -c blob.S编译-o blob.o现在可以在C程序中使用以下命令访问blob:

 extern uint8_t blob[]; extern int blob_size; 

使用bin2c转换器通常可以正常工作,但是如果blob很大,incinc解决方案要快得多,并且使用更少的内存(编译时间)

objcopy –add-section允许你在ELF可执行文件中添加一个任意文件。 (objcopy手册页)。 然而,这只是一个解决方案,因为我还没有找到一种方法来从C程序内部访问这些数据,而不是使用ELF库加载和解析ELF二进制文件。

编辑其他信息:

如果您有一个名为MyProgram的编译程序和一个您希望嵌入到MyProgram中的资源文件MyResource.dat,则可以使用objcopy命令,如下所示:

 objcopy MyProgram --add-section MyResource=MyResource.dat 

现在,如果您使用命令objdump -x MyProgram查看您的程序

您将看到一个名为MyResource的部分,其中包含MyResource.dat的内容。 该文件现在嵌入在您的可执行文件中。

现在的诀窍就是如何从程序中访问数据。 我的本能告诉我,加载器应该把文件放到内存中,你应该能够得到一个指针,但是我不知道该怎么做。 理想情况下,我希望能够减少我的exeable和dlsym部分,但这是行不通的,因为它的一个部分而不是一个符号。

我所知道的唯一一种从程序内部访问该部分的方法是使用libelf库或类似的东西,就像使用大锤敲击指甲一样。 您可以在您的应用程序中使用它来加载自己作为ELF资源并检索这些部分。 文档很少,但是这里是一个例子

http://em386.blogspot.com/2007/03/quick-libelf-guide.html

如果有人能用更简单的方式访问–add-section中的数据,我很乐意。

编辑2在我的研究中,我遇到了这个问题: 使用gcc mingw嵌入二进制blob

这应该为gcc以及mingw工作,并显示了使用ld而不是objcopy添加数据,并能够作为符号访问它的方式。 看起来很有希望

当然。 尝试像Bin2Hex转换器 。 将二进制数据转换为C ++ char数组,然后将其作为常量变量嵌入到代码中。

如何使自己

它会将一个tar文件从一个目录放到你的所有程序,资源文件到一个可执行的shell文件中。 当用户运行可执行文件时,它将提取文件并运行一个任意的命令(可能是程序的主要可执行文件)。 有一个缺点,每次用户启动可执行文件,在启动真正的程序之前,首先加载/提取文件需要花费一些时间。