Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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 编译OpenSSL引擎(.so)无法加载未定义的符号_C_Linker_Openssl_Shared Libraries - Fatal编程技术网

C 编译OpenSSL引擎(.so)无法加载未定义的符号

C 编译OpenSSL引擎(.so)无法加载未定义的符号,c,linker,openssl,shared-libraries,C,Linker,Openssl,Shared Libraries,我正在编译以下OpenSSL引擎,来自Atmel,用于ARM平台 代码使用OpenSSL代码库中的“eckey\u asn1\u meth”: git grep "eckey_asn1_meth" engine_meth/eccx08_ameth.c: extern const EVP_PKEY_ASN1_METHOD eckey_asn1_meth; engine_meth/eccx08_ameth.c: eccx08_pkey_asn1_meth.pub_encode = eck

我正在编译以下OpenSSL引擎,来自Atmel,用于ARM平台

代码使用OpenSSL代码库中的“eckey\u asn1\u meth”:

git grep "eckey_asn1_meth"
engine_meth/eccx08_ameth.c:    extern const EVP_PKEY_ASN1_METHOD eckey_asn1_meth;
engine_meth/eccx08_ameth.c:    eccx08_pkey_asn1_meth.pub_encode = eckey_asn1_meth.pub_encode;
engine_meth/eccx08_ameth.c:    eccx08_pkey_asn1_meth.pub_decode = eckey_asn1_meth.pub_decode;
engine_meth/eccx08_ameth.c:    eccx08_pkey_asn1_meth.pub_cmp = eckey_asn1_meth.pub_cmp;
engine_meth/eccx08_ameth.c:    eccx08_pkey_asn1_meth.pub_print = eckey_asn1_meth.pub_print;
engine_meth/eccx08_ameth.c:    eccx08_pkey_asn1_meth.priv_decode = eckey_asn1_meth.priv_decode;
engine_meth/eccx08_ameth.c:    eccx08_pkey_asn1_meth.priv_encode = eckey_asn1_meth.priv_encode;
engine_meth/eccx08_ameth.c:    eccx08_pkey_asn1_meth.priv_print = eckey_asn1_meth.priv_print;
engine_meth/eccx08_ameth.c:    eccx08_pkey_asn1_meth.pkey_size = eckey_asn1_meth.pkey_size;
engine_meth/eccx08_ameth.c:    eccx08_pkey_asn1_meth.pkey_bits = eckey_asn1_meth.pkey_bits;
engine_meth/eccx08_ameth.c:    eccx08_pkey_asn1_meth.pkey_security_bits = eckey_asn1_meth.pkey_security_bits;
engine_meth/eccx08_ameth.c:    eccx08_pkey_asn1_meth.param_decode = eckey_asn1_meth.param_decode;
engine_meth/eccx08_ameth.c:    eccx08_pkey_asn1_meth.param_encode = eckey_asn1_meth.param_encode;
engine_meth/eccx08_ameth.c:    eccx08_pkey_asn1_meth.param_missing = eckey_asn1_meth.param_missing;
engine_meth/eccx08_ameth.c:    eccx08_pkey_asn1_meth.param_copy = eckey_asn1_meth.param_copy;
engine_meth/eccx08_ameth.c:    eccx08_pkey_asn1_meth.param_cmp = eckey_asn1_meth.param_cmp;
engine_meth/eccx08_ameth.c:    eccx08_pkey_asn1_meth.param_print = eckey_asn1_meth.param_print;
engine_meth/eccx08_ameth.c:    eccx08_pkey_asn1_meth.sig_print = eckey_asn1_meth.sig_print;
engine_meth/eccx08_ameth.c:    eccx08_pkey_asn1_meth.pkey_ctrl = eckey_asn1_meth.pkey_ctrl;
engine_meth/eccx08_ameth.c:    eccx08_pkey_asn1_meth.old_priv_decode = eckey_asn1_meth.old_priv_decode;
engine_meth/eccx08_ameth.c:    eccx08_pkey_asn1_meth.old_priv_encode = eckey_asn1_meth.old_priv_encode;
这在OpenSSL代码中定义:

