tgool
Tgool
tgool
전체 방문자
오늘
어제
  • 분류 전체보기
    • Data Science
      • AI
      • Data Mining
      • ML(Machine Learning)
    • Computer Science
      • 자료구조
      • 알고리즘
      • 시스템 프로그래밍
      • 운영체제
      • 컴퓨터 구조
      • 컴퓨터 네트워크
      • 데이터 베이스
      • 파이썬
      • 자바
      • 아두이노
    • Math
      • 통계학
      • 확률론
      • 선형대수학
      • 수리통계학
      • 회귀분석
    • TOFEL
    • Git
    • Plan
    • Book
    • Working out
      • 영양과 생활
      • 운동 정보
      • 운동 기록

인기 글

최근 글

최근 댓글

hELLO · Designed By 정상우.
tgool

Tgool

[CSAPP] 7.11 Loading and Linking Shared Libraries from Applications (응용 프로그램으로부터 공유 라이브러리를 로드하고 링크하기)
Computer Science/컴퓨터 구조

[CSAPP] 7.11 Loading and Linking Shared Libraries from Applications (응용 프로그램으로부터 공유 라이브러리를 로드하고 링크하기)

2023. 2. 17. 16:25

7.11 Loading and Linking Shared Libraries from Applications (응용 프로그램으로부터 공유 라이브러리를 로드하고 링크하기)

  • 지금까지는 응용 프로그램이 로드될 때 , 실행 직전에 dynamic linker가 공유 라이브러리를 load하고 link하는 과정에 대해 설명했다.
  • 그러나 compile-time에 해당 라이브러리에 대해 응용 프로그램을 링크할 필요 없이. 응용 프로그램이 실행되는 동안 Dynamic linker에 임의 공유 라이브러리를 load하고 link하도록 요청할 수 있다. 이에 대한 세 가지 예시는 아래와 같다.
    • 소프트웨어 배포(distributing software): MS 응용 프로그램 개발자는 공유 라이브러리를 자주 사용하여 소프트웨어 업데이트를 배포한다. 공유 라이브러리의 새 복사본을 생성해서 사용자가 이를 다운로드하여 원래 버전의 것을 대체하여 사용 가능하다. 다음에 응용 프로그램을 실행할 때, 자동으로 새 공유 라이브러리를 link하고 load한다.
    • 고성능(high-performance) web-sever 구축: 많은 웹 서버들은 계좌 잔액 및 배너 광고 같은 동적 콘텐츠를 생성한다. 초기 웹 서버는 fork 및 execve를 사용하여 child process를 생성하고 child process에서 CGI Progream을 실행했다. 그러나 최신 고성능 웹 서버는 dynamic link를 기반으로 하는 보다 효율적이고 정교한 접근 방식을 사용하여 dynamic 콘텐츠를 생성한다.
      • 이에 대한 기본 원리는 공유 라이브러리에서 동적 콘텐츠를 생성하는 각 기능을 패키징하는 것이다.
      • 초기 웹 서버는 웹 브라우저에서 요청이 도착하면 fork 및 execve를 사용하여 child process의 context에서 함수를 실행했다.
      • 반대로 최신 고성능 웹 서버는 웹 브라우저에서 요청이 도착하면 서버는 적절한 함수를 동적으로 load하고 link한 다음 직접 호출한다.
      • 함수는 서버의 주소 공간에 캐시된 상태로 유지되므로 간단한 함수 호출 비용으로 후속 요청을 처리할 수 있는 장점이 있다. 이는 사용량이 많은 사이트의 처리량에 상당한 영향을 끼친다.
      • 또한, 서버를 중지하지 않고 런타임에 기존 기능을 업데이트하고 새 기능을 추가할 수 있는 장점이 있다.   

Linux 시스템 인터페이스

  • 리눅스 시스템은 run-time 동안 응용 프로그램이 load 및 link를 할 수 있도록 하는 dynamic linker에 대한 simple interface를 제공한다. 

dlopen 함수

