微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否有任何标准的方式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等。这样,程序二进制分发就像制作一个文件拷贝一样简单。 ( 假设所有库依赖关系都可以 )

Linux,如何在GDB中运行c代码之前等待几秒钟

强制Winforms安装以使应用程序在Windows启动时启动

订购两个线程的执行

去除OpenGL橡皮带文物

为什么Linux内核3.0+取消了super_operations.read_inode? 请求新的参考〜

更新:

根据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>

将GetTickCount()vxWorks转换为Linux

我如何检查重构时没有破坏什么?

Windows 8.1如何解决这个过时的代码

硬件加速缩放MFT在Windows7中

未定义引用符号'_ZN5boost6system15system_categoryEv'错误

使自己成为一个汇编文件,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文件中。 当用户运行可执行文件时,它将提取文件并运行一个任意的命令(可能是程序的主要可执行文件)。 有一个缺点,每次用户启动可执行文件,在启动真正的程序之前,首先加载/提取文件需要花费一些时间。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