openssl 静态库和共享库中的不同符号

问题描述 投票:0回答:1

我在Windows上配置并构建了openssl 3.0.15,并且运行良好。我也有静态库和共享库。当我尝试将我的应用程序链接到其中之一时,我注意到它适用于静态库,但不适用于 dll。看来导出的符号是不同的。是故意的吗?我是不是错过了什么?

我创建了一个虚拟应用程序:

#include <stdio.h>
#include <crypto/chacha.h>

int main() {
    unsigned char key[32] = {0};
    unsigned char nonce[12] = {0};
    unsigned char in[64] = {0};
    unsigned char out[64] = {0};

    // Initialize the key and nonce with some values
    for (int i = 0; i < 32; i++) key[i] = i;
    for (int i = 0; i < 12; i++) nonce[i] = i;

    // Encrypt the input data
    ChaCha20_ctr32(out, in, sizeof(in), (const unsigned int *)key, (const unsigned int *)nonce);

    // Print the encrypted output
    printf("Encrypted output:\n");
    for (int i = 0; i < sizeof(out); i++) {
        printf("%02x", out[i]);
        if ((i + 1) % 16 == 0) printf("\n");
    }

    return 0;
}

我尝试像这样构建它:

cl /I <path-to-openssl>\openssl-openssl-3.0.15\include linktest.c /link /LIBPATH:<path-to-openssl>\openssl-openssl-3.0.15 libcrypto_static.lib

这有效。

这不:

cl /I <path-to-openssl>\openssl-openssl-3.0.15\include linktest.c /link /LIBPATH:<path-to-openssl>\openssl-openssl-3.0.15 libcrypto.lib

编译器这样说:

linktest.obj : error LNK2019: unresolved external symbol ChaCha20_ctr32 referenced in function main
linktest.exe : fatal error LNK1120: 1 unresolved externals
c dll openssl shared-libraries unresolved-external
1个回答
0
投票

我在Windows上配置并构建了openssl 3.0.15,并且运行良好。

您是否执行了

nmake install
步骤?或者您是否直接根据 OpenSSL 源目录中的标头构建应用程序?

您将

crypto/chacha.h
头文件包含在 OpenSSL 公共标头中,该文件不会通过
nmake install
安装。该头文件完全是 OpenSSL 的内部文件,不构成 OpenSSL 公共 API 的一部分。您不应该使用其中包含的任何符号 - 并且这些符号都没有记录在公共文档中。

静态链接时它恰好可以工作,因为这些内部符号存在于静态库中。但它们不是由 dll 导出的 - 这就是您遇到问题的原因。

为了使用 ChaCha20 算法,您应该使用

EVP_Encrypt*
EVP_Decrypt*
API:

https://docs.openssl.org/master/man3/EVP_EncryptInit/

另请参阅:

https://docs.openssl.org/master/man7/EVP_CIPHER-CHACHA/

这里有演示代码:

https://github.com/openssl/openssl/blob/master/demos/cipher/ariacbc.c

该演示适用于“ARIA-256-CBC”,但您可以简单地将其替换为“ChaCha20”

© www.soinside.com 2019 - 2024. All rights reserved.