linux - 用于创建指向共享库的符号链接(symbolic link)的 Bash 脚本

标签 linux bash scripting java-native-interface shared-libraries

我认为这个问题对于您这些 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/

相关文章:

linux - 日志 mkfifo : must specify file

bash - bash中的视频方向检测

linux - getopts命令没有输入时如何回显

ruby - 如何使用 Rake 输入文件名生成输出文件名?

linux - 当tasklet运行并触发硬件中断时,tasklet的状态会发生什么变化?

linux - FFMPEG 在捕获互联网流媒体时,开始时间不为零

python - Cython 性能测试

linux - 无法输出缓冲区

shell - 替换没有正则表达式的字符串

bash - Shell 脚本中的多任务菜单