rpath与LD_LIBRARY_PATH, 很奇怪的问题

系统 oE 24.03 LTS, cangjie 编译器(应该没有关系,已经到 elf 可执行程序了)。

编译生成可执行程序,我把库路径写入 rpath 字段,可由 chrpath 程序验证 (或 readelf -d

$ chrpath -l target/release/bin/tmcp
target/release/bin/tmcp: RPATH=./3rd-libs:./magic:/home/atoo/下载/cangjie-0.56.4/runtime/lib/linux_x86_64_llvm

关注其中的 3rd-libs, magic 两个目录,两者均为符号链接——应该也没有关系。

$ ldd target/release/bin/tmcp
	linux-vdso.so.1 (0x00007ffe091f5000)
	…………(略去)
	libmagic.core.memory.so => ./magic/libmagic.core.memory.so (0x00007fe1b7b32000)
	libsqlite3.so.0 => /usr/lib64/libsqlite3.so.0 (0x00007fe1b755e000)
	libfaiss_c.so => ./3rd-libs/libfaiss_c.so (0x00007fe1b9cc4000) #「找到了」
	libsecurec.so => /home/atoo/下载/cangjie-0.56.4/runtime/lib/linux_x86_64_llvm/libsecurec.so (0x00007fe1bac7d000)
	libm.so.6 => /usr/lib64/libm.so.6 (0x00007fe1b737c000)
	libfaiss.so => not found # 「找不到!!!!!!」
	libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fe1b6e00000)
	libgcc_s.so.1 => /usr/lib64/libgcc_s.so.1 (0x00007fe1b9c8a000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fe1bb8e9000)
$ ls -l 3rd-libs/*so
-rw-r--r--. 1 atoo atoo  270008  6月10日 16:15 3rd-libs/libfaiss_c.so 
-rwxr-xr-x. 1 atoo atoo 8215144  6月10日 16:15 3rd-libs/libfaiss.so  #「特意增加了权限位 chmod a+x 」
-rw-r--r--. 1 atoo atoo     132  6月10日 14:52 3rd-libs/libsqlite.so

改设置环境变量,可以了,如下:

$ LD_LIBRARY_PATH=./3rd-libs ldd target/release/bin/tmcp
	linux-vdso.so.1 (0x00007ffdee7da000)
	…………
	libsqlite3.so.0 => /usr/lib64/libsqlite3.so.0 (0x00007f112bc90000)
	libfaiss_c.so => ./3rd-libs/libfaiss_c.so (0x00007f112e446000)
	libsecurec.so => /home/atoo/下载/cangjie-0.56.4/runtime/lib/linux_x86_64_llvm/libsecurec.so (0x00007f112f26a000)
	libm.so.6 => /usr/lib64/libm.so.6 (0x00007f112baae000)
	libc.so.6 => /usr/lib64/libc.so.6 (0x00007f112b8d5000)
	libz.so.1 => /usr/lib64/libz.so.1 (0x00007f112d64f000)
	libfaiss.so => ./3rd-libs/libfaiss.so (0x00007f112b200000) #「这个也能找到了。为何?!!!」
	libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f112ae00000)
	libgcc_s.so.1 => /usr/lib64/libgcc_s.so.1 (0x00007f112d62f000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f112fff0000)
………… (略去其他)

这个目录( ./3rd-libs ) 为何必须设置在 LD_LIBRARY_PATH 方可呢?