返回介绍

上卷 程序设计

中卷 标准库

下卷 运行时

源码剖析

附录

1.1 引导

发布于 2024-10-12 19:15:55 字数 1796 浏览 0 评论 0 收藏 0

随意编译一个可执行程序。

$ gdb test

GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.

Reading symbols from test...
Loading Go Runtime support.

(gdb) starti
Starting program: test 

Program stopped.
_rt0_amd64_linux () at /usr/local/go/src/runtime/rt0_linux_amd64.s:8
8		JMP	_rt0_amd64(SB)

也可用 readelf 获取起始地址。

$ readelf -h ./test

ELF Header:
  Entry point address:               0x453860
  
  
$ addr2line -e ./test -a 0x453860

/usr/local/go/src/runtime/rt0_linux_amd64.s:8

查看 go/src/runtime 目录下以汇编实现的引导过程源码。

// rt0_linux_amd64.s

TEXT _rt0_amd64_linux(SB),NOSPLIT,$-8
	JMP	_rt0_amd64(SB)
// asm_amd64.s

// _rt0_amd64 is common startup code for most amd64 systems when using
// internal linking. This is the entry point for the program from the
// kernel for an ordinary -buildmode=exe program. The stack holds the
// number of arguments and the C-style argv.

TEXT _rt0_amd64(SB),NOSPLIT,$-8
	MOVQ	0(SP), DI	// argc
	LEAQ	8(SP), SI	// argv
	JMP	runtime·rt0_go(SB)

核心流程是创建 main goroutine (runtime.main),并执行 mstart 进入调度循环。

TEXT runtime·rt0_go(SB),NOSPLIT|TOPFRAME,$0

	CALL	runtime·check(SB)

	CALL	runtime·args(SB)
	CALL	runtime·osinit(SB)
	CALL	runtime·schedinit(SB)

	// create a new goroutine to start program
	MOVQ	$runtime·mainPC(SB), AX		// entry
	PUSHQ	AX
	CALL	runtime·newproc(SB)
	POPQ	AX

	// start this M
	CALL	runtime·mstart(SB)

	CALL	runtime·abort(SB)	// mstart should never return
	RET
// mainPC is a function value for runtime.main, to be passed to newproc.

DATA	runtime·mainPC+0(SB)/8,$runtime·main<ABIInternal>(SB)
GLOBL	runtime·mainPC(SB),RODATA,$8

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文