반응형


dump 명령을 사용하면 실행파일이 런타임 링킹을 사용한 파일인지 아닌지 알아낼 수 있다. 

dump 명령과 -H 옵션으로 예제 프로그램 a.out에 대한 결과를 헤더정보와 함께 볼 수 있다.


어플리케이션에서는 모듈 func2.so의 심볼을 전혀 참조하지 않지만, 런타임 링킹 공유 오브젝트 func2.so가 의존 모듈 목록 (dependent module list)에 포함되어 있다. -brtl 옵션없이 실행파일을 컴파일하면, 의존 모듈 목록에 func2.so가 포함되지 않는다.


런타임 링커 (librtl.a의 아카이브 멤버 shr.o)가 의존 모듈 목록에 포함되어 있다.


$ dump -H a.out

.

.

.

***Import File Strings***

INDEX             PATH                                     BASE             MEMBER

0            /usr/lpp/xlopt:/usr/lib:/lib

1                                                             func1.so

2                                                             func2.so

3                                                             func3.so

4                                                             libc.a                 shr.o

5                                                             librtl.a                shr.o


실행파일 헤더에 기록된 런타임 링킹 공유 오브젝트의 순서는 실행파일을 만들 때 링커 명령어에서 오브젝트를 지정한 순서와 동일하다.

$ xlc main.c func1.so func2.so func3.so -brtl


dump 명령과 -Tv 옵션을 사용하면 어플리케이션이 참조한 심볼에 대한 정보를 볼 수 있다. 

위에서 가장 중요한 점은 func1.c의 func1이 호출하는 func3에 대한 진입점 (entry point)이 없다는 것이다.이전에 설명한 것처럼 모든 심볼은 프로그램을 링크할 때 해석이 되어야 하고, 해석된 심볼의 정보는 XCOFF 로더 섹션에 보여야 한다. 그러나 런타임 링킹의 경우 런타임 링커가 해석한 심볼은 XCOFF 로더 섹션에 보이지 않는다. .


$ dump -Tv a.out


[Index]        Value        Scn        IMEX            Sclass        Type                    IMPid            Name

[0]        0x20000448        .data                           RW         SECdef                 [noIMid]      __rtinit

.

.

.




공유 오브젝트 모듈 func1.so의 헤더정보를 보여주고 있다. 제일 마지막 줄의 .. 는 이 모듈 내의 해석되지 않은 심볼을 해석하려면 적어도 1개 이상의 런타임 링킹 공유 오브젝트가 필요함을 의미한다.



$ dump -H func1.so

func1.so:


***Import File Strings***

INDEX                PATH                                 BASE                                             MEMBER

0                   /usr/lib:/lib

1                                                                 .....


$ dump -Tv func1.so

의존하는 공유 오브젝트 모듈 func1.so의 로더 섹션 정보를 보여준다. 이 모듈에는 반입된 심볼 printf, func3 가 있다20. IMPid 컬럼의 .. 는 프로그램을 로드할 때 런타임 링커가 심볼을 해석하게 됨을 의미한다.


main 프로그램을 런타임 링킹 공유 오브젝트로 만들려면 다음과 같은 과정을 따른다.(볼드처리 된 부분 및 명령어 옵션은 달라질 수 있다)

$ xlc -c main.c func1.c func2.c func3.c

main.c:

func1.c:

func2.c:

func3.c:


$ ld -G -o main.so main.o -bexpall

ld: 0711-327 WARNING: Entry point not found: __start


$ ld -G -o func1.so func1.o -bnoentry -bexpall

$ ld -G -o func2.so func2.o -bnoentry -bexpall -lc

$ ld -G -o func3.so func3.o -bnoentry -bexpall -lc

$ xlc -o a.out main.so func1.so func2.so func3.so -brtl


LIBPATH를 지정하면, 프로그램은 다음과 같은 결과를 보여준다.

$ export LIBPATH=$PWD

$ ./a.out

within function func1 at line number: 7 in func1.c

within function func3 at line number: 7 in func3.c


a.out 의 참조 심볼 정보를 보고자 한다면 아래의 dump 옵션으로 확인할 수 있다.

$ dump -Tv a.out

 

어플리케이션에서 필요로 하는 모든 공유 오브젝트를 런타임 링킹 가능하도록 만드는 일은 기술적으로는 가능하지만, 어플리케이션의 성능 때문에 이렇게 하지 않는 편이 좋다. 일반적으로 AIX 아키텍쳐를 최대한 활용하려면 공유 모듈은 가능한 스스로를 포함하는 방식이어야 한다. 런타임 링킹은 반드시 필요한 때만 사용하는 편이 좋다. 다른 벤더의 UNIX 시스템에서 가져와서 포팅한 어플리케이션의 경우는 이러한 종류의 구성방식을 따르지 않기 때문에 AIX에서 구동하려면 포팅에 좀더 수고가 들게 된다. 모듈간에 인터페이스를 잘 정의해서 어플리케이션이 잘 조직된 구조로 만들어졌을 때 AIX에서 가장 좋은 성능을 발휘할 수 있다.


-brtl 링커 옵션을 써서 런타임 링크 방법으로 실행파일을 링크하면, 링커는 심볼 해석을 위해 공유 오브젝트와 라이브러리를 찾는데 이때 확장 탐색 순서 (extended search order)를 사용한다. 이러한 확장 탐색 순서를 사용하려면 런타임 링킹 공유 오브젝트는 libname.so 와 같은 방식의 이름을 가져야 한다.


-brtl 링커 옵션을 지정하면 링커는 libname.a와 libname.so를 찾게 되는데, -L 옵션으로 지정한 디렉토리와 디폴트 디렉토리(/usr/lib 와 /lib)에서 찾는다. libname.a 이름을 지정하는 것처럼 -l 옵션을 써서 libname.so 도 지정할 수 있다.


예를 들어 /project/lib 디렉토리에 저장되어 있는 런타임 링킹 공유 오브젝트 libfunc1.so와 a.out 을 링크할 때 오브젝트를 지정하기 위해 다음과 같은 방법을 사용할 수 있다. libname.so 와 같은 형식의 이름으로 하려면 런타임 링킹 공유 오브젝트의 이름을 이러한 방식으로 바꾸던가 라이브러리로 파일을 아카이브하면 된다.


1. xlc main.c /project/lib/libfunc1.so -brtl 이 방법은 런타임 링킹 방법의 이점을 약화시킨다. 프로그램을 실행할 때 /project/lib 디렉토리에 libfunc1.so이 있어야 하고, 프로그램을 로드할 때 libfunc1.so을 로드하게 된다.


2. cp /project/lib/libfunc1.so .; xlc main.c libfunc1.so -brtl 모든 런타임 링킹 공유 오브젝트가 현재 디렉토리에 있을 때 이러한 방법은 매우 유용하다. 그러나 한번 이렇게 고정된 방식으로 프로그램을 만들고 나면 특정 디렉토리에 계속 파일을 두어야 하는 불편한 점이 있으므로 세 번째 방법이 더 좋다.


3. xlc main.c -lfunc1 -L/project/lib -brtl 런타임 링킹 방법을 이용하여 파일을 생성할 때 가장 추천할 만한 방법이다. 




반응형

+ Recent posts