内容简介: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.
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
网络、群体与市场
大卫·伊斯利(David Esley)、乔恩·克莱因伯格(Jon Kleinberg) / 李晓明、王卫红、杨韫利 / 清华大学出版社 / 2011-10-1 / CNY 69.00
过去十年来,现代社会中复杂的连通性向公众展现出与日俱增的魅力。这种连通性在许多方面都有体现并发挥着强大的作用,包括互联网的快速成长、全球通信的便捷,以及新闻与信息(及传染病与金融危机)以惊人的速度与强度传播的能力。这种现象涉及网络、动机和人们的聚合行为。网络将人们的行为联系起来,使得每个人的决定可能对他人产生微妙的后果。 本书是本科生的入门教材,同时也适合希望进入相关领域的高层次读者。它从交......一起来看看 《网络、群体与市场》 这本书的介绍吧!