zoukankan      html  css  js  c++  java
  • linux链接库的理解

    前段时间遇到个奇怪的问题,经调试是由于可执行程序A编译时使用的libssl.so.1.1及对应版本头文件,A链接的库libtest.so编译时使用的libssl.so.1.0及对应版本头文件,执行时libtest.so调用的时libssl.so.1.1中的函数,由于openssll1.1和openssl1.0差别较大,部分头文件结构有变化,就导致libtest.so调用接口报错,经测试有以下结论:

    函数优先级:假如程序A、静态库libtest.a、动态库libtestb.so、libtestc.so中都含有函数test()。

    编译程序A时链接了这几个库,编译不报错,则真正执行时执行程序A中的test函数,其它忽略。
    经测试:
    程序A > 静态库 > 动态库。

    动态库之间优先级:
    ldd 查看,在上面的执行,下面的忽略。或者编译时在前的执行,后面的忽略。

    经查看编译链接原理,程序中函数是在编译阶段完成,静态库是在链接阶段完成,动态库是在运行时才加载链接的;
    而程序运行时发现没有的函数符号才会去动态库查找,若果相应函数已经存在则不再去动态库加载。即遵循谁先别执行程序找到运行谁的原则。

  • 相关阅读:
    JSON
    在ubuntu上部署Django
    Django安装
    Python3 编程第一步
    Python3 字典
    nginx 服务器下载安装配置详解
    彻底删除Navicat注册表
    JS 对输入的姓名 手机号码 邮箱做校验
    mysql 启动报错
    网线没问题 没法上网
  • 原文地址:https://www.cnblogs.com/wangliangblog/p/9188394.html
Copyright © 2011-2022 走看看