Bug 53233 - Ошибка lib.req: WARNING: <lib> is not yet set-versioned
Summary: Ошибка lib.req: WARNING: <lib> is not yet set-versioned
Status: CLOSED NOTABUG
Alias: None
Product: Branch p11
Classification: Unclassified
Component: rpm-build (show other bugs)
Version: unspecified
Hardware: x86_64 Linux
: P5 normal
Assignee: placeholder@altlinux.org
QA Contact: qa-p11@altlinux.org
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2025-02-26 19:31 MSK by pfe
Modified: 2025-03-13 11:20 MSK (History)
5 users (show)

See Also:


Attachments
Код для воспроизведения ошибки (1.35 KB, application/x-compressed-tar)
2025-03-13 06:33 MSK, pfe
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description pfe 2025-02-26 19:31:43 MSK
Собираю RPM-пакеты C++ - проекта, на этапе Executing(%install) получаю ошибки вида:

error: file /usr/lib64/ld-linux-x86-64.so.2()(64bit): No such file or directory
lib.req: WARNING: /usr/lib64/ld-linux-x86-64.so.2()(64bit) is not yet set-versioned
error: file /usr/lib64/libc.so.6()(64bit): No such file or directory
lib.req: WARNING: /usr/lib64/libc.so.6()(64bit) is not yet set-versioned
error: file /usr/lib64/libcrypto.so.3()(64bit): No such file or directory
lib.req: WARNING: /usr/lib64/libcrypto.so.3()(64bit) is not yet set-versioned
error: file /usr/lib64/libcurl.so.4()(64bit): No such file or directory
lib.req: WARNING: /usr/lib64/libcurl.so.4()(64bit) is not yet set-versioned
error: file /usr/lib64/libgcc_s.so.1()(64bit): No such file or directory
lib.req: WARNING: /usr/lib64/libgcc_s.so.1()(64bit) is not yet set-versioned
error: file /usr/lib64/libm.so.6()(64bit): No such file or directory
lib.req: WARNING: /usr/lib64/libm.so.6()(64bit) is not yet set-versioned
error: file /usr/lib64/libssh.so.4()(64bit): No such file or directory
lib.req: WARNING: /usr/lib64/libssh.so.4()(64bit) is not yet set-versioned
error: file /usr/lib64/libstdc++.so.6()(64bit): No such file or directory
lib.req: WARNING: /usr/lib64/libstdc++.so.6()(64bit) is not yet set-versioned
error: file /usr/lib64/libz.so.1()(64bit): No such file or directory
lib.req: WARNING: /usr/lib64/libz.so.1()(64bit) is not yet set-versioned

Сама сборка пакета несмотря на это завершается успешно, но потом при установке появляются ошибки вида:

Depends: /usr/lib64/libc.so.6(GLIBC_2.14)(64bit) but it is not installable

как раз для этих библиотек. При сборке все эти библиотеки есть по указанным путям. 

Нашёл такой пост на похожую тему: https://lists.altlinux.org/pipermail/devel/2010-December/187234.html

Окружение:
ALT Linux p11 (официальный докер-образ)
$ gcc --version
x86_64-alt-linux-gcc (GCC) 13.2.1 20240128 (ALT Sisyphus 13.2.1-alt3)
Comment 1 Ivan A. Melnikov 2025-02-27 09:49:30 MSK
Сообщения о том, что какая-то библиотека is not set-versioned, не мешают сборке. Нужно понять, откуда взялась зависимость на /usr/lib64/libc.so.6(GLIBC_2.14)(64bit), именно такие зависимости приводят к сообщениям, которые Вы видите. К сожалению, понять это, не имея возможности воспроизвести проблему локально, непросто.

Вы собираете Ваш проект? Из исходников? Можете поделиться? Вы не делаете что-нибудь странное с компоновщиком?

> ALT Linux p11 (официальный докер-образ)

Можете уточнить, какой именно? Хеш, теги?
Comment 2 pfe 2025-02-28 08:21:07 MSK
Спасибо за пояснения, попробую разобраться, откуда берётся проблемная зависимость, я думал, что это последствия set-versioned.
Сборочный докер-образ у меня основан на свежем текущем alt:p11
RepoDigests: alt@sha256:301f3053b315587a1584d32f0d46dd9ab3f41120b5b0506e991fb43f1747fd98
в котором обычным образом установлены пакеты для сборки:
apt-get install -y glibc-devel meson zlib-devel и т.д.
Исходниками поделиться не могу, так как это закрытый код. Попробую пока сам.
Comment 3 pfe 2025-03-11 14:24:13 MSK
У меня есть подозрение, что причина проблемных библиотек - в пакетах этих библиотек. Например, такая тестовая программа для проверки liblz4 (liblz4 - это одна из проблемных библиотек):

