강좌 & 팁
글 수 2,412
2011.03.26 16:49:43 (*.138.143.120)
56912
strip 이용하기
strip은 오브젝트 파일에 있는 심볼을 삭제하는 툴이다.
일반적으로 빌드 완료한 실행파일 또는 라이브러리에서 불필요한 심볼을 제거하는데 사용한다.
사용법
SYNOPSIS
strip [-F bfdname |--target=bfdname]
[-I bfdname |--input-target=bfdname]
[-O bfdname |--output-target=bfdname]
[-s|--strip-all]
[-S|-g|-d|--strip-debug]
[-K symbolname |--keep-symbol=symbolname]
[-N symbolname |--strip-symbol=symbolname]
[-w|--wildcard]
[-x|--discard-all] [-X |--discard-locals]
[-R sectionname |--remove-section=sectionname]
[-o file] [-p|--preserve-dates]
[--keep-file-symbols]
[--only-keep-debug]
[-v |--verbose] [-V|--version]
[--help] [--info]
objfile...
굉장히 욥션이 많지만... 실제 사용에서는 굉장히 간단하다.
root@boggle70-desktop:tmp# ls -la a.out
-rwxr-xr-x 1 root root 9069 2011-03-18 19:07 a.out
root@boggle70-desktop:tmp# file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
strip을 실행하고 확인해 보자.
root@boggle70-desktop:tmp# strip a.out
root@boggle70-desktop:tmp# ls -la a.out
-rwxr-xr-x 1 root root 5532 2011-03-26 16:56 a.out
root@boggle70-desktop:tmp# file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped
파일 사이즈는 6096 -> 5532 byte 로 줄어들었고 파일의 정보에는 not stripped 라고 나오던것이
stripped 되었다고 나오게 된다.
심볼 정보는 어떻게 되었을까?
root@boggle70-desktop:tmp# nm a.out
08049f20 d _DYNAMIC
08049ff4 d _GLOBAL_OFFSET_TABLE_
0804881c R _IO_stdin_used
w _Jv_RegisterClasses
08049f10 d __CTOR_END__
08049f0c d __CTOR_LIST__
08049f18 D __DTOR_END__
08049f14 d __DTOR_LIST__
08048848 r __FRAME_END__
08049f1c d __JCR_END__
08049f1c d __JCR_LIST__
0804a014 A __bss_start
0804a00c D __data_start
080487d0 t __do_global_ctors_aux
08048360 t __do_global_dtors_aux
0804a010 D __dso_handle
w __gmon_start__
080487ca T __i686.get_pc_thunk.bx
08049f0c d __init_array_end
08049f0c d __init_array_start
08048760 T __libc_csu_fini
08048770 T __libc_csu_init
U __libc_start_main@@GLIBC_2.0
0804a014 A _edata
0804a01c A _end
080487fc T _fini
08048818 R _fp_hw
080482bc T _init
08048330 T _start
0804a014 b completed.6990
0804a00c W data_start
0804a018 b dtor_idx.6992
080483c0 t frame_dummy
0804853f t get_access_minimum
080484ae t get_block_size
08048456 t get_cache_support
080483fb t get_cell_type
080483ee t get_device_code
0804864d t get_device_size
080483e4 t get_maker_code
08048409 t get_multi_npage
08048464 t get_page_size
0804857f t get_plane_number
080485cc t get_plane_size
080484fb t get_redundant_size
08048683 T main
U printf@@GLIBC_2.0
이것이 원래 파일의 심볼정보들입니다.
하지만 strip 을 시키고 나면 아래와 같이 나옵니다.
root@boggle70-desktop:tmp# nm a.out
nm: a.out: no symbols
이제 strip 을 사용할때 사용하는 옵션중에 -d 옵션을 보겠습니다.
root@boggle70-desktop:tmp# strip -d a.out
root@boggle70-desktop:tmp# ls -la a.out
-rwxr-xr-x 1 root root 7492 2011-03-26 17:02 a.out
파일의 크기가 옵션없이 실행하는 것보다 약간 큽니다.
-d 옵션은 디버그용 정보만을 제거하는 옵션입니다.
때문에 nm 으로 출력시 동일한 실볼을 찾을 수는 있지만 파일명이나 행번호는 찾을수 없습니다.
따라서 addr2line 과 같은 것을 사용할수 없고 디버깅시에도 심볼네임만 볼수 있을뿐입니다.
-R 옵션은 지정된 섹션을 제거하는 옵션입니다.
만약 strip -R .text a.out 을 실행한다면... 그 프로그램은 실행하수 없습니다.
.text 는 code 영역이기 때문에 실행할 코드를 모두 제거하게 되기 때문입니다.
또 라이브러리 파일에 이것을 사용하면 다른 오브젝트와 링크가 불가능합니다.
링커는 심볼에 의존해서 오브젝트를 링크해주기 때문입니다.
strip 은 역시 BFD라이브러리를 이용해 제작된 툴입니다.
GNU binutils 의 소스코드는 objcopy 와 동일한 코드로 이루어져 있고
objcopy 명령에 -strip 을 사용하면 strip 과 같은 기능을 수행하게 됩니다.
출처 : Binary Hacks - O'REILLY