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也集成进软件包中