当前位置: 首页>>操作系统>>正文


有什么标准的方式将资源嵌入Linux可执行映像?

Alonzo 操作系统 , , 去评论

问题描述

通过Windows API将二进制资源嵌入到PE映像(EXE,DLL)中是非常简单的(参考http://msdn.microsoft.com/en-us/library/ms648008(v=VS.85).aspx)。

在Linux中有没有类似的标准API?

还是某种de-facto的资源嵌入方式?

目标是将一些静态二进制和/或文本数据嵌入到可执行文件中。图片,HTML等等。所以程序二进制分发就像一个文件复制一样简单? (假设所有库依赖都可以)

更新:

按照bdk的建议,我已经尝试了Embedding binary blobs using gcc mingw中描述的解决方案,它适用于我。虽然有一些值得一提的问题:我的项目(Code :: Blocks)由多个C++文件组成,并将二进制数据添加到任何相应的对象文件中,使它们无法打破构建 – objdump -x将显示大部分嵌入后的符号已经消失(我没有找到如何解决它)。为了克服这个问题,我将一个空虚拟的.cpp文件添加到项目中,唯一的目的是提供一个对象文件来播放,并为完成该作业的文件编写了以下自定义构建步骤(示例使用Code :: Blocks宏):

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

最佳解决办法

使自己成为一个汇编文件,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很大,则incbin解决方案要快得多,并且使用的内存少得多(编译时间)

次佳解决办法

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的内容。该文件现在嵌入在您的可执行文件中。

现在的诀窍是如何从程序中访问数据。我的本能告诉我,装载器应该把文件放在某个地方的内存中,你应该可以得到一个指针,但是我不知道如何做到这一点。理想情况下,我想要能够使我的exeutable和dlsym的部分,但这不工作,因为它的一部分,而不是一个符号。

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

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

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

编辑2在我的研究中,我遇到了这个问题:Embedding binary blobs using gcc mingw

哪个应该适用于gcc以及mingw,并显示一种使用ld而不是objcopy添加数据并能够作为符号访问它的方法。看起来很有前途

第三种解决办法

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

参考文献

注:本文内容整合自google/baidu/bing辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:gxnotes#qq.com(#替换为@)。

本文由《共享笔记》整理, 博文地址: https://gxnotes.com/article/192132.html,未经允许,请勿转载。
Go