[devel] Пути к разделяемым библиотекам в hasher

Ivan Zakharyaschev imz на altlinux.org
Сб Апр 7 12:47:37 MSK 2018


On Sat, 7 Apr 2018, Eugine Kosenko wrote:

> Один и тот же свежесобранный своими руками ghc7.10.1-7.10.1-alt1.rpm
> устанавливаю в рабочей системе и в хэшере.
> 
> Запускаю в рабочей системе:
> 
> $ strace ghc 2>&1|grep haskeline
> openat(AT_FDCWD, "/usr/lib64/ghc-7.10.1/bin/../haske_IlDhIe25uAn0WJY379Nu1M/
> libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M-ghc7.10.1.so",
> O_RDONLY|O_CLOEXEC) = 3
> 
> Запускаю в хэшере:
> 
> # strace ghc 2>&1|grep haskeline
> openat(AT_FDCWD, "/lib64/tls/x86_64/x86_64/
> libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M-ghc7.10.1.so",
> O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)

Это может быть связано с тем, что не смонтирван /proc, а там в 
RPATH/RUNPATH в этих elf-ах используется $ORIGIN (см man ld-linux.so). 
Чтобы узнать место, где выполняемый elf лежал, ld-linux как-то там смотрит 
в /proc/ , иначе работает так, как будто бы в текущей директории надо 
искать (и далее по стандартным путям).

Натыкались на такое с glebfm@ при bootstrap-е пакета ghc на новой 
платформе (mips*).

Такая же фигня есть в java (в т.ч closure), из-за этого при сборке 
обязательно приходится /proc монтировать. (Это до недавнего времени для 
меня было загадкой, почему какие-то java-библиотеки не находились в 
hasher, а так всё работало. Теперь с уверенностью догадываюсь.)

> openat(AT_FDCWD, "/lib64/tls/x86_64/
> libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M-ghc7.10.1.so",
> O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/lib64/tls/x86_64/
> libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M-ghc7.10.1.so",
> O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/lib64/tls/
> libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M-ghc7.10.1.so",
> O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/lib64/x86_64/x86_64/
> libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M-ghc7.10.1.so",
> O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/lib64/x86_64/
> libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M-ghc7.10.1.so",
> O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/lib64/x86_64/
> libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M-ghc7.10.1.so",
> O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/lib64/
> libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M-ghc7.10.1.so",
> O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/usr/lib64/tls/x86_64/x86_64/
> libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M-ghc7.10.1.so",
> O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/usr/lib64/tls/x86_64/
> libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M-ghc7.10.1.so",
> O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/usr/lib64/tls/x86_64/
> libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M-ghc7.10.1.so",
> O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/usr/lib64/tls/
> libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M-ghc7.10.1.so",
> O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/usr/lib64/x86_64/x86_64/
> libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M-ghc7.10.1.so",
> O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/usr/lib64/x86_64/
> libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M-ghc7.10.1.so",
> O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/usr/lib64/x86_64/
> libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M-ghc7.10.1.so",
> O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/usr/lib64/
> libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M-ghc7.10.1.so",
> O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
> writev(2, [{iov_base="/usr/lib64/ghc-7.10.1/bin/ghc", iov_len=29},
> {iov_base=": ", iov_len=2}, {iov_base="error while loading shared
> libra"..., iov_len=36}, {iov_base=": ", iov_len=2},
> {iov_base="libHShaskeline-0.7.2.1-IlDhIe25u"..., iov_len=58}, {iov_base=":
> ", iov_len=2}, {iov_base="cannot open shared object file", iov_len=30},
> {iov_base=": ", iov_len=2}, {iov_base="No such file or directory",
> iov_len=25}, {iov_base="\n", iov_len=1}], 10/usr/lib64/ghc-7.10.1/bin/ghc:
> error while loading shared libraries:
> libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M-ghc7.10.1.so: cannot open
> shared object file: No such file or directory
> 
> Получается, что в рабочей системе эта библиотека находится, а в хэшере ---
> нет. Притом она и там и там лежит в одном и том же месте:
> 
> $ ls /usr/lib64/ghc-7.10.1/haske_IlDhIe25uAn0WJY379Nu1M/lib*
> /usr/lib64/ghc-7.10.1/haske_IlDhIe25uAn0WJY379Nu1M/libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M.a
> /usr/lib64/ghc-7.10.1/haske_IlDhIe25uAn0WJY379Nu1M/
> libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M-ghc7.10.1.so
> /usr/lib64/ghc-7.10.1/haske_IlDhIe25uAn0WJY379Nu1M/libHShaskeline-0.7.2.1-IlDhIe25uAn0WJY379Nu1M_p.a
> 
> Непонятно, почему в хэшере ищнт не там, где в рабочей системе (и даже не
> пытается)? ld.so.conf в обеих средах пустые, шаманство с ручной установкой
> LD_LIBRARY_PATH не помогает. Возможно, сама libHShaskeline не может быть
> прогружена из-за отсутствия какой-то другой библиотеки (скорее всего,
> проблема таки в зависимости, сейчас пытаюсь сгенерировать полный список по
> rpmbb -r), но как узнать, какой?
> 
> На самом деле все еще хуже. Пакет нормально собирается в рабочей системе,
> но не собирается в хэшере из-за аналогичной ошибки --- промежуточный
> ghc-pkg не находит libHSterminfo.
> 


Подробная информация о списке рассылки Devel