#include <stdio.h>
#include "lz4.h"

int main(int argc, char** argv)
{
    (void)argc; (void)argv;
    printf("Hello World ! LZ4 Library version = %d\n", LZ4_versionNumber());
    return 0;
}

на CentOS Stream 9 собирается успешно:

[root@14186f489e04 ~]# gcc -llz4 -o prog test.c
[root@14186f489e04 ~]# chmod +x prog 
[root@14186f489e04 ~]# ./prog 
Hello World ! LZ4 Library version = 10903

а на ALT Linux сборка выдаёт ошибку

[root@347e45b1a3f4 ~]# gcc -llz4 -o prog test.c
ld: /tmp/cc2muNOw.o: in function `main':
test.c:(.text+0x10): undefined reference to `LZ4_versionNumber'
collect2: error: ld returned 1 exit status

Библиотека и символ в действительности присутствуют:

[root@347e45b1a3f4 ~]# objdump -T /usr/lib64/liblz4.so.1 | grep LZ4_versionNumber
0000000000004c80 g    DF .text	0000000000000006  Base        LZ4_versionNumber

Также я заметил, что на CentOS Stream 9 (где нет ошибки установки) в зависимостях моего пакета эти библиотеки указаны в виде чистого soname:

[root@69acd03fbbc6 packages]# rpm --requires -qp ./mypackage-1.2.3-1.el9.x86_64.rpm | grep liblz4
liblz4.so.1()(64bit)

а на ALT Linux они указаны в виде soname с полным путём

[root@113afa5094e4 packages]# rpm --requires -qp ./mypackage-1.2.3-1.x86_64.rpm | grep liblz4
/usr/lib64/liblz4.so.1

и именно на зависимостях с полным путём возникает ошибка "not installable".

Не складывается ли это в какую-то единую картину? Что ещё можно сделать для локализации ошибки?

В качестве ALT Linux я использую текущий докер-образ alt:p11.
Comment 4 pfe 2025-03-11 14:32:49 MSK
Для сравнения вот ещё выводы команд

на CentOS Stream 9, где установка успешна:
[root@2a5dbdc177ee /]# rpm -q --provides lz4-libs
liblz4.so.1()(64bit)
lz4-libs = 1.9.3-5.el9
lz4-libs(x86-64) = 1.9.3-5.el9

на ALT Linux p11
[root@347e45b1a3f4 ~]# rpm -qa | grep lz4
liblz4-1.9.4-alt1.x86_64
liblz4-devel-1.9.4-alt1.x86_64
[root@347e45b1a3f4 ~]# rpm -q --provides liblz4
liblz4.so.1()(64bit) = set:kdM5gNUbF3KIMt3ooTZHOp2fldcuDMknnKl5orJK759Af8VRAc7Z0Kn1SgSvsiLihMW1acRgjOHNzPqQPpQMfKoPdjoe4pZjCvX4sYK1ROZ4XJiap0NcuzRgiLh0iELAxziAxIvOiFM9MwOHBqNte1OYb2F19YqrnabgGpHW6FhdJZdu5413fH8r5
liblz4 = 1:1.9.4-alt1:sisyphus+309416.100.1.1

