【问题标题】:Unable to compile a c application that reads smartcard无法编译读取智能卡的 c 应用程序
【发布时间】:2014-07-30 22:34:36
【问题描述】:

我正在尝试编译一个示例 c 应用程序,它使用 pkcs#11 来查找所有 令牌上的私钥,并打印其标签和 ID,但出现以下错误

/tmp/ccAqQ7UI.o: In function initialize':
pkcs11_example1.c:(.text+0x8e5): undefined reference to C_Initialize'
/tmp/ccAqQ7UI.o: In function `get_slot':

例子取自here

使用以下命令编译;

 `gcc pkcs11_example1.c -o slots -L /usr/lib/opensc-pkcs11.so`

我不确定应该在 -L 之后链接哪个库。 任何人都可以指导如何编译它,是否需要链接一些库。

【问题讨论】:

  • ...您是否链接了必要的库?如果没有,那将是你的问题。
  • 您应该将实际的链接命令添加到这样的问题中。但是,您在链接命令中缺少-Lpath_to_library-lnameoflibrary 或两者,或者那里的路径或库名称错误。
  • @hyde & nneonneo 我编辑了我的问题并添加了命令,但我不确定需要链接哪些库

标签: c smartcard pkcs#11 hsm opensc


【解决方案1】:

C_Initialize 和其他 60 多个带有“C_”前缀的函数是在 PKCS#11 specification 中定义的 cryptoki 函数。它们通常在 HSM 供应商提供的独立库中实现。查看您的代码示例,我会说您还需要直接链接 PKCS#11 库,或者您可以修改代码以在运行时使用 LoadLibrarydlopen 动态加载 PKCS#11 库,然后获取指向所有 cryptoki 函数的指针通过 C_GetFunctionList 调用。您还可以查看 pkcs11-logger the source code 以获取有关如何执行此操作的示例。

【讨论】:

  • “pkcs15-tool -c”和“opensc-tool”之类的命令在我的系统上运行,但我没有 HSM 供应商提供的任何独立库。我正在使用“gcc pkcs11_example1.c -o slot -L /usr/lib/opensc-pkcs11.so”编译代码。我是否需要一些额外的库,或者我已经拥有它们,正如我之前提到的,我的系统正在识别 pkcs 命令。 p.s 操作系统是 Linux。
  • @user3591981 好的,我明白了。您的 PKCS#11 库 opensc-pkcs11.so 仅导出 C_GetFunctionList PKCS#11 函数,该函数提供指向所有其他 PKCS#11 函数的指针。请参阅我的previous answer about this topic,因为它完全适用于您的问题。
  • 我简化了代码,现在只是尝试按照您的原始答案stackoverflow.com/a/22769105/3325704library 进行初始化,但是当我尝试编译gcc -g -Wall -L /usr/lib/pkcs11/opensc-pkcs11.so pkcs11_hello.c -o hello 时,它给出了pkcs11_hello.c:33: undefined reference to C_GetFunctionList' collect2: ld 返回 1 退出状态`。当我 nm /usr/lib/pkcs11/opensc-pkcs11.so 它说没有符号时,我在 pkcs11.h 中看不到任何 C_GetFunctionList。如果可能的话,我如何将我的代码、opensc-pkcs11.so 和 pkcs11.h 发送给您进行审核。
【解决方案2】:

你给出的链接命令gcc pkcs11_example1.c -o slots -L /usr/lib/opensc-pkcs11.so是错误的。

  • -L 只接受路径,该路径被添加到从中搜索库的路径中,但 /usr/lib 是默认设置,因此您根本不需要此开关。

  • 您缺少-l,它采用不带lib 前缀或.so 后缀的库名称,所以看起来您需要-lopensc-pkcs11

所以,首先确保您的库文件确实是/usr/lib/libopensc-pkcs11.so(注意lib 前缀!)可能后面有版本号。然后更改构建选项,使链接命令变为

gcc pkcs11_example1.c -o slots -lopensc-pkcs11

【讨论】:

  • 在其他答案的 cmets 中,您谈论不同的路径,因此您可能需要 -L /usr/lib/pkcs11
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 2021-12-31
相关资源
最近更新 更多