Skip to content

Commit 0d8f2d7

Browse files
committed
add crypto
1 parent e0ad53a commit 0d8f2d7

File tree

7 files changed

+1721
-0
lines changed

7 files changed

+1721
-0
lines changed

yuheng/day01/README.md

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
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+
```

yuheng/day02/README.md

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
## 完整的编译过程
2+
3+
1. 预处理: 展开所有头文件和宏定义,删除注释,处理条件指令
4+
2. 编译: 对预处理的文件进行词法、语法、语义分析,生成汇编指令
5+
3. 汇编: 生成机器指令,输出目标文件(.o)
6+
4. 链接: 合并目标文件,生成最终可执行文件
7+
8+
## go的编译参数:
9+
10+
* gcflags 传给编译器的
11+
* ldflags 传给链接器的
12+
13+
* `go tool compile -h` 查看编译命令
14+
* `go tool link -h` 查看链接命令
15+
16+
### 编译和链接
17+
18+
1. 链接器:合并组装多个目标文件,包括地址和空间分配,符号决议和重定位操作。
19+
2. 合并方式:
20+
* 扫描所有目标文件,合并相似段,并建立全局符号表
21+
* 通过重定位表重新定位地址
22+
3. go可执行文件默认使用静态链接
23+
4. 静态链接和动态链接的区别
24+
25+
#### 同样打印hello world,go和c生成可执行文件的大小比较
26+
27+
c: 8.5KB
28+
```
29+
root@iZm5eakzlq9sm4ycm9lw0wZ:~/rxl/go/day01# cat hello.c
30+
#include <stdio.h>
31+
#include <stdlib.h>
32+
33+
int main()
34+
{
35+
printf("hello world!");
36+
return 0;
37+
}
38+
root@iZm5eakzlq9sm4ycm9lw0wZ:~/rxl/go/day01# ls -lh hello
39+
-rwxr-xr-x 1 root root 8.5K Aug 30 10:59 hello
40+
```
41+
42+
ldd可以帮助我们去查看代码引用了哪些链接库
43+
44+
```
45+
root@iZm5eakzlq9sm4ycm9lw0wZ:~/rxl/go/day01# ldd hello
46+
linux-vdso.so.1 => (0x00007fff19527000)
47+
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fedb0010000)
48+
/lib64/ld-linux-x86-64.so.2 (0x000055760469b000)
49+
```
50+
51+
52+
go: 2.0MB
53+
```
54+
root@iZm5eakzlq9sm4ycm9lw0wZ:~/rxl/go/day01# cat hello.go
55+
package main
56+
57+
import "fmt"
58+
59+
func main(){
60+
fmt.Println("hello world!")
61+
}
62+
root@iZm5eakzlq9sm4ycm9lw0wZ:~/rxl/go/day01# ls -lh hello_go
63+
-rwxr-xr-x 1 root root 2.0M Aug 30 11:01 hello_go
64+
```
65+
66+
原因:c默认使用的是动态链接,但是go使用的是静态链接,它直接把运行时所需要的指令copy到go可执行文件内部。
67+
68+
69+
### 静态编译
70+
71+
`ar rs libtest.a test.o`
72+
```
73+
root@iZm5eakzlq9sm4ycm9lw0wZ:~/rxl/go/day01# ar rs libtest.a test.o
74+
ar: creating libtest.a
75+
```
76+
77+
```
78+
root@iZm5eakzlq9sm4ycm9lw0wZ:~/rxl/go/day01# file libtest.a
79+
libtest.a: current ar archive
80+
root@iZm5eakzlq9sm4ycm9lw0wZ:~/rxl/go/day01# gcc -o test111 test.c libtest.a
81+
root@iZm5eakzlq9sm4ycm9lw0wZ:~/rxl/go/day01# ./test111
82+
768
83+
root@iZm5eakzlq9sm4ycm9lw0wZ:~/rxl/go/day01# ldd test111
84+
linux-vdso.so.1 => (0x00007ffc30b07000)
85+
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007efd319d2000)
86+
/lib64/ld-linux-x86-64.so.2 (0x0000562e3d2b4000
87+
```
88+
89+
### 动态编译
90+
91+
```
92+
root@iZm5eakzlq9sm4ycm9lw0wZ:~/rxl/go/day01# gcc -fPIC -shared -o libtest.so test.c; gcc -I. -o test_so test.c ./libtest.so
93+
root@iZm5eakzlq9sm4ycm9lw0wZ:~/rxl/go/day01# ls
94+
add add.go hello hello.c hello.go hello_go libtest.a libtest.so test test.c test.go test.o test111 test2 test_so
95+
root@iZm5eakzlq9sm4ycm9lw0wZ:~/rxl/go/day01# ldd test_so
96+
```
97+
98+
### 压缩go的可执行文件
99+
100+
101+
```
102+
root@iZm5eakzlq9sm4ycm9lw0wZ:~/rxl/go/day01# ls -lh hello_go
103+
-rwxr-xr-x 1 root root 1.2M Aug 30 11:22 hello_go
104+
105+
root@iZm5eakzlq9sm4ycm9lw0wZ:~/rxl/go/day01# strip hello_go
106+
107+
root@iZm5eakzlq9sm4ycm9lw0wZ:~/rxl/go/day01# upx -9 hello_go
108+
Ultimate Packer for eXecutables
109+
Copyright (C) 1996 - 2013
110+
UPX 3.91 Markus Oberhumer, Laszlo Molnar & John Reiser Sep 30th 2013
111+
112+
File size Ratio Format Name
113+
-------------------- ------ ----------- -----------
114+
1219240 -> 452068 37.08% linux/ElfAMD hello_go
115+
116+
Packed 1 file.
117+
118+
root@iZm5eakzlq9sm4ycm9lw0wZ:~/rxl/go/day01# ls -lh hello_go
119+
-rwxr-xr-x 1 root root 442K Aug 30 11:23 hello_go
120+
```

0 commit comments

Comments
 (0)