読者です 読者をやめる 読者になる 読者になる

non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

Node.jsのネイティブモジュールでも使われているdlopen時に関数を実行する指定方法

はじめに

この記事は、@kjunichiの2015年パーソナルアドベントカレンダーの14日目の記事です。

gcc拡張機能らしいがClangでもサポートされている

dloepn時にclang/gccでは

__attribute__((constructor))

を指定した関数を実行する。

共有ライブラリ側のコード

#include <stdio.h>

__attribute__((constructor)) static void myinit() {
        printf("I'm initializing..\n");
}

int myProc() {
        printf("main proc.\n");
}

ライブラリ呼び出し側

#include <dlfcn.h>
#include <stdio.h>

int main(int argc,char** argv) {
    printf("start main\n");
    dlopen("./mylib.dylib", RTLD_NOW);
    return 0;
}

実行結果

./a.out 
start main
I'm initializing..

まとめ

実はこの仕組みをNode.jsが使っている。 Windowsは似たような指定が同様に出来、Windows版のNode.jsでもそれを使っている。