На CentOS provides сщвпадает с requires пакета, на ALT Linux - нет.
Comment 5 Arseny Maslennikov 2025-03-11 15:54:04 MSK
(In reply to pfe from comment #3)
> У меня есть подозрение, что причина проблемных библиотек - в пакетах этих
> библиотек. Например, такая тестовая программа для проверки liblz4 (liblz4 -
> это одна из проблемных библиотек):
> 
>   #include <stdio.h>
>   #include "lz4.h"
>   
>   int main(int argc, char** argv)
>   {
>       (void)argc; (void)argv;
>       printf("Hello World ! LZ4 Library version = %d\n", LZ4_versionNumber());
>       return 0;
>   }
> 
> на CentOS Stream 9 собирается успешно:
> 
>   [root@14186f489e04 ~]# gcc -llz4 -o prog test.c
>   [root@14186f489e04 ~]# chmod +x prog 
>   [root@14186f489e04 ~]# ./prog 
>   Hello World ! LZ4 Library version = 10903
> 
> а на ALT Linux сборка выдаёт ошибку
> 
>   [root@347e45b1a3f4 ~]# gcc -llz4 -o prog test.c
>   ld: /tmp/cc2muNOw.o: in function `main':
>   test.c:(.text+0x10): undefined reference to `LZ4_versionNumber'
>   collect2: error: ld returned 1 exit status
> 
> Библиотека и символ в действительности присутствуют:
> 
>   [root@347e45b1a3f4 ~]# objdump -T /usr/lib64/liblz4.so.1 | grep
>   LZ4_versionNumber
>   0000000000004c80 g    DF .text	0000000000000006  Base       
>   LZ4_versionNumber
А пакет liblz4-devel с симлинком /usr/lib64/liblz4.so, скорее всего, отсутствует.
  # apt-get install 'pkgconfig(liblz4)'
Вы ссылаетесь на CentOS; разве там не выделяют файлы для разработки в пакет "-devel"?
Comment 6 Sergey V Turchin 2025-03-11 16:03:56 MSK
(Ответ для Arseny Maslennikov на комментарий #5)
> Вы ссылаетесь на CentOS; разве там не выделяют файлы для разработки в пакет
> "-devel"?
Да. Это было бы слишком, т.к. для 2-х soname уже не сделать 2-х devel-пакетов.
https://src.fedoraproject.org/rpms/lz4/blob/rawhide/f/lz4.spec
Comment 7 Arseny Maslennikov 2025-03-11 16:06:29 MSK
(In reply to pfe from comment #3)
> Также я заметил, что на CentOS Stream 9 (где нет ошибки установки) в
> зависимостях моего пакета эти библиотеки указаны в виде чистого soname:
> 
> [root@69acd03fbbc6 packages]# rpm --requires -qp
> ./mypackage-1.2.3-1.el9.x86_64.rpm | grep liblz4
> liblz4.so.1()(64bit)
> 
> а на ALT Linux они указаны в виде soname с полным путём
> 
> [root@113afa5094e4 packages]# rpm --requires -qp
> ./mypackage-1.2.3-1.x86_64.rpm | grep liblz4
> /usr/lib64/liblz4.so.1
> 
> и именно на зависимостях с полным путём возникает ошибка "not installable".
> 
> Не складывается ли это в какую-то единую картину? Что ещё можно сделать для
> локализации ошибки?
Предоставьте, пожалуйста, команды, которыми вы собираете пакет, а лучше — ещё и спек.

Ещё на всякий случай замечу, что далеко не все привычки упаковки под rh можно перенести на альт, и чем дальше, тем сильнее эти два мира расходятся. В частности, на сегодняшний день программа rpm и программа rpmbuild собираются из разных исходников и сопровождаются достаточно независимо, и первой из них собирать пакеты _не стоит_; `rpm -ba` даст не тот результат, что вы ожидаете, в отличие от rpmbuild -ba.
Comment 8 Ivan A. Melnikov 2025-03-11 16:09:22 MSK
>  gcc -llz4 -o prog test.c

Во-первых, обратите внимание:

$ sudo apt-get update
[...]

$ sudo apt-get install liblz4-devel
[...]

$ gcc -llz4 -o prog test.c
ld: /tmp/.private/iv/ccLyrIwq.o: in function `main':
test.c:(.text+0x10): undefined reference to `LZ4_versionNumber'
collect2: error: ld returned 1 exit status

$ gcc -o prog test.c -llz4 && ./prog
Hello World ! LZ4 Library version = 10904

Наш gcc, как и многие другие, по умолчаню включает -Wl,--as-needed, поэтому библиотеки надо указывать после файлов, которые ими пользуются. Сборочный инструментарий (cmake, meson и т.п.) обычно так и делает.

Далее,

$ readelf -d prog | grep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [liblz4.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

Покажите пожалуйста аналогичный вывод для бинарников из Вашего пакета, и командную строку компоновщика.
Comment 9 pfe 2025-03-12 05:08:27 MSK
Вот строка компоновщика одной из shared-библиотек:

[25/185] cc  -o subprojects/pb3-format-c/libpb3_encoder.so.1 subprojects/pb3-format-c/libpb3_encoder.so.1.p/pb3_cbor.c.o subprojects/pb3-format-c/libpb3_encoder.so.1.p/encoder.c.o subprojects/pb3-format-c/libpb3_encoder.so.1.p/decoder.c.o subprojects/pb3-format-c/libpb3_encoder.so.1.p/ft_hash.c.o subprojects/pb3-format-c/libpb3_encoder.so.1.p/compression.c.o subprojects/pb3-format-c/libpb3_encoder.so.1.p/shared.c.o -Wl,--as-needed -Wl,--no-undefined -shared -fPIC -Wl,-soname,libpb3_encoder.so.1 -pipe -frecord-gcc-switches -Wall -g -O2 -Wl,--start-group subprojects/tinycbor/libtinycbor.a subprojects/spookyhash/libspookyhash.a -lpq /usr/lib64/libz.so -lzstd -llz4 -Wl,--end-group

Вот получившиеся зависимости этой библиотеки в заголовке:

[root@7563664ad248 ~]# readelf -d libpb3_encoder.so | grep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libz.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libzstd.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [liblz4.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
[root@7563664ad248 ~]# 

Но на этапе find-requires зависимые библиотеки, похоже, попадают в метаданные пакета с полными путями:

Processing files: libpb3-encoder-3.0.7~beta3~20250312g0a15594-1
Finding Provides (using /usr/lib/rpm/find-provides)
Executing: /bin/sh -e /tmp/rpm-tmp.iK8cKq
Finding Requires (using /usr/lib/rpm/find-requires)
Executing: /bin/sh -e /tmp/rpm-tmp.2SzQ4M
Provides: libpb3_encoder.so.1()(64bit) = set:kdqkmZjNkXms1fiYqLU92s0ZtKLdBmL5ud3jmUttcwtGqidw54YiZk1locpLZhxwpAaqopaQ516ZuvFzG8wvKGWTPqVXFfero7qeshcqK0CNfMQts32r6LF4AxCGiv8ZFNlZvf1da5GHANHlB2qZpNlZuEANGUzdbzL4MROd4
Requires: /usr/lib64/libc.so.6(GLIBC_2.14)(64bit), /usr/lib64/libc.so.6(GLIBC_2.2.5)(64bit), /usr/lib64/libc.so.6(GLIBC_2.3)(64bit), /usr/lib64/libc.so.6(GLIBC_2.3.4)(64bit), /usr/lib64/libc.so.6(GLIBC_2.33)(64bit), /usr/lib64/libc.so.6(GLIBC_2.38)(64bit), /usr/lib64/libc.so.6(GLIBC_2.4)(64bit), /usr/lib64/liblz4.so.1, /usr/lib64/libz.so.1(ZLIB_1.2.0)(64bit), /usr/lib64/libzstd.so.1, rtld(GNU_HASH)

Вот части спек-файла, относящиеся к сборке пакета этой библиотеки:

%build
%meson
%meson_build

%install
# ALT Linux has its own meson install macro. %distribution can be used to detect
# ALT Linux
%{?distribution: %__meson_install}%{!?distribution: %meson_install}

%clean
rm -rf $RPM_BUILD_ROOT

%files -n libpb3-encoder
%_libdir/libpb3_encoder*.so*
Comment 10 pfe 2025-03-12 07:26:33 MSK
Пакеты собираются командой:
rpmbuild -bb --define="_lto_cflags %{nil}" --define="optflags_lto %{nil} спек-файл
Comment 11 Ivan A. Melnikov 2025-03-12 09:02:31 MSK
Спасибо. Пока ничего особенного не видно, так что давайте попробуем копнуть глубже. Могу предложить два пути.

I. Вы можете добавить к rpmbuild ключ -vvv и приложить полученый лог сборки сюда? Что-то типа такого

rpmbuild -vvv -bb [...] 2>&1 | tee rpmbuild.log

Возможно, для понимания проблемы будет достаточно только того, что идёт после строки

Finding Requires (using /usr/lib/rpm/find-requires)

если что-то до этого Вы хотели бы скрыть. Может и сами почитать и это Вас на что-нибудь вдохновит, но там наверное будет очень много букв.

II. Нужно попробовать воспроизвести проблему на каком-то свободном пакете, которым Вы сможете нормально поделиться. Например, пересобрать пакет banner (https://packages.altlinux.org/en/sisyphus/srpms/banner/rpms/), и посмотреть, будут ли у него неправильные зависимости на /usr/lib64/libc.so.6. Или поискать что-нибудь маленькое собираемое meson'ом (сейчас мне ничего в голову не приходит).
Comment 12 pfe 2025-03-13 06:32:38 MSK
Я понял, в чём непосредственная причина ошибки. Наши пакеты устанавливаются в /opt, поэтому в спек-файле я в самом начале переопределяю макросы:

%define _prefix /opt/mypackage/prog
%define _libdir %_prefix/lib

До этого я это не указывал, потому что считал, что это не влияет на сборку пакетов. Но причина точно в этом - с этими строчками ошибка возникает, без них - нет, всё собирается и устанавливается без ошибок.

Прилагаю минималистический пример для воспроизведения (example.tgz), команды для воспроизведения в readme.txt.
Comment 13 pfe 2025-03-13 06:33:44 MSK
Created attachment 17964 [details]
Код для воспроизведения ошибки
Comment 14 Антон Мидюков 2025-03-13 06:38:07 MSK
(In reply to pfe from comment #12)
> Я понял, в чём непосредственная причина ошибки. Наши пакеты устанавливаются
> в /opt, поэтому в спек-файле я в самом начале переопределяю макросы:
> 
> %define _prefix /opt/mypackage/prog
> %define _libdir %_prefix/lib
> 
> До этого я это не указывал, потому что считал, что это не влияет на сборку
> пакетов. Но причина точно в этом - с этими строчками ошибка возникает, без
> них - нет, всё собирается и устанавливается без ошибок.
> 
> Прилагаю минималистический пример для воспроизведения (example.tgz), команды
> для воспроизведения в readme.txt.

Вот вы сами накосячили, и почему-то вешаете багу на rpm-build.
Нельзя так делать.
Comment 15 pfe 2025-03-13 06:55:07 MSK
Во-первых, я, действительно, сначала хотел посоветоваться и послал свой вопрос в рассылку community@lists.altlinux.org, но мне так никто и не ответил.

Во-вторых, поясните, в чём мой косяк? Макросы типа _libdir описывают пути для сборки и установки пакета и мне нужно, чтобы они были такими, какими я их задаю. На CentOS Stream, который является для меня эталоном RPM-based систем, никаких ошибок в этом случае не возникает.
Comment 16 Антон Мидюков 2025-03-13 07:00:16 MSK
(In reply to pfe from comment #15)
> Во-первых, я, действительно, сначала хотел посоветоваться и послал свой
> вопрос в рассылку community@lists.altlinux.org, но мне так никто и не
> ответил.
> 

community@ для таких вопросов не подходит.
Есть рассылка https://lists.altlinux.org/mailman/listinfo/devel-newbies

> Во-вторых, поясните, в чём мой косяк? Макросы типа _libdir описывают пути
> для сборки и установки пакета и мне нужно, чтобы они были такими, какими я
> их задаю. На CentOS Stream, который является для меня эталоном RPM-based
> систем, никаких ошибок в этом случае не возникает.

Это базовые макросы, их переопределять не надо.
Переопределите DESTDIR, если это Makefile.
Comment 17 Sergey V Turchin 2025-03-13 10:29:32 MSK
(Ответ для pfe на комментарий #15)
> Во-вторых, поясните, в чём мой косяк? Макросы типа _libdir
Эти макросы используются всеми компонентами, участвующими в сборке, а не только вашим конечным пакетом. Переопределяя любые(не ваши) макросы будьте готовы, что что-то сломаете.
Comment 18 Ivan A. Melnikov 2025-03-13 11:20:50 MSK
> Я понял, в чём непосредственная причина ошибки.

Ура)

(In reply to pfe from comment #15)
> Во-первых, я, действительно, сначала хотел посоветоваться и послал свой
> вопрос в рассылку community@lists.altlinux.org, но мне так никто и не
> ответил.

Не знаю, подходит ли для этого community@ (мне казалось что почему бы и нет?) но я не вижу Вашего письма ни у себя, ни в архивах. Возможно, Вы пропустили письмо от mailman, или не придали ему значения.

Не вижу никаких проблем в том, чтобы задавать вопросы в багзилле, но письмо в devel-newbies безусловно привлекло бы больше людей к поиску решения.

(In reply to Антон Мидюков from comment #16)
> Это базовые макросы, их переопределять не надо.
> Переопределите DESTDIR, если это Makefile.

Вы так ругаетесь на человека как будто это где-то документированно))

Но действительно, макросы %_prefix, %_libdir, %_bindir и подобные -- это не точки конфигурирования макросов. Они описывают систему, и именно в таком качестве используются как в пользовательских макросах (%configure, %makeinstall_std, %meson...) так и во внутренних частях rpm-build.

Например, после переопределения макроса %_libdir /usr/lib64, с точки зрения rpm, перестаёт быть стандартным путём поиска динамических библиотек. Отсюда и зависимости с полным путём.

Если сборочной системе необходимо передать какие-то особые параметры, не нужно менять такие макросы, нужно просто передать нужные параметры. Возможно, при этом не получится воспользоваться стандартными макросами. Это нормально: стандартные макросы предназначены для стандартных задач, а ваша -- нестандартная.