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

