ダイナミックリンクと共有オブジェクトファイル(.so)
実行までの流れ
- プログラムをコンパイルしてオブジェクトファイルを生成
- オブジェクトファイルをリンカで結びつけて実行ファイルを生成
共有オブジェクトファイルは、実行時に動的にリンクされる。
やってみる
足し算をするだけのライブラリをつくってみる。
shared.c
int add(int a, int b); int add(int a, int b) { return a + b; }
$ gcc -fpic -c shared.c $ gcc -shared -o libadd.so shared.o
これでlibadd.soが完成。
main.c
#include <stdlib.h> #include <stdio.h> #include <dlfcn.h> int main(int argc, char* argv[]) { void* handle; int (*add)(int, int); char* error; handle = dlopen("libadd.so", RTLD_LAZY); if ( !handle ) { fprintf(stderr, "%s\n", dlerror()); exit(EXIT_FAILURE); } add = dlsym(handle,"add"); if ((error=dlerror()) != NULL) { fprintf(stderr, "%s\n", error); exit(EXIT_FAILURE); } printf("%d + %d = %d\n", 1, 2, add(1,2)); dlclose(handle); exit(EXIT_SUCCESS); }
$ gcc -o main main.c && ./main 1 + 2 = 3
includeしてないが、リンクしているのが確認できた。