embedding binary objects in c

栏目: IT技术 · 发布时间: 4年前

内容简介:You have a blob of some data which you would like to embed into your C program. Perhaps a splash screen, or a special font, firmware for your scsi card, or whatever. The usual approach which I think most people are familiar with is to run something likeBut

You have a blob of some data which you would like to embed into your C program. Perhaps a splash screen, or a special font, firmware for your scsi card, or whatever. The usual approach which I think most people are familiar with is to run something like xxd -i to generate a source file with a large array of hex constants. Or write your own little script for that purpose.

But what if we could just link binaries into our program directly? We can. Mostly. I had no idea this was possible until after reading this list posting which explains the technique. It requires an intermediate object file, but it’s much faster to generate and compile then a textual equivalent file.

I thought this was pretty cool and needed to try it out. I’m going to write a little quine like program that prints its own source.

quine.c:

#include <stdio.h>

int
main(int argc, char **argv)
{
        extern const char _binary_quine_c_start, _binary_quine_c_end;
        const char *start = &_binary_quine_c_start;
        const char *end = &_binary_quine_c_end;

        fwrite(start, end - start, 1, stdout);
}

Now we need to prepare the object. This is where I ran into just a touch of trouble. Over here, ld is ld.lld , the llvm linker and it produces an error message at first.

> ld -r -b binary quine.c -o myself.o
ld: error: target emulation unknown: -m or at least one .o file required

The ld man page is most unhelpful, telling me -m can set an emulation, but that is the only occurrence of the word emulation in the entire page and there is nothing more to be learned. Running ld.bfd just works. However, digging into the source at llvm/tools/lld/ELF/Driver.cpp one can find a list of supported emulations, thankfully not too far from the top of the file.

And now we’re on our way.

> ld -r -b binary quine.c -o myself.o -m elf_amd64
> cc -c quine.c
> cc quine.o myself.o

Running the result and we get the expected output.

> ./a.out                                                                             
#include <stdio.h>

int
main(int argc, char **argv)
{
        extern const char _binary_quine_c_start, _binary_quine_c_end;
        const char *start = &_binary_quine_c_start;
        const char *end = &_binary_quine_c_end;

        fwrite(start, end - start, 1, stdout);
}

Tada.


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

第三次浪潮

第三次浪潮

托夫勒 / 黄明坚 / 中信出版社 / 2006-6 / 38.00元

《第三次浪潮》作者托夫勒在20多年前预见的未来是:跨国企业将盛行;电脑发明使SOHO(在家工作)成为可能;人们将摆脱朝九晚五工作的桎梏;核心家庭的瓦解;DIY(自己动手做)运动的兴起……时过境迁,如今我们才发现托夫勒的预言竟大多已成为了现实。   20年前的《第三次浪潮》在打开国门之初给人们心灵造成的冲击,其影响至今仍然连绵不绝。托夫勒在这本书中将人类社会划分为三个阶段:第一次浪潮为农业阶段......一起来看看 《第三次浪潮》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

MD5 加密
MD5 加密

MD5 加密工具