专栏首页一个程序员的修炼之路链接选项rpath,容易被忽略的一个功能

链接选项rpath,容易被忽略的一个功能

问题来源

最近在做一个项目的客户端的SDK,实现为一个动态链接库,其依赖于其他的若干个动态库文件。那么在利用SDK开发应用程序的时候,编译的时候除了链接SDK库本身,还得链接SDK库所依赖的库,这样编译命令里面得一一的添加这些库。

比如,SDK库的名称为liba.so, 其依赖于libb.so和libc.so,那么在编译应用程序的时候使用以下命令:

+++++++++++++++++++++++++++++++++++++++++++++

gcc -o test test.c -I. -L. -la -lb -lc

+++++++++++++++++++++++++++++++++++++++++++++

但是如果将SDK库即liba.so交给其他的开发人员,其他的开发人员可不想编译的时候,显示的链接liba.so所依赖的库。他们更愿意编译的时候,只显示地链接liba.so。

那么该怎么做呢?利用rpath这个链接选项!

解决方法

首先来man ld,查找链接选项rpath的含义:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

-rpath dir Add a directory to the runtime library search path. This is used when linking an ELF executable with shared objects. All -rpath arguments are concatenated and passed to the runtime linker, which uses them to locate shared objects at runtime. The -rpath option is also used when locating shared objects which are needed by shared objects explicitly included in the link; see the description of the -rpath-link option. If -rpath is not used when linking an ELF executable, the contents of the environ- ment variable "LD_RUN_PATH" will be used if it is defined.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

简单翻译下, rpath链接选项主要有两个功能:

(1)程序运行时,优先到rpath指定的目录去寻找依赖库

(2)程序链接时,在指定的目录中,隐式的链接那些动态库所需要的链接库。

往往我们都熟知第一个功能,忽略第二个功能。而第二个功能正是现在所需要的。

我们将liba.so,libb.so 和 libc.so拷贝的同一个目录中,然后利用rpath链接应用程序,这样编译便不需要显示的去链接liba.so所依赖的库了。

+++++++++++++++++++++++++++++++++++++++++++++

gcc -o test test.c -I. -L. -la -Wl,-rpath=.

+++++++++++++++++++++++++++++++++++++++++++++

本文分享自微信公众号 - 一个程序员的修炼之路(CoderStudyShare),作者:iceking

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-07-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 翻译 | Linux利用动态链接共享对象库提权

    Linux利用动态链接共享对象库提权 RPATH和弱文件权限会导致系统的损害。Linux应用程序可以利用动态链接的共享对象库(我们从现在开始称它们为共享库)来提...

    安恒网络空间安全讲武堂
  • Linux命令(65)——ld命令

    ld命令是二进制工具集GNU Binutils的一员,是GNU链接器,用于将目标文件与库链接为可执行程序或库文件。

    Dabelv
  • 详解共享库的动态加载

    这边文章不是一个如何引导,尽管它确实展示了如何编译和调试共享库和可执行文件。为了解动态加载的内部工作方式进行了优化。写这篇文章是为了消除我在该主题上的知识欠缺,...

    后场技术
  • centos7下安装 python2.7

    为了测试 mesos,搞了一个 centos7.1,使用最小化安装,然后自己安装了 net-tools,“开发工具”集。后来想装一下 DCOS Cli工具,结...

    py3study
  • MacOS平台下@rpath在动态链接库中的应用

    一、背景介绍       公司开发的一个底层库被用在了Mac平台的多个产品中。在开发这个底层库的初期,对于Mac OSX下的Install name 并没有过多...

    24K纯开源
  • Qt for iOS 应用使用自定义动态库 Framework

    本文内容适合当你想使用 Qt 调用 xcode 开发的动态库 framework 做 iOS 应用的场景,文中涉及到原始动态库 framework 文件的配置,...

    我与梦想有个约会
  • XCode日常使用备忘录

    0. Introduction        XCode是macOS上开发app不可缺少的开发者工具,不管是开发macOS上的应用,还是iOS上的应用,都离不开...

    24K纯开源
  • CMake和静态库顺序

    C/C++程序的许多同学被静态库的依赖折腾,因为默认情况下要求被依赖的库放在依赖它的库后面,当一个程序或共享库依赖的静态库较多时,可能会陷入解决链接问题的坑...

    一见
  • cargo manifest规则使用介绍

    Cargo 是一个工具,允许 Rust 项目声明其各种依赖项,并确保您始终获得可重复的构建。

    李小白是一只喵
  • Libc Realpath缓冲区下溢漏洞分析

    2018年1月11日由Jakub Wilk发现并公布该漏洞,CVE编号为CVE-2018- 1000001,利用该漏洞可以实现Linux系统本地提权。

    De4dCr0w
  • Linux下so动态库一些不为人知的秘密

    Linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名。二者都使用广泛。本文主要讲动态库方面知识。

    刘盼
  • Linux编译相关命令

    生成.o文件,对代码文件进行预处理、编译和汇编,相当于windows下生成目标文件obj

    知忆
  • C++协程库与嵌入V8的兼容性问题

    C++ 中使用了部门自研的有一定历史的 RPC 框架,所绑定的协程库是 GNU pth。

    h46incon
  • FFMPEG 配置选项详细说明

    使用以下任何一个开关将允许FFmpeg链接到 相应的外部库。所有组件都依赖于该库 如果所有其他依赖项都得到满足而未满足,则将启用 明确禁...

    程序手艺人
  • 小心两个共享库共用同一个静态库

    小心两个共享库共用同一个静态库.pdf 注:以下内容仅针对Linux/GCC环境,不涵盖Windows,包括Cygwin环境。 下载测试代码:

    一见
  • nginx安装lua-nginx-module模块

    转载注明地址:http://www.cnblogs.com/dongxiao-yang/p/5312285.html

    sanmutongzi
  • 链接两个"名字完全一样"的【动态库】,你会怎么处理?

    在Linux应用的开发过程中,直接利用现成的第三方库(俗称:轮子)来完成自己的业务功能,是很常见的事情。

    IOT物联网小镇
  • 让终端支持https,移植OpenSSL和libcurl到嵌入式linux,遇到的问题总结

    从官网下载openssl源码和 libcurl源码。OpenSSL顺利交叉编译通过。

    杨永贞
  • Linux共享库、静态库、动态库详解

    使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码...

    sunsky

扫码关注云+社区

领取腾讯云代金券