아카이브 병합시 특정 오브젝트만 병합할수도 있나요?
글쓴이: sunyzero / 작성시간: 목, 2003/08/14 - 5:54오후
얼마전 프로그래밍을 하던 도중 중간에 아카이브 병합을 하는데 아래와 같이 메시지가 나오더군요. 그런데 메시지 중에 아래처럼 나오는데 제가 만든 라이브러리 (임의로 mylib1, 2로 칭했습니다)는 그냥 병합되는데, libpthread.a 같은 경우는 뒤에 [shr_comm.o] 처럼 특정 오브젝트만 병합되는거 같더군요. 혹시 제 착각일지도 모르겟지만...
이렇게 되는 이유나 혹은 이렇게 병합될 수 있도록 오브젝트를 특별히 만드는 옵션이 있는지요? 혹시 아시는분은 댓글 달아주세요. 아 참고로 플랫폼은 AIX였습니다. (아래 gcc 위치에서도 쉽게 알수 있죠?)
(ld): i /usr/local/lib/gcc-lib/powerpc-ibm-aix4.3.2.0/2.95.3/libgcc.a (ld): lib /usr/lib/libc.a LIBRARY: Shared object libpthread.a[shr_comm.o]: 109 symbols imported. LIBRARY: Shared object libpthread.a[shr_xpg5.o]: 123 symbols imported. LIBRARY: Shared object libdl.a[shr.o]: 4 symbols imported. LIBRARY: Shared object libmylib1.a: 70 symbols imported. LIBRARY: Shared object libmylib2.a: 358 symbols imported. LIBRARY: Shared object libc.a[shr.o]: 2268 symbols imported. LIBRARY: Shared object libc.a[meth.o]: 2 symbols imported. LIBRARY: Shared object libc.a[aio.o]: 11 symbols imported. LIBRARY: Shared object libc.a[pse.o]: 78 symbols imported. LIBRARY: Shared object libc.a[dl.o]: 4 symbols imported. LIBRARY: Shared object libc.a[pty.o]: 1 symbols imported. FILELIST: Number of previously inserted files processed: 28
Forums:
$ man ar <어떠한 역경에도 굴하지 않는 '하양 지훈'
$ man ar
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
무슨 말인지???
ar을 만드는 옵션은 다 봤지만, 뚜렷하게 언급된 옵션은 없었는데?
잘못봤나? 기본적으로 rv 로 병합하거나 한번에 cruv 로 한방에 만들든지 하는데... 이런경우에는 컴파일러가 링킹시에 모든 심볼을 다 import 해버리기 되는데, 위의 처럼 특정개체만 import 하는 경우를 말한 것이었습니다.
윗분이 무슨 의도로 쓰신 글인지 모르겠군요.
========================================
* The truth will set you free.
i option 보세요...-_-ㅋ그리고 제대로 읽어 보신겁니까?
i option 보세요...-_-ㅋ
그리고 제대로 읽어 보신겁니까?
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
ar 의 i 옵션하고는 상관없습니다.
전혀 기대하지 않았지만 다시 댓글이 있어서 댓글을 달아놓습니다. 나중에 저와 같은 문제로 고민하시는 분이 있다면 이 글을 읽고 조금은 도움이 되길 바랍니다.
i 옵션은 r 병합을 할때 어떤 오브젝트의 앞에 위치할것인지를 결정하는 옵션입니다. 따라서 libxxxx.a 에 a.o b.o c.o 가 있고 내가 새로 병합하는 오브젝트가 d.o 를 b.o 앞(즉 a.o 뒤)에 위치하고 싶을때
ar -ri b.o libxxxx.a d.o
식으로 명령을 내려서 병합합니다. 위의 아카이브를 링커가 호출하여 링킹작업을 하는 경우와는 아무런 상관이 없는 옵션입니다. 이런식의 옵션으로 몇개가 더 있긴 하죠.
아무래도 제가 윗 질문을 약간 애매모호하게 한 것 같군요. 결론은 찾았고, AIX에서는 몇몇 아카이브라고 표기된 것들이 실제로는 shared object 로 인식되는 것이었고, 그 안에서 심볼만 import 시켜주는 것이 발생할때 위와 같이 메시지가 나오는 것이었습니다. 이상하게도 libxxxx.a 처럼 .a 로 되어있고, file 속성도 아카이브인데 실제 링킹시에는 shared object 로 되더군요.
PS) 원 질문을 헷갈리게 해서 죄송하군요.
========================================
* The truth will set you free.
댓글 달기