是否有任何标准方法将资源嵌入Linux可执行映像?

And*_*rey 25 c++ linux embedded-resource

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

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

或者某种事实上的资源嵌入方法?

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

更新:

根据bdk的建议,我尝试了使用gcc mingw嵌入二进制blob中描述的解决方案,它对有用.虽然,有一些值得一提的问题:我的项目(在Code :: Blocks中)由许多C++文件组成,并将二进制数据添加到任何相应的目标文件中,使得它们无法破坏构建 - objdump -x将显示大多数嵌入后符号已经消失(我没有找到如何解决它).为了解决这个问题,我在项目中添加了一个空的虚拟.cpp文件,其唯一目的是提供一个可以使用的目标文件,并为该文件编写了以下自定义构建步骤,该文件很好地完成了工作(示例使用Code :: Blocks宏) ):

$compiler $options $includes -c $file -o $object
ld -Ur -b binary -o $object <binary payload path>
Run Code Online (Sandbox Code Playgroud)

Sim*_*und 30

自己做一个汇编文件blob.S:

    .global blob
    .global blob_size
    .section .rodata
blob:
    .incbin "blob.bin"
1:
blob_size:
    .int 1b - blob
Run Code Online (Sandbox Code Playgroud)

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

extern uint8_t blob[];
extern int blob_size;
Run Code Online (Sandbox Code Playgroud)

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


bdk*_*bdk 7

objcopy --add-section允许您将任意文件添加为ELF可执行文件中的一个部分.(objcopy手册页).然而,这只是解决方案的一半,因为除了通过使用ELF库加载和解析ELF二进制文件之外,我还没有找到从C程序内部访问此数据的方法.

编辑附加信息:

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

objcopy MyProgram --add-section MyResource=MyResource.dat
Run Code Online (Sandbox Code Playgroud)

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

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

现在的诀窍是如何从程序内部访问数据.我的直觉告诉我,加载器应该将文件放在某个地方的内存中,你应该能够获得指向它的指针,但是我不知道如何简单地做到这一点.理想情况下,我希望能够dlopen我的exeutable和dlsym部分,但这不起作用,因为它的一个部分而不是一个符号.

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

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

如果有人可以通过更简单的方式从--add-section访问数据,我会很高兴.

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

哪个适用于gcc以及mingw,并显示了一种使用ld而不是objcopy来添加数据并能够将其作为符号访问的方法.看起来很有希