2011. 7. 4. 00:30

♧ strip은 오브젝트 파일에 있는 심볼을 삭제하는 툴.

일반적으로 빌드 완료한 실행파일 또는 라이브러리에서 불필요한 심볼을 제거하는데 사용.

   

[ strip 사용법 ]

strip 사용법은 간단하다.

기본적으로는 심볼을 제거하려는 오브젝트 파일을 인수로 지정하면 된다.

test라는 실행 파일에서 심볼을 제거하려는 경우 다음과 같이 실행.

   

▷ test.c 작성.

#include <stdio.h>

void test() { }

int main() {

return 0;

}

   

▷ gcc로 컴파일 하면 완성된 test에 심볼 정보가 포함된다.

이때 test는 8,327바이트 크기로 생성되었다.

   

▶ strip을 사용하여 심볼 제거.

심볼을 제거한 후 5,492바이트가 되었다.

C 소스코드를 보면 거의 비어 있는 프로그램인데 약 3,000바이트 정보가 줄었다.

이유는, 사실 test의 대부분이 /usr/lib/crt*.o라는 오브젝트 파일로 채워져 있기 때문.

   

-d옵션 :: 디버그용 정보(파일명 또는 행 번호 등)만을 제거하고

함수명 등의 일반 심볼은 남게 된다.

% gcc -g test.c -o test

% objdump -h test

...(중략)...

▷ strip -d로 삭제후 확인

   

▶ -R 옵션 :: 지정된 섹션을 제거하는 옵션.

stript -R .text program을 실행하면 프로그램의 텍스트 섹션(코드 부분)이

모두 제거되어 전혀 작동하지 않게 된다. 또한 .o 또는 .a 파일에 strip 명령을 실행하면

사실상 다른 오브젝트 파일과 링크를 할 수 없게 된다.

이는 링커가 심볼에 의존하기 때문이다.

그러므로 .o.a 파일에서 심볼을 제거하지 않도록 한다.

   

▷ 한편, 완성 제품으로 판매한 버전의 바이너리는 strip하고

개발자는 디버그 정보가 포함된 바이너리를 남겨 둔다면,

사용자 환경에서 생성된 코어 파일을 개발 환경에서 디버깅할 수 있게 된다.

   

   

[ strip 구조 ]

strip은 BSD 라이브러리를 이용해 제작된 툴로, BFD API를 이용해서 오브젝트 파일을 조작.

GNU Binutils의 소스코드를 보면 objcopy와 동일한 코드로 이루어져 있음을 알 수 있다.

실제로 objcopy 명령에 -strip-*옵션을 사용하면 strip과 같은 기능을 수행한다.

   

   

[ 정리 ]

디스크 용량이 풍부한 PC에서는 실행 파일의 크기를 줄일 수 있다는 장점을 느끼기 어렵지만,

사용할 수 있는 디스크나 메모리 용량이 제한적인 시스템 환경에서 프로그램을 설치할 경우

또는 프로그램을 네트워크로 전송해서 실행해야 할 경우에는 상당히 유용한 툴.

Posted by devanix