Sun Studio 12:性能分析器

共享对象之间的函数调用

一个共享对象中的函数调用另一个共享对象中的函数时,其执行情况比在程序内对函数的简单调用更复杂。每个共享对象都包含一个程序链接表 (Program Linkage Table, PLT),该表包含位于该共享对象外部并从该共享对象引用的每个函数的条目。最初,PLT 中每个外部函数的地址实际上是 ld.so(即动态链接程序)内的地址。第一次调用这样的函数时,控制权将转移到动态链接程序,该动态链接程序会解析对实际外部函数的调用并为后续调用修补 PLT 地址。

如果在执行三个 PLT 指令之一的过程中发生分析事件,则 PLT PC会被删除,并将独占时间归属到调用指令。如果在首次通过 PLT 条目调用过程中发生分析事件,但是叶 PC 不是 PLT 指令之一,则 PLT 和 ld.so 中的代码引起的任何 PC 都将由对人工函数 @plt 的调用替换,该函数将累计包含时间。每个共享对象都有一个这样的人工函数。如果程序使用 LD_AUDIT 接口,则可能从不修补 PLT 条目,而且来自 @plt 的非叶 PC 可能发生得更频繁。