C++ でごく簡単なShared Object形式のライブラリを書く

プログラムを解読していると、トレース用のファイルへ吐き出す関数が欲しくなるということで、作成。

/usr/include/mylib.h

#include <iostream>
#include <fstream>
#include <string>

void mylog(const std::string& msg);

./mylib.c

#include <mylib.h>

void mylog(const std::string& msg) {
   std::ofstream out_file("/tmp/mylog.log",std::iso::out|std::ios::app);
   if (out_file.fail())
      return;
   out_file << msg << std::endl;
}

#g++ -fPIC -shared mylib.c -o /usr/lib/libmylib.so

-fPIC Position Independent Code 関数はアドレスう空間のどこでも実行可能という意味。Shared Objectは動的にメモリ空間へロードされるので、どんなアドレスでも実行できることが必要。

作成するライブラリには必ずlib接頭文字が付いていないとリンクできません。

これにてShared Objectによるライブラリ作成完了。


./test.c

#include <mylib.h>

int main(void){
  mylog("test")
}

#g++ text.c -o test -lmylib

-lオプションで指定するライブラリ名はlib+ライブラリ名.soというオブジェクトファイルをさしている。

#./text

#cat /tmp/mylog.log
test

以上。忘備録。