LINUX.ORG.RU

Не собирается 32-битная библиотека на 64-битной системе

 , , , ,


1

1

Пытаюсь собрать WineASIO в Debian 9. Собираю по этому образцу https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=wineasio . 64-битная версия библиотеки собралась, а 32-битная выдаёт следующее:

ld: i386:x86-64 architecture of input file `/usr/lib/x86_64-linux-gnu/wine/libuuid.a(uuid.o)' is incompatible with i386 output
ld: Relocatable linking with relocations from format elf64-x86-64 (/usr/lib/x86_64-linux-gnu/wine/libwinecrt0.a(dll_entry.o)) to format elf32-i386 (wineasio.KabUFW.o) is not supported
winebuild: ld failed with status 1
winegcc: /usr/lib/wine/winebuild failed
Makefile:114: ошибка выполнения рецепта для цели «wineasio.dll.so»
make: *** [wineasio.dll.so] Ошибка 2

Кто объяснит, что оно от меня хочет?

UPD: рано я начал радоваться. Собраться-то оно собралось, вот только не работает. ldd выдаёт следущее:

ldd wineasio.dll.so
	linux-vdso.so.1 (0x00007ffd8f13d000)
	libjack.so.0 => /usr/lib/x86_64-linux-gnu/libjack.so.0 (0x00007fe477da1000)
	libwine.so.1 => not found
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fe477a9d000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe4776fe000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fe4774e1000)
	libopus.so.0 => /usr/lib/x86_64-linux-gnu/libopus.so.0 (0x00007fe477290000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fe477088000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fe476e84000)
	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fe476b02000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fe4768eb000)
	/lib64/ld-linux-x86-64.so.2 (0x0000560c169e1000)
То есть как минимум libwine оно нифига не видит. Как такое может быть, ума не приложу.

UPD2: всё работает, проблема решена. Кому интересно, вот тут подробное описание, как собрать multilib WineASIO под Debian 9: Не собирается 32-битная библиотека на 64-битной системе (комментарий)

★★★★★

Последнее исправление: meliafaro (всего исправлений: 2)

Ответ на: комментарий от slovazap

На всякий прилагаю Makefile.

### Generated by Winemak er

PREFIX                = /usr
SRCDIR                = .
SUBDIRS               =
DLLS                  = wineasio.dll
EXES                  =



### Common settings

CEXTRA                = -m32 -g -O2 -D__WINESRC__ -D_REENTRANT -fPIC -Wall -pipe -fno-strict-aliasing -Wdeclaration-after-statement -Wwrite-strings -Wpointer-arith
CXXEXTRA              = -m32 -D__WINESRC__ -D_REENTRANT -fPIC -Wall -pipe -fno-strict-aliasing -Wdeclaration-after-statement -Wwrite-strings -Wpointer-arith
RCEXTRA               =
INCLUDE_PATH          = -I. -I/usr/include -I$(PREFIX)/include -I$(PREFIX)/include/wine -I$(PREFIX)/include/wine/windows
DLL_PATH              =
LIBRARY_PATH          = 
LIBRARIES             = -ljack

 
### wineasio.dll sources and settings

wineasio_dll_MODULE   = wineasio.dll
wineasio_dll_C_SRCS   = asio.c \
			main.c \
			regsvr.c
wineasio_dll_CXX_SRCS =
wineasio_dll_RC_SRCS  =
wineasio_dll_LDFLAGS  = -shared \
			-m32 \
			$(wineasio_dll_MODULE:%=%.spec) \
			-mnocygwin \
#			-L/usr/lib32/wine \
#			-L/usr/lib32 \
			-L/usr/lib/i386-linux-gnu/wine/ \
			-L/usr/lib/i386-linux-gnu/
wineasio_dll_DLL_PATH =
wineasio_dll_DLLS     = odbc32 \
			ole32 \
			winmm
wineasio_dll_LIBRARY_PATH=
wineasio_dll_LIBRARIES= uuid

wineasio_dll_OBJS     = $(wineasio_dll_C_SRCS:.c=.o) \
			$(wineasio_dll_CXX_SRCS:.cpp=.o) \
			$(wineasio_dll_RC_SRCS:.rc=.res)



### Global source lists

C_SRCS                = $(wineasio_dll_C_SRCS)
CXX_SRCS              = $(wineasio_dll_CXX_SRCS)
RC_SRCS               = $(wineasio_dll_RC_SRCS)


### Tools

CC = gcc
CXX = g++
WINECC = winegcc-stable
RC = wrc


### Generic targets

all: asio.h $(SUBDIRS) $(DLLS:%=%.so) $(EXES:%=%.so)

### Build rules

.PHONY: all clean dummy

$(SUBDIRS): dummy
	@cd $@ && $(MAKE)

# Implicit rules

.SUFFIXES: .cpp .rc .res
DEFINCL = $(INCLUDE_PATH) $(DEFINES) $(OPTIONS)

.c.o:
	$(CC) -c $(DEFINCL) $(CFLAGS) $(CEXTRA) -o $@ $<

.cpp.o:
	$(CXX) -c $(CXXFLAGS) $(CXXEXTRA) $(DEFINCL) -o $@ $<

.cxx.o:
	$(CXX) -c $(CXXFLAGS) $(CXXEXTRA) $(DEFINCL) -o $@ $<

.rc.res:
	$(RC) $(RCFLAGS) $(RCEXTRA) $(DEFINCL) -fo$@ $<

# Rules for cleaning

CLEAN_FILES     = y.tab.c y.tab.h lex.yy.c core *.orig *.rej \
                  \\\#*\\\# *~ *% .\\\#*

clean:: $(SUBDIRS:%=%/__clean__) $(EXTRASUBDIRS:%=%/__clean__)
	$(RM) $(CLEAN_FILES) $(RC_SRCS:.rc=.res) $(C_SRCS:.c=.o) $(CXX_SRCS:.cpp=.o)
	$(RM) $(DLLS:%=%.so) $(EXES:%=%.so) $(EXES:%.exe=%)

$(SUBDIRS:%=%/__clean__): dummy
	cd `dirname $@` && $(MAKE) clean

$(EXTRASUBDIRS:%=%/__clean__): dummy
	-cd `dirname $@` && $(RM) $(CLEAN_FILES)

distclean:: clean
	$(RM) asio.h

### Target specific build rules
DEFLIB = $(LIBRARY_PATH) $(LIBRARIES) $(DLL_PATH)

$(wineasio_dll_MODULE).so: $(wineasio_dll_OBJS)
	$(WINECC) $(wineasio_dll_LDFLAGS) -o $@ $(wineasio_dll_OBJS) $(wineasio_dll_LIBRARY_PATH) $(DEFLIB) $(wineasio_dll_DLLS:%=-l%) $(wineasio_dll_LIBRARIES:%=-l%)

install:
	if [ -d $(PREFIX)/lib32/wine ]; then cp wineasio.dll.so $(DESTDIR)$(PREFIX)/lib32/wine; else cp wineasio.dll.so $(DESTDIR)$(PREFIX)/lib/wine; fi

meliafaro ★★★★★
() автор топика

при чем в самой арче нет пакета «steinberg-asio», хател его попробывать на арче сча собрать но такого нету)))

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

а да, нашел, makepkg не подтягивает зависимости из аура... сча попробую снова

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

а у меня собрался

при чем компиляция почти моментальная

safocl ★★
()

могу скомпилированные бинарники скинуть, у меня i3 2100 проц, но оптимизация вроде sandybridge стоит, могу поставить флаг !cflags (вроде так, чо бы не использовались флаги компиляции)

safocl ★★
()

и кстати опиши полные свои действия при компиляции, ибо если ты прям все делаешь из PKGBUILD'а, то там есть переменные, которые тока makepkg понимает, такие как $CARCH. тебе надо енто пропускать.

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

Благодарю! Уже сам собрал. Оказалось, надо явно указать для make соответствующий Makefile:

make -f Makefile
В Арче почему-то без этого собирается.

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

потому чо там в билде сказано:

  if [[ "$CARCH" == x86_64 ]]; then
    make -f Makefile64
    mv "$pkgname".dll.so "$pkgname".dll.so.x86_64
    cp asio.h.i686 asio.h
    make clean
    make
  else
    make
  fi

где $CARCH внутренняя переменная makepkg, которая устанавливается в его конфигурационном файле и у меня она x86_64.

и п.с. там надо выбирать для 64битной системы Makefile64

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

Для 64-битного вариаанта я так и сделал, у меня не собирался именно 32-битный вариант, в случае которого также пришлось сделать явное указание на файл.

meliafaro ★★★★★
() автор топика

Для каждой 32-битной библиотеки, которую компилятор не видит, нужно создать симлинк. cd /usr/lib32; sudo ln -s libuuid.so.1 libuuid.so

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

Пришлось так и сделать. Конечно, ужасно костыльное решение, но ничего лучше не придумал.

meliafaro ★★★★★
() автор топика

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

Предполагается, что в системе уже включена поддержка 32-битной архитектуры и установлены базовые пакеты, необходимые для сборки, а также ed - он необходим для скрипта из исходников.

Ставим jack 2, в т. ч. dev-пакеты и 32-битные версии библиотек:

$ sudo apt-get install jackd2 libjack-jackd2-0 libjack-jackd2:i386 libjack-jackd2-dev libjack-jackd2-dev:i386

Ставим wine-development, в т. ч. dev-пакеты и 32-битные версии библиотек:

$ sudo apt-get install wine-development libwine-development-dev libwine-development-dev:i386

Ставим 32-битную dev-версию libc:

$ sudo apt-get install libc6-dev:i386

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

Скачиваем и распаковываем исходники WineASIO с https://sourceforge.net/projects/wineasio/.

Теперь нам нужно слегка подправить исходный код и Makefile-ы с учётом специфики Debian. Открываем файлы с исходным кодом - main.c, asio.c и regsvr.c и заменяем строки

#include "wine/debug.h"
на
#include "wine-development/debug.h"

Правим Makefile и Makefile64 - в 16 строке, в переменной INCLUDE_PATH везде заменяем wine на wine-development. В переменной wineasio_dll_LDFLAGS в 30 строке заменяем оригинальные пути на специфичные для deb-based дистрибутивов:

-L/usr/lib/i386-linux-gnu/wine-development/ \
-L/usr/lib/i386-linux-gnu/ \
для Makefile и
-L/usr/lib/x86_64-linux-gnu/wine-development \
-L/usr/lib/x86_64-linux-gnu/ \
для Makefile64.

Скачиваем ASIO_SDK c https://www.steinberg.net/index.php?id=48&L=1, вытаскиваем оттуда asio.h и кидаем в каталог с исходниками.

Собираем и устанавливаем:

make -а Makefile
sudo cp wineasio.dll.so /usr/lib/i386-linux-gnu/wine-development
make clean
bash ./prepare_64bit_asio
make -a Makefile64
sudo cp wineasio.dll.so /usr/lib/x86_64-linux-gnu/wine-development

Исправляем некорректную линковку:

sudo ln -s /usr/lib/x86_64-linux-gnu/wine-development/libwine.so.1.0 /usr/lib/x86_64-linux-gnu/libwine.so.1
sudo ln -s /usr/lib/i386-linux-gnu/wine-development/libwine.so.1.0 /usr/lib/i386-linux-gnu/libwine.so.1
# на всякий
sudo ldconfig

Регистрируем dll-ки:

# 64-битную
WINEPREFIX=/path/to/prefix wine64 regsvr32 wineasio.dll
# 32-битную
WINEPREFIX=/path/to/prefix regsvr32 wineasio.dll

Ну вот как-то так.

meliafaro ★★★★★
() автор топика

Лол, занимаюсь сейчас ровно той же самой задачей, но под убунтой. 64-битное вино собирается без проблем, 32-битное не собирается и доустановкой библиотек проблему не решить, потому что убунта не предоставляет весь необходимый набор 32-битных библиотек, иначе это приводит к конфликтам в системе.

В winehq wiki есть целая специальная страница по этому поводу, предлагают использовать костыль по типу chroot — https://wiki.winehq.org/Building_Biarch_Wine_On_Ubuntu

Есть ли вообще дистры, где задачу можно решить без костылей (и без скатывания в маргинальность)?

anonymous
()
Ответ на: комментарий от zezic

Оно и успользуется уже давно, просто под новым Debian никак не хотел собираться и работать. Reaper в основном, ну и по мелочи - Cubase для старых проектов, iZotope RX, Melodyne и всё такое.

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

Ну вот за это и не люблю deb-based системы - пакеты порублены мелко, зависимости протянуты как паутина, да ещё и очень жестко выставлены. Например, ставишь из бэкпортов условный foobar-1.0.1+patch001, а вся система требует строго =foobar-1.0.0, и всё, пошло-поехало, в результате какой-нибудь вшивый .so может потребовать полсистемы снести с DE и иксами. И никак не разгребёшь этот ад без жуткого пердолинга.

Посоветовать Арч могу или его более демократичные производные, там с этим проще простого - в одном скрипте тебе и зависимости правятся, весь процесс конфигурирования и сборки, и установка куда захочешь, можешь хоть 10 вайнов поставить разных версий. Если бы у Арча была бы стабильная ветка, как в Debian, без RR, я бы вообще с него не слезал бы.

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

Есть ли вообще дистры, где задачу можно решить без костылей (и без скатывания в маргинальность)?

Я под центось 7 собираю WoW64 (два вайна по сути 32+64 которые ставятся sxs и общий лоадер), плюс staging, всё решается отлично без костылей, не знаю правда что значит "скатывание в маргинальность".

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

В данном случае всё сложно из-за а) обязательной мультиархитектурности, б) из-за некоторых особенностей Debian, отличающих его от других дистрибутивов.

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

Я подумывал над этим вариантом, но очень уж там мало софта из коробки, полсистемы придётся дособирать.

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

Без стейджинга, mpg123, openal и opencl конкретно этот wine супротив пустой базовой центоси собирается. Я специально там в спеке переключалки bcond_without именно таким образом сделал. Впрочем, это всё дополнительное на том же гитхабе валяется.

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

YMMV, но мне лично оказалось проще на пустой системе дособрать, чем бодаться с %бнутыми майнтейнерами. Тем более что эти "полсистемы" у меня и так были как побочный продукт от основной работы.

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

Полагаю, из-за использования несвободного штейнберговского СДК. Да и проект маленький, узкоспециализированный, почти не развивается, последняя версия вышла в 2013, если не ошибаюсь.

meliafaro ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.