“序数112不能位于dynamic链接库…”

整体错误如下:“序号112不能位于dynamic链接库D:\ GNU-C-compiler \ GNUstep \ bin \ openssl.exe”

我一直在网上寻找解决scheme无济于事。 我最近开始使用OpenSSL进行encryption,但在安装过程中,我安装了多个不同版本的软件进行testing,但是在删除这些其他版本的时候,我只是删除了文件夹,而不是做适当的卸载程序(openssl程序保存了一些DLL进入Windows系统目录,所以这些多个DLL的保存)。 因此,我相信这些额外的dll是问题的根源(也许),但我找不到方法轻松地卸载它们,所以我要求一个合理的解决scheme,以解决这个问题。

“序数112不能位于动态链接库…”

我从OpenSSL 1.0.2推测SSLv23_server_methodBN_MONT_CTX_free ; 或来自OpenSSL 1.1.0的RSA_PSS_PARAMS_freeSSL_CONF_CTX_clear_flags 。 基于最近的一些变化,我猜测它的OpenSSL 1.0.2和SSLv23_server_method

 # OpenSSL 1.1.0 $ find $PWD -type f -iname '*.num' -exec grep " 112" {} \; RSA_PSS_PARAMS_free 112 1_1_0 EXIST::FUNCTION:RSA SSL_CONF_CTX_clear_flags 112 1_1_0 EXIST::FUNCTION: ... # OpenSSL 1.0.2 $ find $PWD -type f -iname '*.num' -exec grep " 372" {} \; BN_MONT_CTX_free 112 EXIST::FUNCTION: SSLv23_server_method 112 EXIST::FUNCTION:RSA ... 

您需要使用dumpbin或Dependency Walker来验证它。 另请参阅如何从序号(由序号导出)找到导出的函数名称? 在堆栈溢出。


序号是使用<openssl src>\util\mkdef.pl 。 你可以看到来自OpenSSL的GitHub存在的源代码。 这里是1.0.2 , 这里是1.1.0 。

以下是该文件的注释:

 #!/usr/local/bin/perl -w # # generate a .def file # # It does this by parsing the header files and looking for the # prototyped functions: it then prunes the output. # # Intermediary files are created, call libcrypto.num and libssl.num, # The format of these files is: # # routine-name nnnn vers info # # The "nnnn" and "vers" fields are the numeric id and version for the symbol # respectively. The "info" part is actually a colon-separated string of fields # with the following meaning: # # existence:platform:kind:algorithms # # - "existence" can be "EXIST" or "NOEXIST" depending on if the symbol is # found somewhere in the source, # - "platforms" is empty if it exists on all platforms, otherwise it contains # comma-separated list of the platform, just as they are if the symbol exists # for those platforms, or prepended with a "!" if not. This helps resolve # symbol name variants for platforms where the names are too long for the # compiler or linker, or if the systems is case insensitive and there is a # clash, or the symbol is implemented differently (see # EXPORT_VAR_AS_FUNCTION). This script assumes renaming of symbols is found # in the file crypto/symhacks.h. # The semantics for the platforms is that every item is checked against the # environment. For the negative items ("!FOO"), if any of them is false # (ie "FOO" is true) in the environment, the corresponding symbol can't be # used. For the positive itms, if all of them are false in the environment, # the corresponding symbol can't be used. Any combination of positive and # negative items are possible, and of course leave room for some redundancy. # - "kind" is "FUNCTION" or "VARIABLE". The meaning of that is obvious. # - "algorithms" is a comma-separated list of algorithm names. This helps # exclude symbols that are part of an algorithm that some user wants to # exclude. 

使用OpenSSL 1.0.2g也有同样的问题 – 缺少的功能是“SSLv2_client_method”(113,缺少序号的消息似乎是错过了)。

1.0.2f和1.0.2g之间的变化[2016年3月1日]

  • 禁用SSLv2默认构建,默认协商和弱密码。 在构建时,SSLv2默认是禁用的。 没有配置“enable-ssl2”的版本将不支持SSLv2。