♧ 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에서는 실행 파일의 크기를 줄일 수 있다는 장점을 느끼기 어렵지만,
사용할 수 있는 디스크나 메모리 용량이 제한적인 시스템 환경에서 프로그램을 설치할 경우
또는 프로그램을 네트워크로 전송해서 실행해야 할 경우에는 상당히 유용한 툴.
'컴퓨터 서적 정리 > Binary Hacks' 카테고리의 다른 글
[Hack #18] C와 C++ 프로그램 링크 방법 (0) | 2011.07.04 |
---|---|
[Hack #17] ar - 정적 라이브러리 다루기 (0) | 2011.07.04 |
[Hack #15] addr2line - 주소에서 파일명과 행 번호 얻기 (0) | 2011.07.03 |
[Hack #14] c++filt - C++ 심볼 demangle (0) | 2011.07.03 |
[Hack #13] strings - 바이너리 파일에서 문자열 추출 (0) | 2011.07.03 |