openssl 动态库 libcrypto.so 中的 sm2_decrypt sm2_encrypt 是怎么变成内部函数的
看了多篇博文,里面均提到 sm2_encrypt 相关函数是内部函数,一直想知道它为什么是内部函数,就做了一番研究。又发现了一个知识盲点 gnu ld 的参数 --version-script
通过查看 openssl 源码,发现 crypto/sm2/ 目录下实现了 sm2_decrypt, sm2_encrypt 函数,于是快乐的编写了调用程序,由于这两个函数的声明不在 include/openssl ,而是在 include/crypto 目录下。编写时头文件写成 #include "crypto/sm2.h"
。
#include "crypto/sm2.h"
#include "openssl/ec.h"
int main(){const EC_KEY *key;const EVP_MD *digest;const uint8_t *msg;size_t msg_len;uint8_t *ciphertext_buf;size_t *ciphertext_len;sm2_encrypt(key,digest,msg,msg_len,ciphertext_buf, ciphertext_len);
}
执行编译,显示 undefined 错误
gcc -I./include -L. -lcrypto test.c -o test
/usr/bin/ld: /tmp/ccbMtaQl.o: in function `main':
test.c:(.text+0x2e): undefined reference to `sm2_encrypt'
collect2: error: ld returned 1 exit status
试试静态库
gcc -I./include libcrypto.a -ldl -pthread test.c -o test
# 静态库编译成功
# 新加的 dl,pthread 是 libcrypto.a 依赖的
为什么会这样呢,难道 sm2 相关目标文件没有编到动态库里面吗?通过下面的命令看看
$nm libcrypto.so | grep sm2_encrypt
00000000001ecae0 t pkey_sm2_encrypt
00000000001eb670 t sm2_encrypt
说明 so 库里面是有 sm2_encrypt 的。
那为什么会 undefined
呢?后来通过查看 makefile
文件发现其编译选项中有句 Wl,--version-script=libcrypto.map
, 研究一番发现 version script
脚本可以控制动态库导出的符号。这才找到调用 libcrypto.so 时 sm2 函数 undefined
的原因。
openssl 动态库 libcrypto.so 中的 sm2_decrypt sm2_encrypt 是怎么变成内部函数的相关推荐
- 【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )
文章目录 I . 动态库 与 静态库 II . 编译动态库 III. Android Studio 使用第三方动态库 IV . Android Studio 关键代码 V . 博客资源 I . 动态库 ...
- 解决引用openssl静态库libcrypto.a和libssl.a出现undefined reference to错误的问题
解决引用openssl静态库libcrypto.a和libssl.a出现undefined reference to错误的问题 最近在做使用openssl链接http和https的项目,编译时出现以下 ...
- 【Android 逆向】x86 汇编 ( 使用 IDA 解析 x86 架构的动态库文件 | 使用 IDA 打开动态库文件 | IDA 中查找指定的方法 )
文章目录 一.使用 IDA 打开动态库文件 二.IDA 中查找指定的方法 一.使用 IDA 打开动态库文件 分析 Android SDK 中的 x86 架构的动态库 , 动态库位置 : D:\001_ ...
- 【经验分享】linux交叉编译 - openssl动态库
一.准备工作 1.到openssl官网下载最新版本openssl(如openssl-1.1.1d.tar.gz),上传到linux编译机上(如上传到目录/home/test下),并使用tar -xvf ...
- 【Android 安全】DEX 加密 ( 代理 Application 开发 | 项目中配置 OpenSSL 开源库 | 使用 OpenSSL 开源库解密 dex 文件 )
文章目录 一.项目中配置 OpenSSL 开源库 二.OpenSSL 开源库解密参考代码 三.解密 dex 文件的 Java 代码 四.解密 dex 文件的 Jni 代码 参考博客 : [Androi ...
- Linux中gcc的编译、静态库和动态库的制作
欢迎大家关注笔者,你的关注是我持续更博的最大动力 Linux中gcc的编译.静态库.动态库 文章目录: 1 gcc的编译过程 1.1 gcc的编译过程 1.2 gcc的常用参数 2 gcc 静态库的制 ...
- 【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 使用 IDA 打开 arm 动态库文件 | 切换 IDA 中汇编代码显示样式 )
文章目录 一.使用 IDA 打开 arm 动态库文件 二.切换 IDA 中汇编代码显示样式 一.使用 IDA 打开 arm 动态库文件 分析 Android SDK 中的 arm 架构的动态库 , 动 ...
- 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )
文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.配置 CMakeLists.txt 构建脚本 1.导入动态库 2.导入头文件 三.完整 CMakeLists ...
- QT中引用动态库(.so) 和 静态库 (.a)
1 增加动态库 pro文件中LIBS一行中添加 如新增libvlc.so LIBS += -L/usr/local/lib -lvlc 其中/usr/local/lib为libvlc.so所处的绝对路 ...
最新文章
- 12.super关键字
- 【Maven】CentOS7使用Nexus3搭建maven私服
- 增量更新同步_干货 | Debezium实现Mysql到Elasticsearch高效实时同步
- VBA_输出SQL查询数据
- linux php添加mysql扩展模块_linux下为php添加扩展库的方法
- 用R语言绘制动态地图,代码奉上!(REmap包详解)
- 一位寒门博士的致谢,女友回复...
- Atitit 运维之道 v2 s09.docx Atitit 运维之道 目录 1. 概念	2 1.1. devops算是最低门槛了。什么运维平台,搞来搞去也就那些东西。无外乎cmdb、部署、监
- mysql 针对table的查看命令行
- java连接oracle jdbc连接
- 编程语言大牛王垠的过去和现状
- P1338 末日的传说(C++_数论_递推)
- 智能风控模型之数据源类型
- html怎么引用网页链接,网页中各种链接引用方法小结
- 单片机--串口通信---11
- UVA1593 代码对齐 输入输出控制
- 作为一个码工,意外走入了一个充满PM的会议室
- 抖音巨量引擎1 创建广告计划
- 复合效应 达伦哈迪_帕特里克·麦克哈迪(Patrick McHardy)和版权暴利
- Win10能联网,但右下角网络图标变成小地球,显示无Internet连接的解决办法