ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리눅스 so 라이브러리의 개념과 생성 방법
    리눅스 2019. 2. 7. 10:22

    Windows에는 dll(dynamic link library) 이라는 개념으로 동적 링크 라이브러리가 존재한다.

    하지만 리눅스에는 dll이 존재하지 않는다. 그 대신 so 라는 개념이 있다.

    so에 대해 알아보기 전에 동적 라이브러리가 뭔지에 대해 먼저 알아보자.

     

    우리는 프로그램을 개발할 때 여러 library를 가져다 쓰곤 한다. 동적 라이브러리정적 라이브러리의 차이점은 library를 로드하는 방법에서 나타난다.

    동적 라이브러리는 프로그램 실행 중에 특정 library를 사용하고 싶을 때 로드하고, 정적 라이브러리는 프로그램에 library를 포함시켜 프로그램 시작 부터 library를 로드하게 된다. 물론 장단점이 있다.

     

       동적 라이브러리  정적 라이브러리
     장점  실행파일의 크기를 줄일 수 있다  실행 시간을 줄일 수 있다
     단점   실행 시간이 더 소요될 수 있다  실행파일의 크기가 커진다

     

    이 말고도 다른 장단점이 더 있으니 나머지는 따로 검색해보기 바란다.

     

    그럼 이제 so 파일을 만드는 방법에 대해 알아보자.

    terminal을 열고 아래와 같은 명령어를 입력하면 된다.

    (name 부분에 자신이 라이브러리로 만들고 싶은 C 코드의 이름을 넣고 name2 부분에 만들 라이브러리의 이름을 넣으면 된다)

     

    gcc name.c -fPIC -shared -o name2.so

     

    코드에 별 문제가 없다면 아마 잘 실행되었을 것이다.

    so 파일을 생성했으니 so 파일을 부르는 방법도 알아야 할 것이다. 의외로 간단하다.

    void *handle = dlopen("./lib.so", RTLD_LAZY); // 내가 로드할 so파일의 이름을 첫 번째 인자로 준다 if(!handle){ // 로드에 실패했을 경우 printf("%s\n", dlerror()); // 에러메시지를 찍는다 printf("dlopen Error\n"); exit(1); }

    이렇게 하면 so 파일이 프로그램에 로드된다.

     

    그럼 이제 so 파일 내부의 함수를 호출하는 방법에 대해서 알아보자.

    함수 자료형 (*부를 함수이름)(인자 자료형) = (함수 자료형 (*)(인자 자료형))dlsym(앞에서 로드한 핸들, "부를 함수이름"); // 함수 선언 (*부를 함수이름)(인자 자료형); // 함수 실행

    요렇게 하면 된다. 이해가 어려울 수도 있으니 예를 들어서 만약 아래와 같은 함수가 so파일에 있으면

    int Function1(char var){ return 0; }

    아래의 코드처럼 호출하면 된다.

    int (*Function1)(char) = (int (*)(char))dlsym(handle, "Function1"); // 함수 선언 int rtn = (*Function1)("Hello!"); // 함수 실행

    오랜만에 블로그에 글을 쓴 것 같아서 뿌듯하다. 헤헤헤 더 자주 써야겠다.

    댓글

Designed by Tistory.