ふるお〜と!- FullAuto

AI・ロボットが普及しBI(ベーシックインカム)が早急に実現されることを願う元ニートのブログ

ふるお〜と!-FullAuto

Q.どうやってLinuxでXMLファイルなどのリソースを実行ファイルにまとめる?

Q.WindowsXMLファイルなどのリソースをまとめるには

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