看了多篇博文,里面均提到 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 是怎么变成内部函数的相关推荐

  1. 【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )

    文章目录 I . 动态库 与 静态库 II . 编译动态库 III. Android Studio 使用第三方动态库 IV . Android Studio 关键代码 V . 博客资源 I . 动态库 ...

  2. 解决引用openssl静态库libcrypto.a和libssl.a出现undefined reference to错误的问题

    解决引用openssl静态库libcrypto.a和libssl.a出现undefined reference to错误的问题 最近在做使用openssl链接http和https的项目,编译时出现以下 ...

  3. 【Android 逆向】x86 汇编 ( 使用 IDA 解析 x86 架构的动态库文件 | 使用 IDA 打开动态库文件 | IDA 中查找指定的方法 )

    文章目录 一.使用 IDA 打开动态库文件 二.IDA 中查找指定的方法 一.使用 IDA 打开动态库文件 分析 Android SDK 中的 x86 架构的动态库 , 动态库位置 : D:\001_ ...

  4. 【经验分享】linux交叉编译 - openssl动态库

    一.准备工作 1.到openssl官网下载最新版本openssl(如openssl-1.1.1d.tar.gz),上传到linux编译机上(如上传到目录/home/test下),并使用tar -xvf ...

  5. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 项目中配置 OpenSSL 开源库 | 使用 OpenSSL 开源库解密 dex 文件 )

    文章目录 一.项目中配置 OpenSSL 开源库 二.OpenSSL 开源库解密参考代码 三.解密 dex 文件的 Java 代码 四.解密 dex 文件的 Jni 代码 参考博客 : [Androi ...

  6. Linux中gcc的编译、静态库和动态库的制作

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 Linux中gcc的编译.静态库.动态库 文章目录: 1 gcc的编译过程 1.1 gcc的编译过程 1.2 gcc的常用参数 2 gcc 静态库的制 ...

  7. 【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 使用 IDA 打开 arm 动态库文件 | 切换 IDA 中汇编代码显示样式 )

    文章目录 一.使用 IDA 打开 arm 动态库文件 二.切换 IDA 中汇编代码显示样式 一.使用 IDA 打开 arm 动态库文件 分析 Android SDK 中的 arm 架构的动态库 , 动 ...

  8. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )

    文章目录 一.拷贝 p7zip 源码中的头文件到 Android Studio 项目中 二.配置 CMakeLists.txt 构建脚本 1.导入动态库 2.导入头文件 三.完整 CMakeLists ...

  9. QT中引用动态库(.so) 和 静态库 (.a)

    1 增加动态库 pro文件中LIBS一行中添加 如新增libvlc.so LIBS += -L/usr/local/lib -lvlc 其中/usr/local/lib为libvlc.so所处的绝对路 ...

最新文章

  1. 12.super关键字
  2. 【Maven】CentOS7使用Nexus3搭建maven私服
  3. 增量更新同步_干货 | Debezium实现Mysql到Elasticsearch高效实时同步
  4. VBA_输出SQL查询数据
  5. linux php添加mysql扩展模块_linux下为php添加扩展库的方法
  6. 用R语言绘制动态地图,代码奉上!(REmap包详解)
  7. 一位寒门博士的致谢,女友回复...
  8. Atitit 运维之道 v2 s09.docx Atitit 运维之道 目录 1. 概念 2 1.1. devops算是最低门槛了。什么运维平台,搞来搞去也就那些东西。无外乎cmdb、部署、监
  9. mysql 针对table的查看命令行
  10. java连接oracle jdbc连接
  11. 编程语言大牛王垠的过去和现状
  12. P1338 末日的传说(C++_数论_递推)
  13. 智能风控模型之数据源类型
  14. html怎么引用网页链接,网页中各种链接引用方法小结
  15. 单片机--串口通信---11
  16. UVA1593 代码对齐 输入输出控制
  17. 作为一个码工,意外走入了一个充满PM的会议室
  18. 抖音巨量引擎1 创建广告计划
  19. 复合效应 达伦哈迪_帕特里克·麦克哈迪(Patrick McHardy)和版权暴利
  20. Win10能联网,但右下角网络图标变成小地球,显示无Internet连接的解决办法

热门文章

  1. 放弃60万年薪考公!程序员完败公务员?
  2. 基于Flutter开发的App商城
  3. python牛顿法解非线性方程组_牛顿迭代法解非线性方程组(MATLAB版)
  4. windchill中获得对象的IBA属性值
  5. SQLite的FLOOR函数和POWER函数和TYPEOF函数
  6. 人生苦短,我学python-day4
  7. SAP CSO1创建BOM
  8. HNU电子电路 实验一:电子秤模拟通道电路的设计与实现
  9. 计算数字滤波器的频率响应
  10. 18500rpm小型台式冷冻高速离心机SH2160R