首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >了解go工具编译和链接命令

了解go工具编译和链接命令
EN

Stack Overflow用户
提问于 2017-11-16 21:45:11
回答 1查看 909关注 0票数 1

我知道将高级语言代码转换为机器语言或可执行代码需要三个步骤,即编译、汇编和链接。

按照go文档go tool编译执行以下操作- It then writes a single object file named for the basename of the first source file with a .o suffix

因此,最终的目标文件必须包含每个文件的机器语言代码(在编译和汇编后运行)。如果我在go文件上通过go tool compile -S,它会显示go生成的汇编语言。

之后,当我在目标文件上运行go tool link时,它必须链接所有需要的目标文件(如果有多个),然后生成最终的机器语言代码(基于GOOS和GOARCH.它会生成一个文件a.out

这里有一些基本的问题-

我如何知道哪些变量以及何时将在堆栈和堆中为它们分配内存?如果我为一台机器生成可执行文件,然后在另一台架构不同的机器上运行,这有什么关系吗?

我的测试程序

package main

func f(a *int, b *int) *int { 

    var c = (*a + *b); 
    var d = c;
    return &d;
}

func main() {
    var a = 2;
    var b = 6;

    f(&a,&b);
}

go tool compile -m -l test.go的结果

test.go:6: moved to heap: d
test.go:7: &d escapes to heap
test.go:3: f a does not escape
test.go:3: f b does not escape
test.go:14: main &a does not escape
test.go:14: main &b does not escape
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-16 21:57:19

内存是在哪个步骤中分配的?

这取决于,有些是在链接期间,有些是在编译期间,大多数是在运行时(以及一些在加载期间)。

我怎么知道哪些变量以及它们什么时候会在堆栈和堆中被分配内存?

临时的,你根本不知道。编译器决定这一点。如果编译器可以证明某个变量不会转义,它可能会将其保留在堆栈中。谷歌搜索"golang逸出分析“。有一个标志-m,如果你对它感兴趣,它会让编译器输出他的决定。

如果我为一台机器生成可执行文件,然后在另一台架构不同的机器上运行,这有关系吗?

不,只是因为这根本不起作用:可执行文件与体系结构捆绑在一起,无法在不同的体系结构上运行。

看起来你把编译/链接和内存分配搞混了。后者与前两种截然不同。(从技术上讲,您的链接程序可能包含内存,在加载过程中可能会获得更多内存,但这是高度技术性和特定于体系结构的,实际上没有什么可担心的)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47331287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档