ZHCADC4A September 2011 – March 2014
只有可从其他链接单元调用的函数才需要调整 DP。只能从其静态链接单元内调用的函数不需要调整 DP,因为它们可以依靠其调用方来执行此操作。函数被外部调用的能力称为其可见性。(请注意,可见性也适用于对象被抢占的能力;请参阅 节 6.4。)
来自另一个链接单元的外部调用可以是直接调用(这种情况下通过名称调用函数),也可以是间接调用(这种情况下会获取函数的地址并传递给外部调用方,然后调用方通过此地址调用函数)。ELF 提供了四个可见性级别,涵盖了从其他模块进行直接和间接调用的各种可能性,如表 6-1 中所述:
名称 | 可直接调用 | 可间接调用 | 可抢占 |
---|---|---|---|
STV_DEFAULT | 是 | 是 | 是 |
STV_PROTECTED | 是 | 是 | 否 |
STV_HIDDEN | 否 | 是 | 否 |
STV_INTERNAL | 否 | 否 | 否 |
函数的可见性由其声明以及一组编译器和平台特定约定共同决定。例如,在 Linux 模型中,除非在外部函数的声明中添加 _ _attribute_ _((visibility)) 修饰符来指示,否则外部函数具有 STV_DEFAULT 可见性;但对于裸机平台,STV_HIDDEN 或 STV_INTERNAL 的默认可见性可能更合适。