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

Are there technical reasons for hiding symbols in a shared library?

将符号隐藏在 dll 中而不是仅导出所有内容的目的是什么?除了不占用exe多一点space还有什么好处吗?

is there any other benefit?

还有很多其他好处。

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

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

bar 中的 return 是什么?你可能认为它是 21,但你可能错了:如果早期的库定义了它自己的 foobar 中的 return 可能是 anything .

符号隐藏的其他好处包括更快的符号解析时间(当加载器查找 foo 时,它必须依次搜索每个加载的库,如果 exported 函数集很小),并且对 RAM 的要求更小(因为动态加载程序需要符号名称,所以它们都存在于内存中)。

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