Skip to content

Latest commit

 

History

History
61 lines (45 loc) · 1.37 KB

File metadata and controls

61 lines (45 loc) · 1.37 KB

链接器:初始化

[TOC]

TODO:

var firstmoduledata moduledata  // linker symbol

func moduledataverify() {
	for datap := &firstmoduledata; datap != nil; datap = datap.next {
		moduledataverify1(datap)
	}
}

其中模块数据类型 moduledata 是一个单向链表:

// moduledata 记录有关可执行映像布局的信息。它由链接器编写。
// 此处的任何更改必须与 cmd/internal/ld/ symtab.go:symtab 中的代码匹配更改。
// moduledata 存储在静态分配的非指针内存中;
// 这里没有任何指针对垃圾收集器可见。
type moduledata struct {
	pclntable    []byte
	ftab         []functab
	filetab      []uint32
	findfunctab  uintptr
	minpc, maxpc uintptr

	text, etext           uintptr
	noptrdata, enoptrdata uintptr
	data, edata           uintptr
	bss, ebss             uintptr
	noptrbss, enoptrbss   uintptr
	end, gcdata, gcbss    uintptr
	types, etypes         uintptr

	textsectmap []textsect
	typelinks   []int32 // 类型偏移
	itablinks   []*itab

	ptab []ptabEntry

	pluginpath string
	pkghashes  []modulehash

	modulename   string
	modulehashes []modulehash

	hasmain uint8 // 如果模块包含 main 函数,则为1,否则为 0

	gcdatamask, gcbssmask bitvector

	typemap map[typeOff]*_type // 在前一个模块中偏移到 *_rtype

	bad bool // 如果模块加载失败,应该被忽略

	next *moduledata
}