在共享库中隐藏符号是否有技术原因?

时间:2018-09-23 22:23:13

标签: dll shared-libraries dynamic-linking dllexport

在dll中隐藏符号而不是仅导出所有内容的目的是什么?除了不占用exe的更多空间外,还有其他好处吗?

1 个答案:

答案 0 :(得分:2)

  

还有其他好处吗?

还有很多其他好处。

对于库本身,不能插入隐藏的符号。当您在共享库中有这样的代码时:

int foo() { return 20; }
int bar() { return foo() + 1; }

bar的收益是什么?您可能会认为它是21,但您可能错了:如果早期的库定义了自己的foo,则bar的返回结果可能是任何内容

符号隐藏的其他好处包括更快的符号解析时间(当加载程序查找foo时,它必须依次搜索每个加载的库,并且如果设置了 exported ,则这样做会更快。函数的数量很小),并且对RAM的要求也较小(由于动态加载程序需要符号名称,因此它们都存在于内存中)。

符号隐藏还可以防止最终用户意外地依赖库实现细节,从而使您可以更改实现而不会破坏现有用户。