-rpath详解

发布时间:2023-05-20

一、什么是-rpath

-rpath是编译链接时使用的选项,指定动态链接库的搜索路径,让运行时能够找到需要的动态链接库。 在Unix/Linux系统中,一个可执行文件或者共享库,运行时需要依赖其他共享库,这些共享库都被安装到系统默认的目录中,如/lib/usr/lib等。但是有时候,我们编写的程序需要链接自己的共享库,那么程序运行时找不到这些库,就需要通过-rpath选项指定搜索路径。

gcc -o myprog myprog.c -L/mylib -lmylib
# 添加-rpath选项
gcc -o myprog myprog.c -L/mylib -lmylib -rpath=/mylib

二、-rpath的优先级

当运行时需要加载相同名称的共享库时,系统会按照一定的顺序搜索库的位置。这个顺序包括:

  1. 环境变量LD_LIBRARY_PATH指定的路径。
  2. 编译时指定的-rpath路径。
  3. 默认的标准路径,如/lib/usr/lib等系统目录。 优先级从高到低。

三、如何使用-rpath

1. 编写Makefile文件

在Makefile文件中,使用变量LDFLAGS来指定-rpath选项:

LDFLAGS = -Wl,-rpath=/usr/local/lib
# ...
$(CC) -o myprog $(OBJECTS) $(LDFLAGS) $(LIBS)

或者直接在命令行中指定:

gcc -o myprog myprog.c -L/usr/local/lib -lmylib -Wl,-rpath=/usr/local/lib

2. 使用chrpath命令

chrpath是一个命令行工具,可以用来修改可执行文件或共享库的RPATH。使用方法如下:

chrpath -r /usr/local/lib myprogram

其中myprogram表示可执行文件或共享库的名称,/usr/local/lib是要设置的RPATH路径。

四、如何查看-rpath路径

可以通过如下命令查看动态链接库的依赖关系:

ldd myprog

也可以使用objdump命令来查看可执行文件或共享库的RPATH和其他信息:

objdump -x myprog

五、-rpath的注意事项

  1. RPATH路径是相对路径还是绝对路径,会影响程序的定位。
  2. RPATH定义在可执行文件时,库的加载优先级较低,可能会受其他RPATH影响而加载错误的库。
  3. RPATH相对路径时,需要注意程序运行时的当前路径。
  4. 对于需要移植的程序,要注意跨平台的兼容性。
  5. 可以使用patchelf命令来修改可执行文件或共享库的RPATH,该命令在Linux系统中可用。

六、总结

-rpath是用来指定动态链接库搜索路径的选项。通过Makefile、chrpath、objdump等方式来使用和查看-rpath路径。需要注意相对路径的使用、路径优先级的影响,以及跨平台的兼容性问题。