在共享库中隐藏符号是否有技术原因?
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,但你可能错了:如果早期的库定义了它自己的 foo
,bar
中的 return 可能是 anything .
符号隐藏的其他好处包括更快的符号解析时间(当加载器查找 foo
时,它必须依次搜索每个加载的库,如果 exported 函数集很小),并且对 RAM 的要求更小(因为动态加载程序需要符号名称,所以它们都存在于内存中)。
符号隐藏还可以防止最终用户意外地依赖库实现细节,从而允许您更改实现而不会有破坏现有用户的风险。
将符号隐藏在 dll 中而不是仅导出所有内容的目的是什么?除了不占用exe多一点space还有什么好处吗?
is there any other benefit?
还有很多其他好处。
对于库本身,不能插入隐藏符号。当共享库中有这样的代码时:
int foo() { return 20; }
int bar() { return foo() + 1; }
bar
中的 return 是什么?你可能认为它是 21,但你可能错了:如果早期的库定义了它自己的 foo
,bar
中的 return 可能是 anything .
符号隐藏的其他好处包括更快的符号解析时间(当加载器查找 foo
时,它必须依次搜索每个加载的库,如果 exported 函数集很小),并且对 RAM 的要求更小(因为动态加载程序需要符号名称,所以它们都存在于内存中)。
符号隐藏还可以防止最终用户意外地依赖库实现细节,从而允许您更改实现而不会有破坏现有用户的风险。