静态链接的用途是什么?

What is the static link used for?

提问人:Evert Heylen 提问时间:1/4/2015 最后编辑:CommunityEvert Heylen 更新时间:1/4/2015 访问量:4599

问:

(在出现任何误解之前,我不是在谈论图书馆的联系。

在我的教科书(关于MIPS组装)中,有如下陈述:

过程/功能帧(又名激活记录)

  • 某些编译器用于管理堆栈存储
  • 除了堆栈指针之外,还可以使用帧指针寄存器$fp 跟踪堆栈上与以下相关的所有相关信息 到过程/函数调用。

主叫方:

  • 调用方在堆栈上推送参数 (或通过 $a 0 - $a 3 如果不超过 4 个参数,则传递它们)
  • 调用方在堆栈上为返回值保留空间 (或者通过 $v 0 - $v 1 返回)
  • 调用方传递静态链接(最近的堆栈上的地址 下一个词法封闭过程/函数的出现) 通过 $v 0

(继续谈论被叫方等......

我很难理解MIPS(帧指针等)中的动态链接,因为 我不明白为什么需要它。最终我发现根本不需要它们,它只是在调试时派上用场。

我对这些静态链接感觉相似,有人可以向我解释它们的用途(最好是举个例子)吗?

组装 MIPS

评论


答:

1赞 Tommy 1/4/2015 #1

这是关于范围的。某些语言允许函数嵌套在函数中;在这些情况下,静态链接是指向包含该语言的函数的堆栈帧的链接。它之所以被称为静态链接,是因为它将链接到什么内容在完成时是已知的(尽管不确切地指向哪里,因为这将是父函数在堆栈上建立其框架的任何位置)。

与动态链接进行比较和对比,动态链接始终只指向上面的堆栈帧。这是动态的,因为(通常)许多函数中的任何一个都可能被调用,因此在编译时不知道哪个函数拥有指向的帧的实例。

想象一个函数 F,子函数 Fa、Fb、Fc,F 调用 Fa,Fa 调用 Fb,Fb 调用 Fc,Fa、Fb 和 Fc 都可以根据语言的语义访问 F 的本地存储。

然后,Fa的动态和静态链接将指向与F关联的堆栈帧。

Fb 的动态链接将指向 Fa 的框架;它的静态链接将指向 F。

Fc 的动态链接将指向 Fb 的帧;它的静态链接将指向 F。

6赞 drRobertz 1/4/2015 #2

静态链接、词法括起来的作用域或静态父级在可以在函数中声明函数的语言中是必需的。 例如,在以下伪代码中

int foo(int s, int t) {
    int x;
    ... 
    int bar(int a) {
        return a + x;
    }
}

在 中,变量是相对于静态链接访问的。barx

使用堆栈框架布局

------------------------
arg 1: s
arg 2: t
return address
local variable: x
... 
-------------------------

假设所有值为 32 位,则访问 IN 的地址为xbarstatic_link + 12

评论

0赞 Evert Heylen 1/4/2015
我想我明白了,但在这种情况下呢:hastebin.com/redotivalu 功能栏是否必须创建 x 的副本并将其放在自己的框架中?
0赞 drRobertz 1/4/2015
请参阅编辑后的答案。不,x 在 foo 的堆栈帧中,通过 bar 的静态链接到达,通过 quux 的静态链接到达。
0赞 drRobertz 1/4/2015
顺便说一句,全局变量可以看作是静态父变量的特例。
0赞 Evert Heylen 1/4/2015
赤穗感谢您的回答,在通过 2 个静态链接时到达 X 是我脑海中的另一个选择:)
1赞 Evert Heylen 1/4/2015
两个答案都回答了这个问题,但我会选择这个答案,因为它更简单,并且有一个更直接的例子(伪代码而不是一堆文本)