Go内核源码剖析 一 程序执行启动过程

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,跳到具体行查看代码:
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值