当前位置: 首页 > news >正文

Linux下加载可执行文件所在目录下的so的方法

Linux下默认并不会像Windows那样加载可执行文件所在目录下的so,但是其实是提供了这个功能的,可以通过以下几种方式开启这个功能

1、ld链接时使用-rpath '$ORIGIN',gcc/g++链接时使用-Wl,-rpath,'$ORIGIN':

gcc -o myprogram myprogram.c -L. -lexample -Wl,-rpath,'$ORIGIN'

如果需要放在特定目录(比如bin下的可执行文件要加载lib下的so):

gcc -o myprogram myprogram.c -L. -lexample -Wl,-rpath,'$ORIGIN/../lib'

修改既有可执行文件(patchelf为第三方工具):

patchelf --set-rpath '$ORIGIN' myprogram

要注意这种方法只能作用于当前可执行文件搜索依赖的so,不能用于下一级的so搜索依赖的so

2、使用shell脚本加载器,并使用LD_LIBRARY_PATH环境变量指定搜索路径:

LD_LIBRARY_PATH='$ORIGIN' ./myprogram

或者:

export LD_LIBRARY_PATH='$ORIGIN'
./myprogram

要注意这种方法将作用于所有读到该环境变量的程序以及子级的so搜索依赖的so,特别是可能会影响子进程

3、使用shell脚本加载器,并使用ld.so的--library-path指定搜索路径

/lib64/ld-linux-x86-64.so.2 --library-path '$ORIGIN' ./program

要注意这种方法将作用于该程序以及子级so的搜索依赖的so,但不会影响子进程

这个方法的另一个好处就是可以将ld.so也集成进软件包中

http://www.xdnf.cn/news/41941.html

相关文章:

  • 实操基于MCP驱动的 Agentic RAG:智能调度向量召回或者网络检索
  • 从零开始详细讲解 Boost.Asio
  • Vue3集成Element Plus完整指南:从安装到主题定制上
  • 【Elasticsearch入门到落地】11、RestClient初始化索引库
  • 深入理解Java包装类:自动装箱拆箱与缓存池机制
  • Ubuntu 22.04 更换 Nvidia 显卡后启动无法进入桌面问题的解决
  • [密码学实战]密码服务平台部署架构详解与学习路线
  • C语言 —— 铭纹织构未诞之镜 - 预处理详解
  • 03【变量观】`let`, `mut` 与 Shadowing:理解 Rust 的变量绑定哲学
  • 人机共跑,马拉松人型机器人同跑
  • [FPGA]设计一个DDS信号发生器
  • 2025第十六届蓝桥杯python B组满分题解(详细)
  • 如何在 Ubuntu 上安装 Apache CouchDB ?
  • 【C++ 程序设计】实战:C++ 实践练习题(31~40)
  • Vue3 + TypeScript,使用祖先传后代模式重构父传子模式
  • Redis日常学习(一)
  • 基于Django的AI客服租车分析系统
  • QT6 源(37):界面组件的总基类 QWidget 的源码阅读(下,c++ 代码部分)
  • TDengine 整体构架
  • AI Agent破局:智能化与生态系统标准化的颠覆性融合!
  • 分布自定义shell脚本(详写)附带全代码
  • BT1120 BT656驱动相关代码示例
  • DNS主从同步
  • FFUF指南
  • 高速系统设计简介
  • dac直通线还是aoc直通线? sfp使用
  • -SSRF 服务端请求Gopher 伪协议无回显利用黑白盒挖掘业务功能点
  • UE Datasmith资源导入导出
  • BT-Basic函数之首字母XY
  • 4. 话题通信 ---- 发布方和订阅方cpp文件编写