二进制管理
通过 LD_LIBRARY_PATH 环境变量指定 动态库 搜索路径:
$ LD_LIBRARY_PATH=/some/lib/path /some/program
该方法同样适用于 glibc ,只需将其放置于 LD_LIBRARY_PATH 指定的目录下。但由于动态链接器( ld.so )是系统默认的,可能与 glibc 不兼容而产生 段错误 。
这种情况下,需要同时指定与 glibc 相兼容的 ld.so ,方法如下:
$ LD_LIBRARY_PATH=/some/lib/path /some/ld.so /some/program
这行命令的意思是,以 /some/ld.so 为动态链接器启动程序 /some/program ,优先在 /some/lib/path 目录搜索动态库。
这种方式虽然可以顺利启动 /some/program 程序,但是程序路径却是 /some/ld.so 。换句话讲,程序的入口变了。那么,有办法更优雅地指定 ld.so 么?
其实, ld.so 路径作为段信息写在二进制程序中,因此修改该信息即可:
$ patchelf --set-interpreter /some/ld.so /some/program
这个命令通过 patchelf 工具将 /some/program 的动态链接器改为 /some/ld.so 。之后直接运行程序即可启动:
$ LD_LIBRARY_PATH=/some/lib/path /some/program
这种方式很完美,程序入口不会莫名其妙地变成 ld.so 。美中还有不足, ld.so 不能在运行时指定,不太灵活。