Shammer's Philosophy

My private adversaria

動的ローディングのサンプルコード

三つのリンク方式 - Shammerismで動的ローディングのコードを書いていなかったので、それを実装。と言っても、http://www.amazon.co.jp/C言語による-スーパーLinuxプログラミング-Cライブラリの活用と実装・開発テクニック-飯尾-淳/dp/4797361204で紹介されているサンプルコードを試してみた、というだけ。

共有ライブラリ側のコード(functions.c)

#include <stdio.h>

void function01(){
    printf("Function01\n");
}

共有ライブラリをロードするmain関数(dynamic-load.c)

#include <dlfcn.h>

int main(int argc, char** argv){
    void* handle = dlopen("./myfunc.o", RTLD_LAZY);
    void (*func)(void) = dlsym(handle, "function01");
    (*func) ();
    dlclose(handle);
    return 0;
}

コンパイル

# gcc -o myfunc.so -fPIC -shared functions.c
# gcc dynamic-load.c -o dynamic-load -ldl
# ./dynamic-load
Function01
#

注意点

  • 共有ライブラリ側をコンパイルする際には、-shared と -fPIC オプションをつける必要がある。これを忘れると実行時に Segmentation fault になる
  • main 関数をコンパイルするときには、-ldl オプションが必要。これがないとundefined reference to `dlopen'エラーが出る