У меня есть несколько общих библиотек, большинство из которых, я считаю, установлены с помощью пакетов Red Hat: ncurses, cap, uuid, xml2.
[root@mycomputer~]# rpm -ql libuuid-2.23.2-43.el7_4.2.x86_64
/usr/lib64/libuuid.so.1
/usr/lib64/libuuid.so.1.3.0
/usr/share/doc/libuuid-2.23.2
/usr/share/doc/libuuid-2.23.2/COPYING
> l /usr/lib64/*uuid*
-rwxr-xr-x. 1 root root 20040 Nov 9 2017 /usr/lib64/libuuid.so.1.3.0
lrwxrwxrwx. 1 root root 16 Jul 3 2018 /usr/lib64/libuuid.so.1 -> libuuid.so.1.3.0
Файл сборки примера программы производителя содержит -luuid
в строке ссылки, и компоновщик жалуется:
/usr/bin/ld: cannot find -luuid
Я запускаю strace -f make ... >& makeout
, чтобы перехватить все системные вызовы, сделанные make и его дочерними процессами. -f
означает «следуйте также за дочерними процессами».)
Когда я выполняю поиск этого файла для строки uuid
, я вижу, что он никогда не ищет файл с расширением .1
.
[pid 21920] open("/opt/nmr/sap/sybaseASE/sybclient-16.0.3-7/OCS-16_0/lib/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/opt/nmr/sap/sybaseASE/sybclient-16.0.3-7/OCS-16_0/lib/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib64/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib64/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib/gcc/x86_64-redhat-linux/4.8.5/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib/gcc/x86_64-redhat-linux/4.8.5/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/lib/../lib64/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/lib/../lib64/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib/../lib64/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib/../lib64/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/x86_64-redhat-linux/lib64/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/x86_64-redhat-linux/lib64/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib64/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib64/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/local/lib64/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/local/lib64/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/lib64/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/lib64/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/x86_64-redhat-linux/lib/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/x86_64-redhat-linux/lib/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/local/lib/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/local/lib/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/lib/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/lib/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
Я понимаю механизм мягкой ссылки из файла, подобного /usr/lib64/libuuid.so
(без суффикса .1
), на указанную c версию, скажем, libuuid.so.1.3.0
. readlink()
, я полагаю, чтобы найти окончательный файл, на который указывает libuuid.so
, и встроить цель этой ссылки libuuid.so.1.3.0
в двоичный файл. Таким образом, даже если «последняя» версия uuid в будущем станет 1.4.0 и libuuid.so
будет перенаправлена на эту новую версию, например, этот двоичный файл все равно будет связан с 1.3.0 во время выполнения.
Но как компилятор должен получить от libuuid.so
до libuuid.so.1
?