crypto/ec/ec_ameth.c:const EVP_PKEY_ASN1_METHOD eckey_asn1_meth = {
现在,这是编译.so(OpenSSL引擎)的Makefile行,我不完全理解:

LINK_SO=        \
   $(LD) -r -o $(LIBNAME).o $$ALLSYMSFLAGS $(LIB) $(LIBAMETH) && \
   ($(NM) -Pg $(LIBNAME).o | grep ' [BDT] ' | cut -f1 -d' ' > $(LIBNAME).exp; \
    $$SHAREDCMD $$SHAREDFLAGS -o $(SHLIB) $(LIBNAME).o $(LDFLAGS) -L ../install_dir/lib -lcrypto -lssl -lc \
    -Lengine_meth -Lcryptoauthlib/lib -leccx08_meth -lcryptoauth -lm -lrt)
这将生成共享库:

file libateccx08.so
libateccx08.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=84875c59aecd0c53aaaac8aad84d6899441098c4, not stripped
但是,当我尝试在目标上加载引擎时,它失败了:

openssl engine -t dynamic -pre SO_PATH:/usr/lib/libateccx08.so -pre ID:atmel -pre LIST_ADD:1 -pre LOAD
(dynamic) Dynamic engine loading support
[Success]: SO_PATH:/usr/lib/libateccx08.so
[Success]: ID:atmel
[Success]: LIST_ADD:1
[Failure]: LOAD
1995961552:error:25066067:DSO support routines:DLFCN_LOAD:could not load the shared library:dso_dlfcn.c:187:filename(/usr/lib/libateccx08.so): /usr/lib/libateccx08.so: undefined symbol: eckey_asn1_meth
1995961552:error:25070067:DSO support routines:DSO_load:could not load the shared library:dso_lib.c:233:
1995961552:error:260B6084:engine routines:DYNAMIC_LOAD:dso not found:eng_dyn.c:467:
     [ unavailable ]
对于OpenSSL引擎,.so中不存在未定义的符号。nm表示未知(U):

但是,objdump显示.so对于OpenSSL引擎需要libcrypto:

objdump -p libateccx08.so

libateccx08.so:     file format elf32-little

Program Header:
    LOAD off    0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**16
         filesz 0x00020e50 memsz 0x00020e50 flags r-x
    LOAD off    0x00021000 vaddr 0x00031000 paddr 0x00031000 align 2**16
         filesz 0x0000119a memsz 0x00001e64 flags rw-
 DYNAMIC off    0x00021144 vaddr 0x00031144 paddr 0x00031144 align 2**2
         filesz 0x000000f0 memsz 0x000000f0 flags rw-
    NOTE off    0x000000d4 vaddr 0x000000d4 paddr 0x000000d4 align 2**2
         filesz 0x00000024 memsz 0x00000024 flags r--
   STACK off    0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**4
         filesz 0x00000000 memsz 0x00000000 flags rw-

Dynamic Section:
  NEEDED               libcrypto.so.1.0.0
  NEEDED               libc.so.6
  SONAME               libateccx08.so
  INIT                 0x00005c0c
  FINI                 0x0001ed58
  INIT_ARRAY           0x00031000
  INIT_ARRAYSZ         0x00000004
  FINI_ARRAY           0x00031004
  FINI_ARRAYSZ         0x00000004
  GNU_HASH             0x000000f8
  STRTAB               0x00002d14
  SYMTAB               0x000010c4
  STRSZ                0x00001e3c
  SYMENT               0x00000010
  PLTGOT               0x00031234
  PLTRELSZ             0x00000a18
  PLTREL               0x00000011
  JMPREL               0x000051f4
  REL                  0x00004f1c
  RELSZ                0x000002d8
  RELENT               0x00000008
  VERNEED              0x00004edc
  VERNEEDNUM           0x00000002
  VERSYM               0x00004b50
  RELCOUNT             0x00000022

Version References:
  required from libc.so.6:
    0x0d696914 0x00 03 GLIBC_2.4
  required from libcrypto.so.1.0.0:
    0x06a2b2e4 0x00 02 OPENSSL_1.0.2d
libcrypto共享库中确实包含符号eckey_asn1_meth:

nm libcrypto.so | grep eckey_asn1_meth
001642ac d eckey_asn1_meth
如果libcrypto.so中有未知符号,为什么在运行时会失败?是否有一种方法可以生成。因此,对于OpenSSL引擎,可以包含符号,并从nm输出中消除“U”?
是否有其他方法可以做到这一点?

确保目标上的libcrypto.so文件具有预期的后缀,即“.1.0.0”:libcrypto.so.1.0.0,确保所有相关的ELF/so文件在预授权中为用户启用了exec位。尝试在strace下运行以查看它尝试加载的DSO,尝试导出LD_LIBRARY_PATH,尝试使用PATH/filename/symlinks…目标具有正确的后缀:“/usr/lib/libcrypto.so.1.0.0”,以及两者。因此启用exec位。。。我会尽量避开的,谢谢你的建议。导出LD\u LIBRARY\u路径无效。引擎确实不应该使用
eckey\u asn1\u meth
。它是一个私有符号,不会导出到任何OpenSSL头文件中。@MattCaswell是的,我知道。事实上,为了能够编译它,我不得不对我的工具链做一些肮脏的变通。。。。但是,github中的项目仍在编译(它将OpenSSL作为子模块下载,并使用内部构件对其进行编译),我认为Atmel人员能够以某种方式使其运行并测试它。。。所以应该有一种方法。确保目标上的libcrypto.So文件具有预期的后缀,即“.1.0.0”:libcrypto.So.1.0.0,确保所有相关ELF/So文件在预授权中为用户启用了exec位。尝试在strace下运行以查看它尝试加载的DSO,尝试导出LD_LIBRARY_PATH,尝试使用PATH/filename/symlinks…目标具有正确的后缀:“/usr/lib/libcrypto.so.1.0.0”,以及两者。因此启用exec位。。。我会尽量避开的,谢谢你的建议。导出LD\u LIBRARY\u路径无效。引擎确实不应该使用
eckey\u asn1\u meth
。它是一个私有符号,不会导出到任何OpenSSL头文件中。@MattCaswell是的,我知道。事实上,为了能够编译它,我不得不对我的工具链做一些肮脏的变通。。。。但是,github中的项目仍在编译(它将OpenSSL作为子模块下载,并使用内部构件对其进行编译),我认为Atmel人员能够以某种方式使其运行并测试它。。。所以应该有办法。
nm libcrypto.so | grep eckey_asn1_meth
001642ac d eckey_asn1_meth