我认为这个问题对于您这些 shell 脚本怪兽来说相当容易。
我正在寻找最优雅和最短的方法来通过 bash shell 脚本创建指向 Unix 共享库的符号链接(symbolic link)。
我需要的是从共享库文件列表开始,例如“libmythings.so.1.1、libotherthings.so.5.11”,获取创建的符号链接(symbolic link),例如:
libmythings.so -> libmythings.so.1 -> libmythings.so.1.1
libotherthings.so -> libotherthings.so.5 -> libotherthings.so.5.11
库文件位于包含其他文件(例如其他 shell 脚本)的目录中。
编辑:嗯,“ldconfig -nN”。可以正常工作,但我还需要没有在“.so”之后附加库的主要编号的链接,至少有一个库,因为一个或多个库是来自 Java 的 JNI 调用的入口点,所以当一个库通过 System.loadlibrary("libraryname") 实例化,它需要一个名为“libraryname.so”的库,而不是“libraryname.so.X”。
如果 Java 部分有解决方法,则仅使用 ldconfig -nN 的解决方案就可以工作。
最佳答案
我相信 ldconfig
是执行此操作的标准工具。
我记得某处它可以根据内部版本信息生成符号链接(symbolic link),但现在找不到源。
编辑 是的,如果你运行
ldconfig -v
您会看到它根据库内部结构生成所有链接。
ldconfig /path/to/dir
只会为该目录中的文件创建链接
不过请注意,我玩过它,它似乎并没有始终如一地创建 .so$,只是 .so.{major}
我不确定它的内部是如何工作的,但我知道:
lib # rm libmagic.so lib # rm libmagic.so.1 lib # ldconfig lib # file libmagic.so.1 libmagic.so.1: symbolic link to `libmagic.so.1.0.0' lib # file libmagic.so libmagic.so: cannot open `libmagic.so' (No such file or directory)
所以是什么决定了它是如何工作的对我来说是个谜
编辑 经过进一步分析,.la 文件对行为没有影响。
“SO”名称字段指示符号链接(symbolic link)将被调用的内容。
而且只会有一个。
0x000000000000000e (SONAME) 库 soname: [libmagix.so ]
这是在破解代码并将“.1”替换为空格之后。
ldconfig 生成“libmagic.so”(是的,包含空格)
关于linux - 用于创建指向共享库的符号链接(symbolic link)的 Bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/462100/