Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dll 在共享库中隐藏符号是否有技术原因?_Dll_Shared Libraries_Dynamic Linking_Dllexport - Fatal编程技术网

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

Dll 在共享库中隐藏符号是否有技术原因?,dll,shared-libraries,dynamic-linking,dllexport,Dll,Shared Libraries,Dynamic Linking,Dllexport,在dll中隐藏符号而不是导出所有内容的目的是什么?除了在exe中不占用更多的空间之外,还有其他好处吗 还有其他好处吗 还有很多其他好处 对于库本身,不能插入隐藏符号。当共享库中有这样的代码时: int foo() { return 20; } int bar() { return foo() + 1; } 从条返回的值是多少?您可能认为它是21,但您可能错了:如果早期的库定义了自己的foo,那么bar的返回可能是任何内容 符号隐藏的其他好处包括更快的符号解析时间(当加载程序查找foo时,它必须

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

还有其他好处吗

还有很多其他好处

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

int foo() { return 20; }
int bar() { return foo() + 1; }
返回的值是多少?您可能认为它是21,但您可能错了:如果早期的库定义了自己的
foo
,那么
bar
的返回可能是任何内容

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


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

但这只发生在POSIX中,对吗?GetProcAddress将返回正确的foo。而且,即使在Linux中,也有一个标志不在全局名称空间中加载符号,不是吗?关于解析访问时间,这不是哈希映射或binsearch吗?如果不是的话,那就太奇怪了。@capr你的问题的答案是多而复杂的。是的,
dlopen
ing允许
RTLD\u LOCAL
(但是直接链接到共享库不允许)。是的,有哈希表,但哈希表仍然需要搜索,搜索时间也不是固定不变的。其他好处:防止用户意外依赖库内部,避免符号冲突导致的错误。@yugr很好的观点;答案已更新。符号冲突(我想)已经包括在内了。提供隐藏符号的全面优势列表。