LINUX.ORG.RU
решено ФорумAdmin

liblz.so.1 - что за зверь, как поймать?

 ,


0

1

Здравствуйте.

Archlinuxarm. Обновляю worker из aur'ов. makepkg выдаёт

/usr/bin/ld: warning: liblz.so.1, needed by /usr/lib/libavfs.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: /usr/lib/libavfs.so: undefined reference to `LZ_decompress_read'
/usr/bin/ld: /usr/lib/libavfs.so: undefined reference to `LZ_decompress_write'
/usr/bin/ld: /usr/lib/libavfs.so: undefined reference to `LZ_decompress_total_in_size'
/usr/bin/ld: /usr/lib/libavfs.so: undefined reference to `LZ_decompress_finish'
/usr/bin/ld: /usr/lib/libavfs.so: undefined reference to `LZ_decompress_open'
/usr/bin/ld: /usr/lib/libavfs.so: undefined reference to `LZ_decompress_write_size'
/usr/bin/ld: /usr/lib/libavfs.so: undefined reference to `LZ_decompress_sync_to_member'
/usr/bin/ld: /usr/lib/libavfs.so: undefined reference to `LZ_decompress_member_position'
/usr/bin/ld: /usr/lib/libavfs.so: undefined reference to `LZ_decompress_member_finished'
/usr/bin/ld: /usr/lib/libavfs.so: undefined reference to `LZ_decompress_close'
collect2: error: ld returned 1 exit status
make[3]: *** [Makefile:1580: worker] Error 1

Пытал интернет, но решение обрести не смог. Конечно, можно попробовать собрать без avfs-а, но не хотелось бы так легко сдаваться.

Буду рад советам. Спасибо за внимание.

Перемещено hobbit из general

★★★★★

Последнее исправление: piyavking (всего исправлений: 2)
Ответ на: комментарий от yars068

Что в /usr/local появилось?

Ни-че-гошеньки. И lzlib в списке установленных тоже не появился(

Что характерно, ни одного эррора или ворнинга...

piyavking ★★★★★
() автор топика
Последнее исправление: piyavking (всего исправлений: 1)
Ответ на: комментарий от piyavking

Странно, у меня на x86_64 всë собралось нормально. Почему у тебя так – надо разбираться.

Собери прямо на целевой машине:

sudo pacman -S base-devel devtools
pkgctl repo clone --protocol=https liblz
cd liblz; makepkg -f

А с кросс-компиляцией тут сложнее будет, потому что configure не принимает «троицу» --build=, --host и --target.

yars068 ★★★★★
()
Последнее исправление: yars068 (всего исправлений: 2)
Ответ на: комментарий от piyavking

Ну, собраться-то соберётся, возможно, но вот работать это точно не будет, потому что архитектуры разные. Вечером попробую собрать в виртуалке. А какая архитектура машины, на которой worker собираешь?

yars068 ★★★★★
()

Кажется, скросс-скомпилировал :) Итак:

  1. Устанавливаем необходимые пакеты:
sudo pacman -Syu aarch64-linux-gnu-binutils aarch64-linux-gnu-gcc aarch64-linux-gnu-glibc aarch64-linux-gnu-linux-api-headers
  1. Забираем нужный исходник: pkgctl repo clone --protocol=https lzlib

  2. Делаем makepkg -so;

  3. Насыпаем сверху патчик (имя файла патча должно быть как в изменённом PKGBUILD’е):

--- a/lzlib-1.15/configure	2025-01-09 02:22:51.000000000 +0300
+++ b/lzlib-1.15/configure	2025-07-07 21:18:04.210642166 +0300
@@ -30,8 +30,8 @@
 infodir='$(datarootdir)/info'
 libdir='$(exec_prefix)/lib'
 mandir='$(datarootdir)/man'
-CC=gcc
-AR=ar
+CC=${CC:-gcc}
+AR=${AR:-ar}
 CPPFLAGS=
 CFLAGS='-Wall -W -O2'
 LDFLAGS=


  1. Модифицируем PKGBUILD:
