OSXのdylibを作ってみる

OSXで共有ライブラリを触ったことがなかったので、試しにdylibを作ってみました。Linuxだと.soですがOSXだと.dylibのようですね。フォーマットの差異については調べていません。Appleの「Dynamic Library Programming」というドキュメントのさわりだけ参考にしました。

まずdylib側のコードです。ただのHelloWorldですね。

/**
 * hello.c
 */
#include <stdio.h>

void hello_dylib() {
    printf("hello dylib world!\n");
}

これをdylibにコンパイルします。-dynamiclibオプションを指定すると直接dylibを生成できます。簡単ですね。一応otoolでできたdylibを確認するとfiletypeがDYLIBになっています。

$ gcc -dynamiclib hello.c -o libhello.dylib 
$ ls
hello.c libhello.dylib
$ otool -vh libhello.dylib 
libhello.dylib:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00       DYLIB     9       1128   NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS

できたdylibを実際に使ってみます。dlopen, dlsymでdylibをロード、関数ポインタを取得して実行しているだけです。

/**
 * main.c
 */
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

typedef void (*func)();

int main() {
    void* module = dlopen("libhello.dylib", RTLD_LAZY);
    if (!module) {
	exit(EXIT_FAILURE);
    }
    
    func f = dlsym(module, "hello_dylib");
    if (dlerror()) {
	goto ERR;
    }

    printf("hello_dylib loaded \n");
    f();    // 実行

    dlclose(module);
    return 0;

  ERR:    
    dlclose(module);
    exit(EXIT_FAILURE);
}

ビルドして実行します。

$ gcc main.c
$ ./a.out
hello_dylib loaded
hello dylib world!

上記ドキュメントを眺めると、きちんと使うには色々課題があるようですが、とりあえず雰囲気だけはつかめたので良しとします。

Leave a Reply

Your email address will not be published. Required fields are marked *