Strip コマンドは、必要最小限の情報を含む製品品質のオブジェクト ファイルを作成して軽量化する場合に主に使用されます。実行可能ファイルまたはオブジェクト ファイルがリバース エンジニアリングされたくない場合にも使用できます。
この記事では、いくつかの実用的な例を通じてこのコマンドの使用法を理解します。
strip コマンドの構文は次のとおりです。
strip [options] objfile...
例
例に進む前に、この記事で使用する実行可能ファイルの背後にあるコードを次に示します。
#include<stdio.h>
// Declare a static global
static int i=10;
// Declare a non static global
int global = 20;
int inc_func()
{
static int local = 0;
// return static local value
return (++local);
}
int main(void)
{
int count = inc_func();
// Print the sum
printf( "\n [%d] \n",(count + global + i));
return 0;
} Linux のリバース エンジニアリング ツールで説明した nm コマンドは、strip コマンドを使用して削除された実行可能ファイルでは使用できないことに注意してください。
1. -s オプションを使用してシンボル テーブルを削除
シンボル テーブルは、strip コマンドの -s オプションを使用して、オブジェクト ファイルから削除できます。
次の例を考えてみましょう:
$ readelf -s example
Symbol table '.dynsym' contains 4 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND printf@GLIBC_2.2.5 (2)
2: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)
Symbol table '.symtab' contains 69 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000400238 0 SECTION LOCAL DEFAULT 1
2: 0000000000400254 0 SECTION LOCAL DEFAULT 2
..
28: 000000000040046c 0 FUNC LOCAL DEFAULT 14 call_gmon_start
29: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
30: 0000000000600e18 0 OBJECT LOCAL DEFAULT 19 __CTOR_LIST__
31: 0000000000600e28 0 OBJECT LOCAL DEFAULT 20 __DTOR_LIST__
32: 0000000000600e38 0 OBJECT LOCAL DEFAULT 21 __JCR_LIST__
33: 0000000000400490 0 FUNC LOCAL DEFAULT 14 __do_global_dtors_aux
34: 0000000000601028 1 OBJECT LOCAL DEFAULT 26 completed.7382
35: 0000000000601030 8 OBJECT LOCAL DEFAULT 26 dtor_idx.7384
36: 0000000000400500 0 FUNC LOCAL DEFAULT 14 frame_dummy
37: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
38: 0000000000600e20 0 OBJECT LOCAL DEFAULT 19 __CTOR_END__
39: 0000000000400750 0 OBJECT LOCAL DEFAULT 18 __FRAME_END__
40: 0000000000600e38 0 OBJECT LOCAL DEFAULT 21 __JCR_END__
41: 0000000000400630 0 FUNC LOCAL DEFAULT 14 __do_global_ctors_aux
42: 0000000000000000 0 FILE LOCAL DEFAULT ABS example.c
43: 0000000000601020 4 OBJECT LOCAL DEFAULT 25 i
44: 0000000000601038 4 OBJECT LOCAL DEFAULT 26 local.2047
45: 0000000000600fe8 0 OBJECT LOCAL HIDDEN 24 _GLOBAL_OFFSET_TABLE_
46: 0000000000600e14 0 NOTYPE LOCAL HIDDEN 19 __init_array_end
47: 0000000000600e14 0 NOTYPE LOCAL HIDDEN 19 __init_array_start
48: 0000000000600e40 0 OBJECT LOCAL HIDDEN 22 _DYNAMIC
49: 0000000000601010 0 NOTYPE WEAK DEFAULT 25 data_start
50: 0000000000000000 0 FUNC GLOBAL DEFAULT UND printf@@GLIBC_2.2.5
51: 0000000000400590 2 FUNC GLOBAL DEFAULT 14 __libc_csu_fini
52: 0000000000400440 0 FUNC GLOBAL DEFAULT 14 _start
53: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
54: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses
55: 0000000000400668 0 FUNC GLOBAL DEFAULT 15 _fini
56: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@@GLIBC_
57: 0000000000601024 4 OBJECT GLOBAL DEFAULT 25 global
58: 0000000000400678 4 OBJECT GLOBAL DEFAULT 16 _IO_stdin_used
59: 0000000000601010 0 NOTYPE GLOBAL DEFAULT 25 __data_start
60: 0000000000601018 0 OBJECT GLOBAL HIDDEN 25 __dso_handle
61: 0000000000600e30 0 OBJECT GLOBAL HIDDEN 20 __DTOR_END__
62: 00000000004005a0 137 FUNC GLOBAL DEFAULT 14 __libc_csu_init
63: 0000000000601028 0 NOTYPE GLOBAL DEFAULT ABS __bss_start
64: 0000000000601040 0 NOTYPE GLOBAL DEFAULT ABS _end
65: 0000000000601028 0 NOTYPE GLOBAL DEFAULT ABS _edata
66: 0000000000400524 27 FUNC GLOBAL DEFAULT 14 inc_func
67: 000000000040053f 67 FUNC GLOBAL DEFAULT 14 main
68: 00000000004003f0 0 FUNC GLOBAL DEFAULT 12 _init 上記の出力は、実行可能ファイルに最初に次のシンボルが含まれていることを示しています。 -s オプションを使用してシンボル テーブルを削除し、再度出力を確認します:
$ strip -s example
$ readelf -s example
Symbol table '.dynsym' contains 4 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND printf@GLIBC_2.2.5 (2)
2: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2) 上記の出力から明らかなように、シンボル テーブル全体が取り除かれています。
2. –strip-debug オプションを使用してデバッグ シンボルのみを削除する
次の例を考えてみましょう:
$ strip --strip-debug example
次に、シンボル テーブルを確認してみましょう (出力の一部を以下に示します)。
$ readelf -a example
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x400440
Start of program headers: 64 (bytes into file)
Start of section headers: 4464 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 9
Size of section headers: 64 (bytes)
Number of section headers: 31
Section header string table index: 28
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 5] .gnu.hash GNU_HASH 00000000004002c0 000002c0
000000000000001c 0000000000000000 A 6 0 8
[29] .symtab SYMTAB 0000000000000000 00001930
0000000000000630 0000000000000018 30 46 8
[30] .strtab STRTAB 0000000000000000 00001f60
00000000000001fd 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
There are no section groups in this file.
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R E 8
..
0x0000000000000000 0x0000000000000000 RW 8
GNU_RELRO 0x0000000000000e18 0x0000000000600e18 0x0000000000600e18
0x00000000000001e8 0x00000000000001e8 R 1
Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp .note.ABI-tag .note.gnu.build-id .hash .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame
03 .ctors .dtors .jcr .dynamic .got .got.plt .data .bss
04 .dynamic
05 .note.ABI-tag .note.gnu.build-id
06 .eh_frame_hdr
07
08 .ctors .dtors .jcr .dynamic .got
Dynamic section at offset 0xe40 contains 21 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
..
0x0000000000000000 (NULL) 0x0
Relocation section '.rela.dyn' at offset 0x3a8 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000600fe0 000200000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0
Relocation section '.rela.plt' at offset 0x3c0 contains 2 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000601000 000100000007 R_X86_64_JUMP_SLO 0000000000000000 printf + 0
000000601008 000300000007 R_X86_64_JUMP_SLO 0000000000000000 __libc_start_main + 0
There are no unwind sections in this file.
Symbol table '.dynsym' contains 4 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND printf@GLIBC_2.2.5 (2)
2: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)
Symbol table '.symtab' contains 66 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 000000000040046c 0 FUNC LOCAL DEFAULT 14 call_gmon_start
2: 0000000000600e18 0 OBJECT LOCAL DEFAULT 19 __CTOR_LIST__
...
61: 0000000000601040 0 NOTYPE GLOBAL DEFAULT ABS _end
62: 0000000000601028 0 NOTYPE GLOBAL DEFAULT ABS _edata
63: 0000000000400524 27 FUNC GLOBAL DEFAULT 14 inc_func
64: 000000000040053f 67 FUNC GLOBAL DEFAULT 14 main
65: 00000000004003f0 0 FUNC GLOBAL DEFAULT 12 _init
Histogram for bucket list length (total of 3 buckets):
Length Number % of total Coverage
0 0 ( 0.0%)
1 3 (100.0%) 100.0%
..
Notes at offset 0x00000254 with length 0x00000020:
Owner Data size Description
GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag)
Notes at offset 0x00000274 with length 0x00000024:
Owner Data size Description
GNU 0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring) 上記の出力を同じファイルの削除されていない出力と比較すると、太字で強調表示されたデバッグ情報が削除されていることがわかります:
...
36: 0000000000400500 0 FUNC LOCAL DEFAULT 14 frame_dummy
37: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
38: 0000000000600e20 0 OBJECT LOCAL DEFAULT 19 __CTOR_END__
39: 0000000000400750 0 OBJECT LOCAL DEFAULT 18 __FRAME_END__
40: 0000000000600e38 0 OBJECT LOCAL DEFAULT 21 __JCR_END__
41: 0000000000400630 0 FUNC LOCAL DEFAULT 14 __do_global_ctors_aux
42: 0000000000000000 0 FILE LOCAL DEFAULT ABS example.c
43: 0000000000601020 4 OBJECT LOCAL DEFAULT 25 i
44: 0000000000601038 4 OBJECT LOCAL DEFAULT 26 local.2047
45: 0000000000600fe8 0 OBJECT LOCAL HIDDEN 24 _GLOBAL_OFFSET_TABLE_
46: 0000000000600e14 0 NOTYPE LOCAL HIDDEN 19 __init_array_end
...
3. -R オプションを使用して特定のセクションを削除
必要に応じて、-R オプションを使用して完全なセクションを明示的に削除できます。
次の例を考えてみましょう:
ここでは、最初に、ストリップされていないバージョンの実行可能ファイルのすべてのセクション ヘッダーをチェックします:
$ readelf -S example
There are 31 section headers, starting at offset 0x1170:
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1
[ 2] .note.ABI-tag NOTE 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4
[ 3] .note.gnu.build-i NOTE 0000000000400274 00000274
0000000000000024 0000000000000000 A 0 0 4
[ 4] .hash HASH 0000000000400298 00000298
0000000000000024 0000000000000004 A 6 0 8
[ 5] .gnu.hash GNU_HASH 00000000004002c0 000002c0
000000000000001c 0000000000000000 A 6 0 8
[ 6] .dynsym DYNSYM 00000000004002e0 000002e0
0000000000000060 0000000000000018 A 7 1 8
[ 7] .dynstr STRTAB 0000000000400340 00000340
000000000000003f 0000000000000000 A 0 0 1
[ 8] .gnu.version VERSYM 0000000000400380 00000380 0000000000000008 0000000000000002 A 6 0 2
[ 9] .gnu.version_r VERNEED 0000000000400388 00000388
0000000000000020 0000000000000000 A 7 1 8
[10] .rela.dyn RELA 00000000004003a8 000003a8
0000000000000018 0000000000000018 A 6 0 8
[11] .rela.plt RELA 00000000004003c0 000003c0
0000000000000030 0000000000000018 A 6 13 8
[12] .init PROGBITS 00000000004003f0 000003f0
0000000000000018 0000000000000000 AX 0 0 4
[13] .plt PROGBITS 0000000000400408 00000408
0000000000000030 0000000000000010 AX 0 0 4
[14] .text PROGBITS 0000000000400440 00000440
0000000000000228 0000000000000000 AX 0 0 16
[15] .fini PROGBITS 0000000000400668 00000668
000000000000000e 0000000000000000 AX 0 0 4
[16] .rodata PROGBITS 0000000000400678 00000678
000000000000000d 0000000000000000 A 0 0 4
[17] .eh_frame_hdr PROGBITS 0000000000400688 00000688
000000000000002c 0000000000000000 A 0 0 4
[18] .eh_frame PROGBITS 00000000004006b8 000006b8
000000000000009c 0000000000000000 A 0 0 8
[19] .ctors PROGBITS 0000000000600e18 00000e18
0000000000000010 0000000000000000 WA 0 0 8
[20] .dtors PROGBITS 0000000000600e28 00000e28
0000000000000010 0000000000000000 WA 0 0 8
[21] .jcr PROGBITS 0000000000600e38 00000e38
0000000000000008 0000000000000000 WA 0 0 8
[22] .dynamic DYNAMIC 0000000000600e40 00000e40
00000000000001a0 0000000000000010 WA 7 0 8
[23] .got PROGBITS 0000000000600fe0 00000fe0
0000000000000008 0000000000000008 WA 0 0 8
[24] .got.plt PROGBITS 0000000000600fe8 00000fe8
0000000000000028 0000000000000008 WA 0 0 8
[25] .data PROGBITS 0000000000601010 00001010
0000000000000018 0000000000000000 WA 0 0 8
[26] .bss NOBITS 0000000000601028 00001028
0000000000000018 0000000000000000 WA 0 0 8
[27] .comment PROGBITS 0000000000000000 00001028
0000000000000048 0000000000000001 MS 0 0 1
[28] .shstrtab STRTAB 0000000000000000 00001070
00000000000000fe 0000000000000000 0 0 1
[29] .symtab SYMTAB 0000000000000000 00001930
0000000000000678 0000000000000018 30 49 8
[30] .strtab STRTAB 0000000000000000 00001fa8
0000000000000212 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific) 次に、実行可能ファイルから .gnu.version セクションを削除します:
strip -R .gnu.version example
ここで、セクションのリストをクロスチェックすると:
$ readelf -S example
There are 28 section headers, starting at offset 0x1158:
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1
[ 2] .note.ABI-tag NOTE 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4
[ 3] .note.gnu.build-i NOTE 0000000000400274 00000274
0000000000000024 0000000000000000 A 0 0 4
[ 4] .hash HASH 0000000000400298 00000298
0000000000000024 0000000000000004 A 6 0 8
[ 5] .gnu.hash GNU_HASH 00000000004002c0 000002c0
000000000000001c 0000000000000000 A 6 0 8
[ 6] .dynsym DYNSYM 00000000004002e0 000002e0
0000000000000060 0000000000000018 A 7 1 8
[ 7] .dynstr STRTAB 0000000000400340 00000340
000000000000003f 0000000000000000 A 0 0 1
[ 8] .gnu.version_r VERNEED 0000000000400388 00000388
0000000000000020 0000000000000000 A 7 1 8
[ 9] .rela.dyn RELA 00000000004003a8 000003a8
0000000000000018 0000000000000018 A 6 0 8
[10] .rela.plt RELA 00000000004003c0 000003c0
0000000000000030 0000000000000018 A 6 12 8
[11] .init PROGBITS 00000000004003f0 000003f0
0000000000000018 0000000000000000 AX 0 0 4
[12] .plt PROGBITS 0000000000400408 00000408
0000000000000030 0000000000000010 AX 0 0 4
[13] .text PROGBITS 0000000000400440 00000440
0000000000000228 0000000000000000 AX 0 0 16
[14] .fini PROGBITS 0000000000400668 00000668
000000000000000e 0000000000000000 AX 0 0 4
[15] .rodata PROGBITS 0000000000400678 00000678
000000000000000d 0000000000000000 A 0 0 4
[16] .eh_frame_hdr PROGBITS 0000000000400688 00000688
000000000000002c 0000000000000000 A 0 0 4
[17] .eh_frame PROGBITS 00000000004006b8 000006b8
000000000000009c 0000000000000000 A 0 0 8
[18] .ctors PROGBITS 0000000000600e18 00000e18
0000000000000010 0000000000000000 WA 0 0 8
[19] .dtors PROGBITS 0000000000600e28 00000e28
0000000000000010 0000000000000000 WA 0 0 8
[20] .jcr PROGBITS 0000000000600e38 00000e38
0000000000000008 0000000000000000 WA 0 0 8
[21] .dynamic DYNAMIC 0000000000600e40 00000e40
00000000000001a0 0000000000000010 WA 7 0 8
[22] .got PROGBITS 0000000000600fe0 00000fe0
0000000000000008 0000000000000008 WA 0 0 8
[23] .got.plt PROGBITS 0000000000600fe8 00000fe8
0000000000000028 0000000000000008 WA 0 0 8
[24] .data PROGBITS 0000000000601010 00001010
0000000000000018 0000000000000000 WA 0 0 8
[25] .bss NOBITS 0000000000601028 00001028
0000000000000018 0000000000000000 WA 0 0 8
[26] .comment PROGBITS 0000000000000000 00001028
0000000000000048 0000000000000001 MS 0 0 1
[27] .shstrtab STRTAB 0000000000000000 00001070
00000000000000e1 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific) そのため、.gnu.version セクションが取り除かれていることがわかります。
4. –strip-unneeded オプションを使用して不要なシンボルを削除
再配置処理に必要のない不要なシンボルは、–strip-unneeded オプションを使用して取り除くことができます。
次の例を考えてみましょう:
$ strip --strip-unneeded example
上記のコマンドにより、不要なシンボルが実行可能ファイルから取り除かれているはずです。
readelf コマンドを使用してこれを確認します。 readelf コマンドの出力では、.symtab セクションなどの不要な情報が取り除かれていることがわかります。
$ readelf -a example
5. -K オプションを使用して、特定のシンボルをストリップから保護します
1 つを除いてすべてのシンボルを削除する必要があるシナリオでは、-K オプションと共にシンボル名を指定することで実現できます。
以下の例を考えてみましょう:
$ strip -s -Kexample.c example
$ readelf -s example
Symbol table '.dynsym' contains 4 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND printf@GLIBC_2.2.5 (2)
2: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)
Symbol table '.symtab' contains 29 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS example.c
...
...
... そのため、シンボル example.c が削除されていないことがわかります。同じコマンドで複数の -K オプションを使用できることに注意してください。
<ブロック引用>注:上記の例で、example.c とともに他のシンボルも取り除かれなかった理由がわかりません。これに関するあらゆる種類の知識と提案を歓迎します。
6. -N オプションを使用して特定のシンボルを取り除く
特定のシンボルのみを削除するシナリオでは、シンボル名と -N オプションを指定するだけです。
以下の例を考えてみましょう:
$ strip -Nexample.c example
上記のコマンドは、実行可能ファイルからシンボル example.c を取り除いているはずです。
readelf で確認:
$ readelf -s example
Symbol table '.dynsym' contains 4 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND printf@GLIBC_2.2.5 (2)
2: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)
Symbol table '.symtab' contains 68 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000400238 0 SECTION LOCAL DEFAULT 1
2: 0000000000400254 0 SECTION LOCAL DEFAULT 2
3: 0000000000400274 0 SECTION LOCAL DEFAULT 3
4: 0000000000400298 0 SECTION LOCAL DEFAULT 4
5: 00000000004002c0 0 SECTION LOCAL DEFAULT 5
6: 00000000004002e0 0 SECTION LOCAL DEFAULT 6
7: 0000000000400340 0 SECTION LOCAL DEFAULT 7
8: 0000000000400380 0 SECTION LOCAL DEFAULT 8
9: 0000000000400388 0 SECTION LOCAL DEFAULT 9
10: 00000000004003a8 0 SECTION LOCAL DEFAULT 10
11: 00000000004003c0 0 SECTION LOCAL DEFAULT 11
12: 00000000004003f0 0 SECTION LOCAL DEFAULT 12
13: 0000000000400408 0 SECTION LOCAL DEFAULT 13
14: 0000000000400440 0 SECTION LOCAL DEFAULT 14
15: 0000000000400668 0 SECTION LOCAL DEFAULT 15
16: 0000000000400678 0 SECTION LOCAL DEFAULT 16
17: 0000000000400688 0 SECTION LOCAL DEFAULT 17
18: 00000000004006b8 0 SECTION LOCAL DEFAULT 18
19: 0000000000600e18 0 SECTION LOCAL DEFAULT 19
20: 0000000000600e28 0 SECTION LOCAL DEFAULT 20
21: 0000000000600e38 0 SECTION LOCAL DEFAULT 21
22: 0000000000600e40 0 SECTION LOCAL DEFAULT 22
23: 0000000000600fe0 0 SECTION LOCAL DEFAULT 23
24: 0000000000600fe8 0 SECTION LOCAL DEFAULT 24
25: 0000000000601010 0 SECTION LOCAL DEFAULT 25
26: 0000000000601028 0 SECTION LOCAL DEFAULT 26
27: 0000000000000000 0 SECTION LOCAL DEFAULT 27
28: 000000000040046c 0 FUNC LOCAL DEFAULT 14 call_gmon_start
29: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
30: 0000000000600e18 0 OBJECT LOCAL DEFAULT 19 __CTOR_LIST__
31: 0000000000600e28 0 OBJECT LOCAL DEFAULT 20 __DTOR_LIST__
32: 0000000000600e38 0 OBJECT LOCAL DEFAULT 21 __JCR_LIST__
33: 0000000000400490 0 FUNC LOCAL DEFAULT 14 __do_global_dtors_aux
34: 0000000000601028 1 OBJECT LOCAL DEFAULT 26 completed.7382
35: 0000000000601030 8 OBJECT LOCAL DEFAULT 26 dtor_idx.7384
36: 0000000000400500 0 FUNC LOCAL DEFAULT 14 frame_dummy
37: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
38: 0000000000600e20 0 OBJECT LOCAL DEFAULT 19 __CTOR_END__
39: 0000000000400750 0 OBJECT LOCAL DEFAULT 18 __FRAME_END__
40: 0000000000600e38 0 OBJECT LOCAL DEFAULT 21 __JCR_END__
41: 0000000000400630 0 FUNC LOCAL DEFAULT 14 __do_global_ctors_aux
42: 0000000000601020 4 OBJECT LOCAL DEFAULT 25 i
43: 0000000000601038 4 OBJECT LOCAL DEFAULT 26 local.2047
44: 0000000000600fe8 0 OBJECT LOCAL HIDDEN 24 _GLOBAL_OFFSET_TABLE_
45: 0000000000600e14 0 NOTYPE LOCAL HIDDEN 19 __init_array_end
46: 0000000000600e14 0 NOTYPE LOCAL HIDDEN 19 __init_array_start
47: 0000000000600e40 0 OBJECT LOCAL HIDDEN 22 _DYNAMIC
48: 0000000000601010 0 NOTYPE WEAK DEFAULT 25 data_start
49: 0000000000000000 0 FUNC GLOBAL DEFAULT UND printf@@GLIBC_2.2.5
50: 0000000000400590 2 FUNC GLOBAL DEFAULT 14 __libc_csu_fini
51: 0000000000400440 0 FUNC GLOBAL DEFAULT 14 _start
52: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
53: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses
54: 0000000000400668 0 FUNC GLOBAL DEFAULT 15 _fini
55: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@@GLIBC_
56: 0000000000601024 4 OBJECT GLOBAL DEFAULT 25 global
57: 0000000000400678 4 OBJECT GLOBAL DEFAULT 16 _IO_stdin_used
58: 0000000000601010 0 NOTYPE GLOBAL DEFAULT 25 __data_start
59: 0000000000601018 0 OBJECT GLOBAL HIDDEN 25 __dso_handle
60: 0000000000600e30 0 OBJECT GLOBAL HIDDEN 20 __DTOR_END__
61: 00000000004005a0 137 FUNC GLOBAL DEFAULT 14 __libc_csu_init
62: 0000000000601028 0 NOTYPE GLOBAL DEFAULT ABS __bss_start
63: 0000000000601040 0 NOTYPE GLOBAL DEFAULT ABS _end
64: 0000000000601028 0 NOTYPE GLOBAL DEFAULT ABS _edata
65: 0000000000400524 27 FUNC GLOBAL DEFAULT 14 inc_func
66: 000000000040053f 67 FUNC GLOBAL DEFAULT 14 main
67: 00000000004003f0 0 FUNC GLOBAL DEFAULT 12 _init したがって、上記の出力に example.c シンボルがないことは、それが削除されたことを示しています。
7. -o オプションを使用して新しいストリップオフ ファイルを作成します
デフォルトでは、strip コマンドは、既存の実行可能ファイルまたはオブジェクト ファイルを、それらの削除されたバージョンに置き換えます。ただし、ストリップされたファイルが元のファイルを置き換えてはならないという要件がある場合は、-o オプションとともに新しいファイルの名前を指定することで実行できます。
次の例を考えてみましょう:
$ strip -s -ostripped_example example $ ls -lart stripped_example -rwxr-xr-x 1 himanshu family 6304 2012-08-22 21:49 stripped_example
新しいファイル「stripped_example」が作成されたことがわかります。
8. -p オプションを使用して、アクセスと変更の日時を保持します
削除されたファイルに変更とアクセスの日時が保存されるシナリオでは、オプション -p が使用されます。
次の例を考えてみましょう:
最初に stat コマンドを使用して元のファイルのアクセスと変更時刻を確認しましょう:
$ stat example File: `example' Size: 8634 Blocks: 24 IO Block: 4096 regular file Device: 805h/2053d Inode: 1443986 Links: 1 Access: (0755/-rwxr-xr-x) Uid: ( 1000/himanshu) Gid: ( 1001/ family) Access: 2012-08-22 21:54:28.393778010 +0530 Modify: 2012-08-22 21:54:28.393778010 +0530 Change: 2012-08-22 21:54:28.393778010 +0530
次に、ファイルを削除します:
$ strip -s -p example
ここで、アクセスと変更時間をもう一度確認してください:
$ stat example File: `example' Size: 6304 Blocks: 16 IO Block: 4096 regular file Device: 805h/2053d Inode: 1447364 Links: 1 Access: (0755/-rwxr-xr-x) Uid: ( 1000/himanshu) Gid: ( 1001/ family) Access: 2012-08-22 21:54:28.000000000 +0530 Modify: 2012-08-22 21:54:28.000000000 +0530 Change: 2012-08-22 21:54:38.033844203 +0530
したがって、アクセス時間と変更時間は秒レベルまで保持されていることがわかります。
9. @file オプションを使用してファイルからコマンド ライン オプションを読み取る
次の例を考えてみましょう:
$ echo "-s example" -s example $ echo "-s example" > options.txt $ cat options.txt -s example $ strip @options.txt
したがって、上記の出力は、strip コマンドがファイル options.txt からの出力を受け入れたことを示しています。
10. -v オプションを使用して詳細出力を取得
バックグラウンドで何が起こっているか (strip コマンドが動作するとき) に関する詳細情報を確認する必要がある場合は、-v オプションを使用できます。
次の例を考えてみましょう:
$ strip -v example a.out bufferoverflow copy from `example' [elf64-x86-64] to `stiBqF4K' [elf64-x86-64] copy from `a.out' [elf64-x86-64] to `stN5L0lp' [elf64-x86-64] copy from `bufferoverflow' [elf64-x86-64] to `stYVKfE3' [elf64-x86-64]
したがって、strip コマンドが 3 つの実行可能ファイルを削除するように要求されたときに、中間ステップに関する情報が出力に生成されたことがわかります。