--- lzlib/PKGBUILD	2025-07-07 22:15:58.451086247 +0300
+++ lzlib-arm/PKGBUILD	2025-07-07 22:08:41.084673025 +0300
@@ -6,23 +6,43 @@
 pkgver=1.15
 pkgrel=1
 pkgdesc="A library providing in-memory LZMA compression and decompression functions"
-arch=('x86_64')
+arch=('x86_64' 'aarch64')
 url="http://www.nongnu.org/lzip/lzlib.html"
 license=('BSD-2-Clause')
 depends=('glibc')
-source=(https://download.savannah.gnu.org/releases/lzip/$pkgname/$pkgname-$pkgver.tar.gz{,.sig})
+source=(https://download.savannah.gnu.org/releases/lzip/$pkgname/$pkgname-$pkgver.tar.gz{,.sig}
+        allow_redefine_CC_AR.patch)
+
 sha256sums=('4afab907a46d5a7d14e927a1080c3f4d7e3ca5a0f9aea81747d8fed0292377ff'
-            'SKIP')
+            'SKIP'
+            '6d907d121374d7d5e08280de70818c4b4cb60febe051868a2365edf4fe52fd43')
+
 validpgpkeys=('1D41C14B272A2219A739FA4F8FE99503132D7742') # Antonio Diaz Diaz
 
+prepare() {
+  if [ "x$arch" == "xaarch64" ] ; then 
+    echo "Setting up the environment to cross-compile"
+    export CC=aarch64-linux-gnu-gcc
+    export CXX=aarch64-linux-gnu-g++
+    export AR=aarch64-linux-gnu-ar
+    export RANLIB=aarch64-linux-gnu-ranlib
+  fi
+  tar xf $pkgname-$pkgver.tar.gz
+  cd $pkgname-$pkgver
+  patch -p2 --verbose -i $srcdir/allow_redefine_CC_AR.patch
+}
+
 build() {
   cd $pkgname-$pkgver
   ./configure \
     --prefix=/usr \
+    --disable-ldconfig \
     --enable-shared \
     CFLAGS="$CFLAGS" \
     LDFLAGS="$LDFLAGS"
+
   make
+  make minilzip
 }
 
 check() {
  1. Делаем updpkgsums && makepkg --printsrcinfo > .SRCINFO

  2. Делаем cat /etc/makepkg.conf > makepkg.conf. В файл надо внести следующие изменения:

@@ -35,14 +35,14 @@
 # ARCHITECTURE, COMPILE FLAGS
 #########################################################################
 #
-CARCH="x86_64"
+CARCH="aarch64"
 CHOST="x86_64-pc-linux-gnu"
 
 #-- Compiler and Linker Flags
 #CPPFLAGS=""
-CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions \
+CFLAGS="-march=armv9-a -mtune=cortex-a76 -O2 -pipe -fno-plt -fexceptions \
         -Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security \
-        -fstack-clash-protection -fcf-protection \
+        -fstack-clash-protection \
         -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer"
 CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS"
 LDFLAGS="-Wl,-O1 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now \

Обрати внимание на ключи -march, -mtune. Я не знаю, какой именно проц/SoC у тебя, так что поправь при необходимости. Известные gcc архитектуры и флаги компилятора можно подсмотреть в этом документике.

  1. И, наконец, пробуем собрать: makepkg arch=aarch64 --nocheck --config makepkg.conf -fC.

Мне пришлось собирать с --nocheck, потому что пакет

pacman -Ql aarch64-linux-gnu-glibc | grep ld-linux
aarch64-linux-gnu-glibc /usr/aarch64-linux-gnu/lib/ld-linux-aarch64.so.1

– почему-то у меня протухший, а QEMU слинкован уже со свежим, хотя я перед процессом обхода нецелованных граблей обновился. И вот тут, вероятно, будут следующие грабли. Я предупредил :)

Естественно, если собирать прямо на целевой тачке, телодвижений должно быть куда поменьше :) Вот что у меня получилось:

