[질문] 동적링킹라이브러리에 관해 질문합니다...?
글쓴이: 초코리 / 작성시간: 월, 2004/07/19 - 8:35오후
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에 있는 함수는 알수 있지 않을까 생각도 해보는데요..
왜 이렇게 써야만 하는지 아시는분 답변 부탁드립니다...
Forums:
예전에.. 공부할때.. 특별한 어려움 없이 썼었던것으로 기억하는데..
예전에.. 공부할때.. 특별한 어려움 없이 썼었던것으로 기억하는데..
혹시.. LD_LIBRARY_PATH에.. 공유라이브러리 경로를 넣어 주셨나요?
^^;;
도움되셨길...
아 컴파일이나 파일 생성할때 문제는 아닌거 같습니다.파일
아
컴파일이나 파일 생성할때 문제는 아닌거 같습니다.
파일 생성하고 컴파일하고 링킹하는데는 문제가 없습니다.
.so파일에서 main에 있는 함수를 호출할때 발생하는
문제에 대해 질문드리는것입니다.
실행 파일을 만들때 -Wl,-E 라는 옵션을 추가해 주시면 될겁니다.
실행 파일을 만들때 -Wl,-E 라는 옵션을 추가해 주시면 될겁니다.
기본으로 실행파일은 symbol name lookup시 필요한 table
을 생성하질않습니다. 위 옵션은 강제로 so와 동일하게
실행파일도 그러한 table을 생성하도록 만듭니다.
아.. 지금 찾아봤더니 (http://wiki.kldp.org/wiki.
아.. 지금 찾아봤더니 (http://wiki.kldp.org/wiki.php/DocbookSgml/Program-Library-HOWTO)
실행파일 만들때 -rdynamic 옵션을 추가하니 되네요..
아 답변 감사합니다..지금 테스트 해보니 잘되네요..Mak
아 답변 감사합니다..
지금 테스트 해보니 잘되네요..
Makefile은 다음과 같이 만들었습니다.
실행은 다음과 같이했습니다.
LD_LIBRARY_PATH="." ./shared
gcc옵션에 -Wl,-E 를 넣으면 Lookup Table을 만들고
함수를 찼을때 그 테이블을 찼아 처리하는 방식으로 하는것이군요.
답변 감사합니다.
^^
그리고 죄송합니다만..
위와같은 내용에 대한 문서는 어떤 문서를 보면 알수 있는지
답변 부탁드립니다..
위키를 보니 이런내용이 있었네요..이 문서를 보긴 봤는데.. 영어
위키를 보니 이런내용이 있었네요..
이 문서를 보긴 봤는데.. 영어라서 빼먹고 넘어 간것 같네요 ㅡㅗㅡ::
여튼 다른 좋은 문서는 더 없나요?
답변은 아니고, LD_LIBRARY_PATH=. 를 매번 지정하기
답변은 아니고,
LD_LIBRARY_PATH=. 를 매번 지정하기 귀찮으실 땐,
gcc -Wl,-E -o shared -Wl,-rpath,. shared.o -ldl
이렇게 바이너리 생성할 때 힌트로 넣어주면 됩니다.
---
http://coolengineer.com
답변 주신분들 답변 감사합니다.gcc쪽을 좀더 봐야 겠네요..
답변 주신분들 답변 감사합니다.
gcc쪽을 좀더 봐야 겠네요..
답변 감사하고요.. 좋은 하루되세요..
댓글 달기