移植OpenSSL和libcurl到嵌入式linux,让终端支持https,遇到的问题总结

从官网下载openssl源码和 libcurl源码。OpenSSL顺利交叉编译通过。

版本:OpenSSL openssl-1.1.0c.tar.gz版本 

curl版本 curl-7.57.0.tar.gz  

tar -axvf .....

准备开始交叉编译OpenSSL
在openssl解压目录下,使用config命令
CC=arm-linux-gcc ./config no-asm shared --prefix=/home/linux/arm/openssl --openssldir=/home/linux/arm/openssl/ssl
生成了Makefile
然后就是make和make install
之后会在安装目录下生成lib文件

再编译libcurl时编译没问题,但链接时出现问题,如下:

 CCLD     curl
/home/yang/b503/ctools/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/../lib/gcc/arm-linux-gnueabihf/4.9.2/../../../../arm-linux-gnueabihf/bin/ld: warning: libssl.so.1.1, needed by ../lib/.libs/libcurl.so, not found (try using -rpath or -rpath-link)
/home/yang/b503/ctools/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/../lib/gcc/arm-linux-gnueabihf/4.9.2/../../../../arm-linux-gnueabihf/bin/ld: warning: libcrypto.so.1.1, needed by ../lib/.libs/libcurl.so, not found (try using -rpath or -rpath-link)
../lib/.libs/libcurl.so: undefined reference to `X509_EXTENSION_get_object@OPENSSL_1_1_0'
../lib/.libs/libcurl.so: undefined reference to `SHA256_Final@OPENSSL_1_1_0'
../lib/.libs/libcurl.so: undefined reference to `SSL_get_peer_cert_chain@OPENSSL_1_1_0'
../lib/.libs/libcurl.so: undefined reference to `OPENSSL_load_builtin_modules@OPENSSL_1_1_0'
../lib/.libs/libcurl.so: undefined reference to `PKCS12_parse@OPENSSL_1_1_0'
../lib/.libs/libcurl.so: undefined reference to `ASN1_TIME_print@OPENSSL_1_1_0'
../lib/.libs/libcurl.so: undefined reference to `SSL_shutdown@OPENSSL_1_1_0'

../lib/.libs/libcurl.so: undefined reference to `CONF_modules_load_file@OPENSSL_1_1_0'

但是我的configure的配置明明已经指定了OpenSSL库的位置啊,OpenSSL库也是已经编译成功了的。为什么链接时还是报找不到openssl库呢?

我的openssl库编译完成后,位置位于 /home/linux/arm/openssl/lib

我的configure配置如下:

CPPFLAGS="-I/home/linux/arm/openssl/ -I/home/linux/arm/openssl/include" LDFLAGS="-L/home/linux/arm/openssl/lib" LIBS="-ldl" ./configure --host=arm-linux CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ --with-ssl --enable-shared --enable-static --disable-dict --disable-ftp --disable-imap --disable-ldap --disable-ldaps --disable-pop3 --disable-proxy --disable-rtsp --disable-smtp --disable-telnet --disable-tftp --disable-zlib --without-ca-bundle --without-gnutls --without-libidn --without-librtmp --without-libssh2 --without-nss --without-zlib --prefix=/home/linux/arm/curl

这里 LDFLAGS="-L/home/linux/arm/openssl/lib"已经指定了的,链接查找的路径。但是就是找不到。

看了下自动生成的Makefile,没发现有什么问题,

最后打开libtool文件,发现链接查找的路径里没有这个/home/linux/arm/openssl/lib。最后干脆把OpenSSL库拷贝到工具链查找的路径下,最后链接通过了。



但是原因是什么呢?

最后,改 LIBS="-ldl -lssl -lcrypto" ,加上去了 lssl和 lcrypto,顺利编译通过。原因或许就出在这里。

添加了LDFLAGS,相当于扩展了工具链的搜索路径,但是 链接时,得指定下 链接什么,

原来的LIBS="-ldl",没有指定 链接 ssl,

是否就是这个原因引起的?欢迎指正



 编译参数 :
setarch i386 ./configure --host=arm-linux CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ CPPFLAGS="-I/home/linux/arm/openssl/ -I/home/linux/arm/openssl/include" LDFLAGS="-L/home/linux/arm/openssl/lib" LIBS="-ldl -lssl -lcrypto" --with-ssl --enable-shared --enable-static --disable-dict --disable-ftp --disable-imap --disable-ldap --disable-ldaps --disable-pop3 --disable-proxy --disable-rtsp --disable-smtp --disable-telnet --disable-tftp --disable-zlib --without-ca-bundle --without-gnutls --without-libidn --without-librtmp --without-libssh2 --without-nss --without-zlib --prefix=/home/linux/arm/curl

openssl1.1.0h 编译参数:
CC=arm-linux-gnueabihf-gcc setarch i386 ./config no-asm shared -DOPENSSL_NO_HEARTBEATS  --prefix=/home/linux/arm/openssl --openssldir=/home/linux/arm/openssl/ssl

遇到一个问题,咱还没解决,同样的测试,在电脑上OK,在ARM板子上报错,如下

curl https://xxx.xxx.xxx.xxx:xxxx-v --cacert ./UP.pem -k -H 'User-Agent: Donjin Http 0.1' -H 'Content-Type: x-ISO-TPDU/x-auth' -H 'Cache-Control: no-cache' -H 'Content-Length: 93' --data-binary @aaa.bin
* Rebuilt URL to: https://xxx.xxx.xxx.xxx
*   Trying xxx.xxx.xxx.xxx...
* TCP_NODELAY set
* Connected to xxx.xxx.xxx.xxx(140.xx.xx.xx) port xxxx (#0)
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: ./UP.pem
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* error:0306E06C:bignum routines:BN_mod_inverse:no inverse
* Closing connection 0

curl: (35) error:0306E06C:bignum routines:BN_mod_inverse:no inverse



猜你喜欢

转载自blog.csdn.net/qq8864/article/details/79985766