[질문] 동적링킹라이브러리에 관해 질문합니다...?

초코리의 이미지

DLL을 가지고 프로그래밍을 하고 있습니다.

매번 정적으로 물고 들어가 프로그래밍을 하다가

.so파일을 만들어 하려니 조금 어렵네요..

일단 다음과 같은 main파일이 있습니다.

#include <stdio.h>
#include <dlfcn.h>
                                                                          
typedef int (*SUB)(int a,int b);
                                                                          
int realSum(int parm1, int parm2){
        return (parm1 + parm2);
}
                                                                          
int main(void){
                                                                          
        int aValue=0;
        SUB     sum;
        void*   handle;
        char    *error;
                                                                          
        handle = dlopen("libsum.so",RTLD_LAZY);
                                                                          
        if(!handle ){
                fputs(dlerror(),stderr);
                exit(1);
        }
                                                                          
                                                                          
        dlerror();//에러값제거
                                                                          
        sum  = dlsym(handle,"cusSum");
                                                                          
                                                                          
                                                                          
        if((error = dlerror())!=NULL){
                fputs(error,stderr);
                exit(1);
        }
                                                                          
        fprintf (stdout,"SUM:%d\n",(*sum)(15,10));
                                                                          
        dlclose(handle);
                                                                          
        return 0;
}

위파일에서 cusSum을 불러서 파일 주소를 얻어와 함수를 호출합니다.

shared library파일은 다음과 같습니다.

#include <stdio.h>
int realSum(int parm1,int parm2);
       
int cusSum(int a,int b){
        return  realSum(a,b);
}

위 공유파일에서 보면 realSum이라고 main쪽에서 선언된 함수를 호출하는

부분이 있습니다.

그냥 제 생각에는 main에서 가져와 바로 컴파일을 하면 정상작동 할줄 알았는데

undefined Symbol이라고 에러가 나오네요..

그래서 다음과 같이 코드를 바꿨습니다.

#include <stdio.h>
                                                                          
typedef int (*REALSum)(int parm1,int parm2);
                                                                          
int cusSum(int a,int b){
      REALSum cusSUM;
      cusSUM = 0x0804851c;//nm main파일을해서 얻은 주소값을 넣어줌
           
        return  cusSUM(a,b);
}

바꾼코드는 main파일에서 선언한 함수를 nm으로 주소를 얻어와

.so파일에서 사용하여 호출 하는 방식으로 바꿔서 사용했습니다.

실행하는 시점에서

DLL파일을 Load했을때 함수의 주소를 모르기 때문에 생기는것 인가 보다

하고 약간 이해를 하고 있는데요.

어떻게 보면 main에서 DLL을 Open했기때문에 main에 있는 함수는 알수 있지 않을까 생각도 해보는데요..

왜 이렇게 써야만 하는지 아시는분 답변 부탁드립니다...

faye의 이미지

예전에.. 공부할때.. 특별한 어려움 없이 썼었던것으로 기억하는데..

혹시.. LD_LIBRARY_PATH에.. 공유라이브러리 경로를 넣어 주셨나요?

^^;;

도움되셨길...

초코리의 이미지

컴파일이나 파일 생성할때 문제는 아닌거 같습니다.

파일 생성하고 컴파일하고 링킹하는데는 문제가 없습니다.

.so파일에서 main에 있는 함수를 호출할때 발생하는

문제에 대해 질문드리는것입니다.

hwang의 이미지

실행 파일을 만들때 -Wl,-E 라는 옵션을 추가해 주시면 될겁니다.
기본으로 실행파일은 symbol name lookup시 필요한 table
을 생성하질않습니다. 위 옵션은 강제로 so와 동일하게
실행파일도 그러한 table을 생성하도록 만듭니다.

faye의 이미지

아.. 지금 찾아봤더니 (http://wiki.kldp.org/wiki.php/DocbookSgml/Program-Library-HOWTO)

실행파일 만들때 -rdynamic 옵션을 추가하니 되네요..

초코리의 이미지

아 답변 감사합니다..

지금 테스트 해보니 잘되네요..

Makefile은 다음과 같이 만들었습니다.

CC = gcc
all: shared.o libsum.o
        gcc -fPIC -c libsum.c
        gcc -shared -o libsum.so libsum.o
        gcc -Wl,-E -o shared shared.o -ldl
clean :
        rm -rf libsum.o libsum.so shared shared.o

실행은 다음과 같이했습니다.
LD_LIBRARY_PATH="." ./shared

gcc옵션에 -Wl,-E 를 넣으면 Lookup Table을 만들고

함수를 찼을때 그 테이블을 찼아 처리하는 방식으로 하는것이군요.

답변 감사합니다.

^^

그리고 죄송합니다만..

위와같은 내용에 대한 문서는 어떤 문서를 보면 알수 있는지

답변 부탁드립니다..

초코리의 이미지

위키를 보니 이런내용이 있었네요..

이 문서를 보긴 봤는데.. 영어라서 빼먹고 넘어 간것 같네요 ㅡㅗㅡ::

여튼 다른 좋은 문서는 더 없나요?

Quote:
몇몇의 경우에서, 오브젝트 파일을 만들기위해 gcc를 호출하는 것은 ``-Wl,-export-dynamic'' 옵션을 포함할 것이다. 보통 동적 심볼테이블은 동적 오브젝트에 의해 사용되는 심볼만 포함한다. 이 옵션은(ELF파일을 만들때) 동적 심볼테이블에 모든 심볼을 추가한다(더 많은 정보를 위해 ld(1)를 참고하라). '역 의존성'이 있을때 이 옵션을 필요로 할 것이다. 즉, DL라이브러리가 라이브러리를 로드하는데 프로그램에서 필요한 심볼이지만, 관례에 의해 정의되지 않은 심볼을 필요할 경우 사용된다. ``역 의존성''이 작동하기 위해서, 주 프로그램은 심볼이 동적으로 동작하게 해야 한다. 리눅스 시스템에서만 사용한다면, ``-Wl,export-dynamic''대신에 ``-rdynamic''을 사용할수도 있을 것이다. 하지만, ELF문서에 따르면 ``-rdynamic''플래그는 리눅스가 아닌 시스템의 gcc에서 항상 작동하는 것은 아니다.
pynoos의 이미지

답변은 아니고,

LD_LIBRARY_PATH=. 를 매번 지정하기 귀찮으실 땐,

gcc -Wl,-E -o shared -Wl,-rpath,. shared.o -ldl

이렇게 바이너리 생성할 때 힌트로 넣어주면 됩니다.

초코리의 이미지

답변 주신분들 답변 감사합니다.

gcc쪽을 좀더 봐야 겠네요..

답변 감사하고요.. 좋은 하루되세요..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.