pacman -Qlp /tmp/lzlib-1.15-1-aarch64.pkg.tar.zst 
lzlib /usr/
lzlib /usr/bin/
lzlib /usr/bin/minilzip
lzlib /usr/include/
lzlib /usr/include/lzlib.h
lzlib /usr/lib/
lzlib /usr/lib/liblz.a
lzlib /usr/lib/liblz.so
lzlib /usr/lib/liblz.so.1
lzlib /usr/lib/liblz.so.1.15
lzlib /usr/share/
lzlib /usr/share/info/
lzlib /usr/share/info/dir
lzlib /usr/share/info/lzlib.info
lzlib /usr/share/licenses/
lzlib /usr/share/licenses/lzlib/
lzlib /usr/share/licenses/lzlib/COPYING
lzlib /usr/share/man/
lzlib /usr/share/man/man1/
lzlib /usr/share/man/man1/minilzip.1

Пакет какое-то время должен лежат тута.

UPD. Если кто-нибудь ещё подскажет, почему это make на x86_64 отрабатывает как положено, собирает пакет полностью, а при кросс-компиляции не собирается minilzip, но при этом он собирается отдельным вызвом make, будет супер.

yars068 ★★★★★
()
Последнее исправление: yars068 (всего исправлений: 4)
Ответ на: комментарий от piyavking

Посмотрел исходники. Там, чтобы собирались *.so файлы нужно запускать:

./configure --enable-shared
Вобще, по-хорошему, нужно посмотреть с каким опциями вызывается configure при сборке пакета в arch'е.

Хотя, yars068 собрал вам какой-то пакет. Пакет устанавлиать правильнее, чем из исходником через ″make install″ устанавливать.

mky ★★★★★
()
Ответ на: комментарий от mky

c каким опциями вызывается configure

sed -n '/build() {/,/^}/p' PKGBUILD 
build() {
  cd $pkgname-$pkgver
  ./configure \
    --prefix=/usr \
    --enable-shared \
    CFLAGS="$CFLAGS" \
    LDFLAGS="$LDFLAGS"
  make
}

То есть,

Там, чтобы собирались *.so файлы нужно запускать:

Так и есть. Причина того, что у ТС они не собирались, по всей видимости, именно в этом и была, если он делал configure && make && make install. @piyavking, если тебе нужен собранный мной пакет, маякни, я перезалью его куда-нибудь, чтобы ты успел его скачать. На tmpfiles он всего час пролежал.

yars068 ★★★★★
()
Ответ на: комментарий от yars068

если тебе нужен собранный мной пакет

Ойойойойой нужен-нужен-нужен! Я до сих пор с этим еб разбираюсь, я уже не человек, я зверь...

Перелей, дай линк, страницу не закрываю, жду, спасибо зарание!

И объясни мне плз где я был неправ, я слабоват в этих мейках и конфигурах( нашёл, читаю, спасибо! Понял, что я непроходимо туп, ура!

piyavking ★★★★★
() автор топика
Последнее исправление: piyavking (всего исправлений: 3)
Ответ на: комментарий от piyavking

Это для 32-разрядного Арча, для обычной x86 архитектуры. А вот пакет для Aarch64 действительно почему-то не содержит pkgctl. Но ничто не мешает использовать пакет из обычного x86_64 Арча, поскольку он не содержит бинарников, только скрипты. Но по факту это один и тот же пакет, только версия для Aarch64 малость протухла :)

yars068 ★★★★★
()
Последнее исправление: yars068 (всего исправлений: 2)
Ответ на: комментарий от piyavking

Не знаю, как именно в каких дистрибутивах ARM версия идëт в ногу по версиям ПО с обычными x86{,_64} версиями, у многих ARM отстаëт, а у некоторых – сильно отстает, у третьих – вообще заброшен…

yars068 ★★★★★
()
26 сентября 2025 г.
Ответ на: комментарий от piyavking

А у тебя avfs не установлен? Похоже, что может. Но этот пакет еще и другую функциональность даёт, помимо FTP, это ведь виртуальная файловая система для просмотра форматов архивов, которые поддерживаются компрессорами lzlib, xz и zstd.

yars068 ★★★★★
()