#include <dlfcn.h>
void *dlopen(const char *filename, int flag);
Returns: pointer to handle if OK, NULL on error
  • dlopen 함수는 공유 라이브러리 파일 이름을 통해 load하고 link한다.
  • filename의 external symbol은 이전에 RTLD_GLOBAL flag로 열린 라이브러리를 사용하여 resolve 한다.
  • 현재 실행 파일이 -rdynamic flag로 컴파일된 경우 해당 global symbol도 symbol resolution에 사용할 수 있다.
  • flag argument 中 RTLD_NOW: external symbol에 대한 reference를 즉시 resolve 하도록 linker에 알린다.
  • flag argument 中 RTLD_LAZY: 해당 라이브러리의 코드가 실행될 때까지 symbol resolution을 연기하도록 linker에 지시한다.
  • 둘 중 한 값을 이용하여 RLTD_GLOBAL flag로 oRed(?)될 수 있다. 

dlsym 함수

#include <dlfcn.h>
void *dlsym(void *handle, char *symbol);
Returns: pointer to symbol if OK, NULL on error
  • dlsym 함수는 이전에 열린 공유 라이브러리에 대한 handle과 symbol name을 통해 symbol이 있다면 symbol address를 return하고 그렇지 않으면 NULL을 return한다.

dlclose 함수

#include <dlfcn.h>
int dlclose (void *handle);
Returns: 0 if OK, −1 on error
  • dlclose 함수는 공유 라이브러리를 unload한다.

dlerror 함수

#include <dlfcn.h>
const char *dlerror(void);
Returns: error message if previous call to dlopen, dlsym, or dlclose failed;
NULL if previous call was OK
  • dlerror 함수는 dlopen , dlsym, dlclose를 호출한 결과 발생한 오류를 설명하는 문자열을 반환한다. 오류가 발생하지 않은 경우 NULL를 반환. 

Interface(인터페이스) 사용 예시

  • 위 그림은 인터페이스를 사용하여 run-time에 libvector.so 공유 라이브러리를 동적으로 link한 다음에 addvec routine을 호출하는 방법이다.
  • 프로그램을 컴파일하기 위해 다음과 같은 방법으로 gcc를 호출한다. (현재 실행 파일이 -rdynamic flag로 컴파일된 경우 해당 global symbol도 symbol resolution에 사용할 수 있다.)
    • linux> gcc -rdynamic -o prog2r dll.c -ldl
  •  위 코드에서 dlopen: addvec()함수를 포함하는 공유 라이브러리를 동적으로 load한다. filename은 "libvector.so", flag는 RTLD_LAZY, handle 값을 return 한다.
  • dlsym: load한 symbol(addvec()함수)의 주소값을 return 한다. 인자는 handle 값과 원하는 symbol이다(여기서는 symbol이 함수) 
  • 이후 addvec() 함수를 호출하여 사용 가능하다. 
  • dlclose: 공유된 라이브러리를 unload한다. 

'Computer Science > 컴퓨터 구조' 카테고리의 다른 글

[CSAPP] 7.6 Symbol Resolutions(심볼 해석)  (0) 2023.02.21
[CSAPP] 7.12 Position-Independent Code (PIC)(위치 독립성 코드)  (0) 2023.02.17
[CSAPP] 7.10 Dynamic Linking with Shared Libraries(공유 라이브러리 동적 링크)  (0) 2023.02.17
[CSAPP] 7.5 Symbols and Symbol Tables(심볼과 심볼테이블)  (0) 2023.02.15
[CSAPP] 7.4 Relocatable Object Files(재배치 가능 목적 파일)  (0) 2023.02.15
    'Computer Science/컴퓨터 구조' 카테고리의 다른 글
    • [CSAPP] 7.6 Symbol Resolutions(심볼 해석)
    • [CSAPP] 7.12 Position-Independent Code (PIC)(위치 독립성 코드)
    • [CSAPP] 7.10 Dynamic Linking with Shared Libraries(공유 라이브러리 동적 링크)
    • [CSAPP] 7.5 Symbols and Symbol Tables(심볼과 심볼테이블)
    tgool
    tgool

    티스토리툴바