首页 > 其他分享 >动态库链接和加载时的路径搜索优先级

动态库链接和加载时的路径搜索优先级

时间:2024-07-15 11:10:31浏览次数:8  
标签:优先级 路径 搜索 libs 动态 链接 加载

目录

前言

在开发一个新项目时遇到了动态库加载异常的问题,因此在这里记录一下动态库的链接和加载过程中库路径的搜索优先级的相关知识。

动态库的链接

现在有一个main.o可重定位目标文件,其中需要用到开源库log4cpp。在链接的时候,我们可以这样链接:

g++ main.o -o a.out -L/path/to/libs -llog4cpp

其中:

  • -L/path/to/libs表示链接器去哪个目录下查找库文件。
    编译时库搜索优先级:-L指定的路径> LIBRARY_PATH>默认库路径

  • -llog4cpp表示要链接的库,在链接阶段,链接器一般会按照搜索优先级,从库路径中查找名为liblog4cpp.soliblog4cpp.a的文件进行链接。若不特殊说明,默认优先链接动态库。

动态库的加载

在程序开始运行前的加载阶段,动态链接器会读取可执行文件,查找并加载所有必须的动态库。注意此时的搜索路径并不包含/path/to/libs,因为它只作用于链接阶段。链接器搜索的路径有:LD_LIBRARY_PATH环境变量,/etc/ld.so.cache文件,默认库路径(/usr/lib,/lib等)。

如果需要从指定的路径加载动态库,则可以使用下述方法:

  • 手动设置LD_LIBRARY_PATH环境变量:在程序运行前设置环境变量,指定动态库的搜索路径:
    export LD_LIBRARY_PATH=/path/to/runtime_libs:$LD_LIBRARY_PATH
    
    注意,此方法设置环境变量是临时的,一旦终端关闭设置就会失效。若想使其持久化,需要特殊设置,方法包括但不限于:修改.bashrc文件,修改rc.loacl文件。
  • 修改/etc/ld.so.conf/etc/ld.so.conf.d/*配置:
    这些文件提供了系统级别的库搜索路径。系统管理员可以在这些文件中定义默认的库搜索路径,这些设置对所有用户和应用程序都有效。
  • 在链接阶段使用-rpath:
    在链接阶段,设置RPATH或RUNPATH,将库路径硬编码到可执行文件中
    g++ main.o -o a.out -L/path/to/libs -llog4cpp -Wl,-rpath,/path/to/runtime_libs
    
    注意若可执行文件中同时包含RPATH和RUNPATH,那么RPATH将会被动态链接器忽略。

共享库的搜索优先级为:
RPATH>LD_LIBRARY_PATH>RUNPATH>/etc/ld.so.conf/etc/ld.so.conf.d/*>默认库路径

标签:优先级,路径,搜索,libs,动态,链接,加载
From: https://www.cnblogs.com/paw5zx/p/18302745

相关文章

  • Webpack 代码分割和懒加载技术
    在现代前端开发中,优化应用性能是一个至关重要的任务。Webpack作为一个强大的打包工具,为我们提供了代码分割和懒加载的功能,可以显著提升应用的加载速度和用户体验。本文将深入解析Webpack的代码分割和懒加载技术,帮助开发者更好地理解和应用这些技术。什么是代码分割?代码分割(Co......
  • 免费五大图床高速CDN、稳定、体验、加载速度、值得长期使用
    首要,让咱们深化了解一下那些由热心人士建立并同享出来的免费图床。这类图床通常是依据Chevereto或imgurl等渠道构建而成。Chevereto类型的图床,其显著特点之一就是大部分都需求用户进行注册。注册完成后,您会惊喜地发现,它能够为您回来丰厚多样的图片链接格式。不仅如此,此......
  • 如何理解electron 的预加载脚本
    在Electron应用中,预加载脚本(PreloadScript)是一个非常重要的概念,它允许你在渲染进程(web页面)和主进程之间创建一个安全的桥梁。预加载脚本运行在Node.js环境中,但位于渲染进程的一个单独的上下文中,这意味着它可以访问Node.js的API,但无法直接访问DOM。这种设计使得预......
  • Linux驱动加载源码分析(安全加载 、签名、校验)
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。环境说明  无前言  很久很久以前,在android上面移植linux驱动的时候,由于一些条件限制,导致我们测试驱动非常的麻烦。其中有一个麻烦就是驱动校验失败,然后内核拒......
  • CloudMounter for mac(云盘本地加载工具)v4.7版
    CloudMountermac版是Macos上一款云盘本地加载工具,CloudMountermac下载用于将云存储和Web服务器作为本地磁盘安装到Mac。CloudMounterformac通过让您在舒适的Finder中与云和远程服务器进行通信,使得与远程主机一起工作就像数据存储在您的计算机上一样简单。CloudMounterfor......
  • 添加友情链接~
    本文介绍下友情链接‍什么是友情链接引自百度百科:友情链接也称为友链、交换链接、互惠链接、互换链接等,是具有一定互补优势的网站之间的简单合作形式,即分别在自己的网站上放置对方网站的LOGO或网站名称并设置对方网站的超级链接,使得用户可以从合作网站中发现自己的网站,达到互......
  • electron loadURL加载http协议(或内网)环境下使用navigator.mediaDevices.getUserMedi
    场景我使用的electron27版本。众所周知,navigator.mediaDevices.getUserMediaAPI只能在https环境下使用,在非https环境下使用时navigator.mediaDevices会返回undefined。除了例外的这几种情况。例外的几种情况在MDN安全上下文文章中进行了说明说明了。大致意思是在https,fi......
  • 前端开发-- Webpack 代码分割和懒加载技术
    在现代前端开发中,优化应用性能是一个至关重要的任务。Webpack作为一个强大的打包工具,为我们提供了代码分割和懒加载的功能,可以显著提升应用的加载速度和用户体验。本文将深入解析Webpack的代码分割和懒加载技术,帮助开发者更好地理解和应用这些技术。什么是代码分割?代码分割(Co......
  • 0179-加载全局描述符表
    环境Time2022-11-12WSL-Ubuntu22.04QEMU6.2.0NASM2.15.05前言说明参考:https://os.phil-opp.com/entering-longmode目标在之前的实模式切换到保护模式时,已经创建过全局描述符表(GDT),这里需要转为64位。在长模式下,主要应用分页技术,分段被大大削弱,我们只创建一个代码......
  • bet9链接不再对微软依赖,OpenKylin 首推AI PC 版本
    本文由 bet9链接 вт989点сс人工智慧(AI)和AIPC是最近两大热门词汇,国内的开源操作系统OpenKylin(开放麒麟)推出全新openKylinforAIPC版本。OpenKylin是一个基于Linux的开源作业系统,由OpenKylin社群维护,并得到包括Hygon和Phytium等在内的多间公司的支援。综合中......