|
| 1 | +# 一些常用命令 |
| 2 | + |
| 3 | +* gcc --version |
| 4 | +* gdb --version |
| 5 | +* gdb |
| 6 | +* dstat |
| 7 | +* pidstat -w |
| 8 | +* htop |
| 9 | +* objdump |
| 10 | +* readelf |
| 11 | + |
| 12 | +[源码地址下载](https://golang.org/dl/) 注意:需要翻墙 |
| 13 | + |
| 14 | +推荐自己去下载源码进行编译,go支持自举,可以使用低版本编译高版本。 |
| 15 | + |
| 16 | +## add.c |
| 17 | + |
| 18 | +``` |
| 19 | +//gcc -O0 -o test1 add.c //gcc 的开关 把优化都关掉 |
| 20 | +//gcc -O2 -o test2 add.c // O1 O2 O3 各种优化级别 |
| 21 | +//objdump -d -M intel test1 |
| 22 | +//objdump -d -M intel test2 |
| 23 | +``` |
| 24 | + |
| 25 | + |
| 26 | +`gcc -c teest.o`继续生成 .o 文件 |
| 27 | + |
| 28 | + |
| 29 | +`readelf -r test.o` |
| 30 | +``` |
| 31 | +root@iZm5eakzlq9sm4ycm9lw0wZ:~/rxl/go/day01# readelf -r test.o |
| 32 | +
|
| 33 | +Relocation section '.rela.text' at offset 0x268 contains 3 entries: |
| 34 | + Offset Info Type Sym. Value Sym. Name + Addend |
| 35 | +00000000003c 000900000002 R_X86_64_PC32 0000000000000000 add - 4 |
| 36 | +000000000049 00050000000a R_X86_64_32 0000000000000000 .rodata + 0 |
| 37 | +000000000053 000b00000002 R_X86_64_PC32 0000000000000000 printf - 4 |
| 38 | +
|
| 39 | +Relocation section '.rela.eh_frame' at offset 0x2b0 contains 2 entries: |
| 40 | + Offset Info Type Sym. Value Sym. Name + Addend |
| 41 | +000000000020 000200000002 R_X86_64_PC32 0000000000000000 .text + 0 |
| 42 | +000000000040 000200000002 R_X86_64_PC32 0000000000000000 .text + 14 |
| 43 | +``` |
| 44 | + |
| 45 | + |
| 46 | +`objdump -S test.o` |
| 47 | +``` |
| 48 | +root@iZm5eakzlq9sm4ycm9lw0wZ:~/rxl/go/day01# objdump -S test.o |
| 49 | +
|
| 50 | +test.o: file format elf64-x86-64 |
| 51 | +
|
| 52 | +
|
| 53 | +Disassembly of section .text: |
| 54 | +
|
| 55 | +0000000000000000 <add>: |
| 56 | + 0: 55 push %rbp |
| 57 | + 1: 48 89 e5 mov %rsp,%rbp |
| 58 | + 4: 89 7d fc mov %edi,-0x4(%rbp) |
| 59 | + 7: 89 75 f8 mov %esi,-0x8(%rbp) |
| 60 | + a: 8b 55 fc mov -0x4(%rbp),%edx |
| 61 | + d: 8b 45 f8 mov -0x8(%rbp),%eax |
| 62 | + 10: 01 d0 add %edx,%eax |
| 63 | + 12: 5d pop %rbp |
| 64 | + 13: c3 retq |
| 65 | +
|
| 66 | +0000000000000014 <main>: |
| 67 | + 14: 55 push %rbp |
| 68 | + 15: 48 89 e5 mov %rsp,%rbp |
| 69 | + 18: 48 83 ec 20 sub $0x20,%rsp |
| 70 | + 1c: 89 7d ec mov %edi,-0x14(%rbp) |
| 71 | + 1f: 48 89 75 e0 mov %rsi,-0x20(%rbp) |
| 72 | + 23: c7 45 f4 00 01 00 00 movl $0x100,-0xc(%rbp) |
| 73 | + 2a: c7 45 f8 00 02 00 00 movl $0x200,-0x8(%rbp) |
| 74 | + 31: 8b 55 f8 mov -0x8(%rbp),%edx |
| 75 | + 34: 8b 45 f4 mov -0xc(%rbp),%eax |
| 76 | + 37: 89 d6 mov %edx,%esi |
| 77 | + 39: 89 c7 mov %eax,%edi |
| 78 | + 3b: e8 00 00 00 00 callq 40 <main+0x2c> |
| 79 | + 40: 89 45 fc mov %eax,-0x4(%rbp) |
| 80 | + 43: 8b 45 fc mov -0x4(%rbp),%eax |
| 81 | + 46: 89 c6 mov %eax,%esi |
| 82 | + 48: bf 00 00 00 00 mov $0x0,%edi |
| 83 | + 4d: b8 00 00 00 00 mov $0x0,%eax |
| 84 | + 52: e8 00 00 00 00 callq 57 <main+0x43> |
| 85 | + 57: b8 00 00 00 00 mov $0x0,%eax |
| 86 | + 5c: c9 leaveq |
| 87 | + 5d: c3 retq |
| 88 | +``` |
| 89 | + |
| 90 | +## add.go |
| 91 | + |
| 92 | +`go build -gcflags "-m" -o test add.go ` 输出优化器可以做的优化的策略 |
| 93 | + |
| 94 | +``` |
| 95 | + wolf4j@xiaolong ~/go/src/golang/yuheng/day01 master ●✚ go build -gcflags "-m" -o test add.go |
| 96 | +# command-line-arguments |
| 97 | +./add.go:3:6: can inline add |
| 98 | +./add.go:7:6: can inline main |
| 99 | +./add.go:11:5: inlining call to add |
| 100 | +
|
| 101 | +``` |
| 102 | + |
| 103 | +`go tool objdump -s "main\.main" test` |
| 104 | + |
| 105 | +``` |
| 106 | + wolf4j@xiaolong ~/go/src/golang/yuheng/day01 master ●✚ go tool objdump -s "main\.main" test |
| 107 | +TEXT main.main(SB) /Users/wolf4j/go/src/golang/yuheng/day01/add.go |
| 108 | + add.go:7 0x104f360 65488b0c25a0080000 MOVQ GS:0x8a0, CX |
| 109 | + add.go:7 0x104f369 483b6110 CMPQ 0x10(CX), SP |
| 110 | + add.go:7 0x104f36d 7634 JBE 0x104f3a3 |
| 111 | + add.go:7 0x104f36f 4883ec10 SUBQ $0x10, SP |
| 112 | + add.go:7 0x104f373 48896c2408 MOVQ BP, 0x8(SP) |
| 113 | + add.go:7 0x104f378 488d6c2408 LEAQ 0x8(SP), BP |
| 114 | + add.go:12 0x104f37d e82e3ffdff CALL runtime.printlock(SB) |
| 115 | + add.go:12 0x104f382 48c7042400030000 MOVQ $0x300, 0(SP) |
| 116 | + add.go:12 0x104f38a e80147fdff CALL runtime.printint(SB) |
| 117 | + add.go:12 0x104f38f e8cc41fdff CALL runtime.printnl(SB) |
| 118 | + add.go:12 0x104f394 e8a73ffdff CALL runtime.printunlock(SB) |
| 119 | + add.go:13 0x104f399 488b6c2408 MOVQ 0x8(SP), BP |
| 120 | + add.go:13 0x104f39e 4883c410 ADDQ $0x10, SP |
| 121 | + add.go:13 0x104f3a2 c3 RET |
| 122 | + add.go:7 0x104f3a3 e8c883ffff CALL runtime.morestack_noctxt(SB) |
| 123 | + add.go:7 0x104f3a8 ebb6 JMP main.main(SB) |
| 124 | + :-1 0x104f3aa cc INT $0x3 |
| 125 | + :-1 0x104f3ab cc INT $0x3 |
| 126 | + :-1 0x104f3ac cc INT $0x3 |
| 127 | + :-1 0x104f3ad cc INT $0x3 |
| 128 | + :-1 0x104f3ae cc INT $0x3 |
| 129 | + :-1 0x104f3af cc INT $0x3 |
| 130 | +``` |
| 131 | + |
| 132 | + |
| 133 | +`go build -x -o add add.go` |
| 134 | +``` |
| 135 | + wolf4j@xiaolong ~/go/src/golang/yuheng/day01 master ●✚ go build -x -o add add.go |
| 136 | +WORK=/var/folders/wk/y6tt5z4d0236rbrh14vpmqz40000gp/T/go-build310512725 |
| 137 | +mkdir -p $WORK/command-line-arguments/_obj/ |
| 138 | +mkdir -p $WORK/command-line-arguments/_obj/exe/ |
| 139 | +cd /Users/wolf4j/go/src/golang/yuheng/day01 |
| 140 | +/usr/local/go/pkg/tool/darwin_amd64/compile -o $WORK/command-line-arguments.a -trimpath $WORK -goversion go1.9.2 -p main -complete -buildid 490ab27c53105f459b886069b1de57e37fadf810 -D _/Users/wolf4j/go/src/golang/yuheng/day01 -I $WORK -pack ./add.go |
| 141 | +cd . |
| 142 | +/usr/local/go/pkg/tool/darwin_amd64/link -o $WORK/command-line-arguments/_obj/exe/a.out -L $WORK -extld=clang -buildmode=exe -buildid=490ab27c53105f459b886069b1de57e37fadf810 $WORK/command-line-arguments.a |
| 143 | +mv $WORK/command-line-arguments/_obj/exe/a.out add |
| 144 | +``` |
0 commit comments