二进制管理

通过 LD_LIBRARY_PATH 环境变量指定 动态库 搜索路径:

  1. $ LD_LIBRARY_PATH=/some/lib/path /some/program

该方法同样适用于 glibc ,只需将其放置于 LD_LIBRARY_PATH 指定的目录下。但由于动态链接器( ld.so )是系统默认的,可能与 glibc 不兼容而产生 段错误

这种情况下,需要同时指定与 glibc 相兼容的 ld.so ,方法如下:

  1. $ 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 路径作为段信息写在二进制程序中,因此修改该信息即可:

  1. $ patchelf --set-interpreter /some/ld.so /some/program

这个命令通过 patchelf 工具将 /some/program 的动态链接器改为 /some/ld.so 。之后直接运行程序即可启动:

  1. $ LD_LIBRARY_PATH=/some/lib/path /some/program

这种方式很完美,程序入口不会莫名其妙地变成 ld.so 。美中还有不足, ld.so 不能在运行时指定,不太灵活。

参考文献