Q.WindowsでXMLファイルなどのリソースをまとめるには
A.Win32APIを使う
.XMLや.EXEがばらばらになっているとユーザに勝手にXMLを差し替えられてしまうかもしれないし、見た目もよろしくない。
Windowsでは便利なことに、実行ファイル内にリソースをまとめることができ、
Win32APIのFindResouce、LoadResourceでリソースのハンドルを取得することができる。
Q.Linuxでリソースをまとめるには
A.リソースをオブジェクトファイルにしてリンクをする
データを作成する。
data.txt
Hello world
objcopyコマンドでオブジェクトファイルを作成する。
$ objcopy --input binary --output elf64-x86-64 --binary-architecture i386 data.txt data.o
または
$ objcopy -Ibinary -Bi386 -Oelf64-x86-64 data.txt data.o
指定できるパラメータを確認したい場合はヘルプ
$ objcopy --help
できあがったオブジェクトファイルには以下のようなリンカーシンボルが埋め込まれている。
_binary_data_txt_start _binary_data_txt_end
これを利用して、内容を取り出すことができる。
main.c
#include <stdio.h> extern char _binary_data_txt_start; extern char _binary_data_txt_end; main() { char* p = &_binary_data_txt_start; while ( p != &_binary_data_txt_end ) putchar(*p++); }
ビルド
$ gcc main.c data.o
実行
$ ./a.out Hello world
Q.複数のファイルをまとめるにはどうすればよいか
A各々のオブジェクトファイルを作って、各々をリンクし、各々のリンカーシンボルを呼び出せばオッケー
ビルド例
$ gcc main.c data.o data1.o data2.o data3.o
参考
Embedding a File in an Executable, aka Hello World, Version 5967 | Linux Journal