Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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
C++ 链接器如何在剥离的动态库中定位代码?_C++_Dynamic_Dll_Linker_Ld - Fatal编程技术网

C++ 链接器如何在剥离的动态库中定位代码?

C++ 链接器如何在剥离的动态库中定位代码?,c++,dynamic,dll,linker,ld,C++,Dynamic,Dll,Linker,Ld,通常的做法是从动态库中删除符号表(Windows上为.dll,OSX上为.dylib,Linux/Solaris/BSD上为.so)。这是有意义的,因为它大大减少了库的文件大小,通常超过75% 然而,有一个问题一直困扰着我:一个精简的库没有符号表。如果我编写一个引用此库中函数的可执行文件,那么当没有符号表提供此信息时,操作系统的动态链接器如何知道剥离库中代码段的位置 这个问题既包括在编译时链接可执行文件之前剥离库的情况,也包括在编译时链接可执行文件之后剥离库的情况 如果有人能给我解释一下,那就太

通常的做法是从动态库中删除符号表(Windows上为.dll,OSX上为.dylib,Linux/Solaris/BSD上为.so)。这是有意义的,因为它大大减少了库的文件大小,通常超过75%

然而,有一个问题一直困扰着我:一个精简的库没有符号表。如果我编写一个引用此库中函数的可执行文件,那么当没有符号表提供此信息时,操作系统的动态链接器如何知道剥离库中代码段的位置

这个问题既包括在编译时链接可执行文件之前剥离库的情况,也包括在编译时链接可执行文件之后剥离库的情况


如果有人能给我解释一下,那就太好了!谢谢。

运行strip时剥离的符号是调试符号,而不是实际导出符号的名称


链接器搜索的动态符号仍然存在,可以使用-D(列出动态符号)参数列出。

那么为什么
nm
报告“无符号”?@LeoIzen:如果没有任何命令行开关,
nm
将默认不打印动态/导出符号表
nm-a
nm-D
应纠正此问题。如回答中所述,当您使用
strip
时,基本上会剥离未导出的符号。此命令不会删除导出的任何内容,即在运行时链接时需要在库中动态定位的内容。如果您在linux下(我不知道是否在Mac/BSD下工作),请尝试使用