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

ダイナミックリンクと共有オブジェクトファイル(.so)

c

実行までの流れ

  1. プログラムをコンパイルしてオブジェクトファイルを生成
  2. オブジェクトファイルをリンカで結びつけて実行ファイルを生成

共有オブジェクトファイルは、実行時に動的にリンクされる。

やってみる

足し算をするだけのライブラリをつくってみる。

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してないが、リンクしているのが確認できた。