go内核源码剖析 一
这篇是看雨痕大佬的书所做练习的笔记,(其实后面部分基本都是抄的,但是都实践了)
由于电脑抽风,使用的是win10的Linux子系统,功能不完善,很多跟踪支持性不好(可以算是抄的原因)。
要想看内核源码剖析的可以到雨痕大神的github。
- 1.新建hello.go编译得到hello
2.gdb调试,输入 gdb hello 命令行得到:((gdb) 后都表示输入的))
先是Linux系统下的:
(gdb) info files
Symbols from "C:\Users\WnagoiYy\hello".
Local exec file:
'C:\Users\WnagoiYy\hello', file type elf64-x86-64.
Entry point: 0x41bc50
0x0000000000400c00 - 0x000000000041c0ba is .text
0x000000000041d000 - 0x0000000000435a00 is .rodata
0x0000000000435a00 - 0x0000000000435af8 is .typelink
0x0000000000435b00 - 0x0000000000440c91 is .gosymtab
0x0000000000440ca0 - 0x0000000000454c46 is .gopclntab
0x0000000000455000 - 0x0000000000455030 is .noptrdata
0x0000000000455040 - 0x0000000000459688 is .data
0x00000000004596a0 - 0x0000000000461698 is .bss
0x00000000004616a0 - 0x0000000000476bf8 is .noptrbss
接下来是windows下的编译后文件gdb:
(gdb) info files
Symbols from "C:\Users\WnagoiYy\go\hello".
Local exec file:
'C:\Users\WnagoiYy\go\hello', file type pei-x86-64.
Entry point: 0x44d730
0x0000000000401000 - 0x00000000004953ad is .text
0x0000000000496000 - 0x0000000000496c00 is .data
0x0000000000506000 - 0x00000000005064fc is .idata
Entry point: 0x41bc50 入口地址在.text段file type elf64-x86-64. 文件类型为elf
.text
代码段(codesegment/textsegment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。.rodata
存放字符串和#define定义的常量.data
数据段(datasegment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。.bss
BSS段(bsssegment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文BlockStarted by Symbol的简称。BSS段属于静态内存分配。
(gdb) b *0x41bc50
Breakpoint 1 at 0x41bc50: file /usr/lib/go/src/pkg/runtime/rt0_linux_amd64.s, line 8.入口打上一个断点,因为是win10下的linux子系统,所以文件路径不对
hejing@DESKTOP-EP9L18K:/mnt/c/Go/src/runtime$ ls rt0_*
...
rt0_darwin_arm64.s rt0_linux_amd64.s rt0_nacl_386.s
rt0_openbsd_amd64.s rt0_windows_amd64.s先cd到/mnt/c/Go/src/runtime,然后输入ls rt0_*,会找到许多文件,我们需要上面断点的rt0_linux_amd64.s
打开rt0_linux_amd64.s,跳到具体行查看代码: