unix/unix 실습

9월 10일 공유라이브러리와 jmp함수

송시혁 2013. 9. 10. 10:52


공유 라이브러리.


기존의 같은 함수를 다른 함수들이 그것을 공통적으로 사용할 경우 필요할 때만 받아서

사용하는 방법이다.


장점- 용량을 줄일 수 있다. (아래그림은 참고), 모든 프로그램을 다시 링크하지 않아도 

         라이브러리를 새 버전으로 대체 가능.


단점- 어떤 라이브러리가 갱신되거나, 처음 실행될때 버전이 맞지 않거나 공유 라이브러리 

         함수가 처음 호출될 때 실행파일이 생성되지 않을 때가 있다.(예 xp에서 도스게임이 잘 돌아가지 않는 경우)


DLL=DYNAMIC(동적인) LIBRARY(라이브러리) LINK(링크) 

 




다음은 공유라이브러리를 실행해서 컴파일 할 때와 안 할 때의 차이를 나타낸다.





1.    제일 위에 빨간색은 공유라이브러리를 사용한것.

2.    두번 째 빨간네모는 공유라이브러리를 사용하지 않았다.

       (gcc -static -o 실행파일 실행파일 소스)

3.    노란색 네모는 메모리 영역별로 소스의 용량크기를 나타낸다. 참고로 text는 stack영역.

 


다음 예제는 setjmp()함수와 longjmp()함수 소스



1.    setjmp인자는 jmp_buf형 위에서는 전역변수로 버퍼를 선언하여 인자를 넣었다.

       setjmp함수는 직접호출되면 0을 반환하므로, 실행되지 않는다.


그래서 else문에 void 형 함수 one을 호출

2.    one()함수안에 two()함수를 호출하고 실행한다. 그런데 longjmp()함수를 만난다.

      longjmp()로 인하여 main()함수로 점프한다. 그러니까 아래 printf("two end\n");를

 실행되지 않는다.

3. longjmp함수에 두번째 인자가 1이므로 setjmp함수로 가서 if문이 성립되어 아래 코드를 실행한 뒤

종료된다.


실행결과