LINUX.ORG.RU

Компиляция glibc для получения 32-битных библиотек на 64 битной системе

 , , , ,


0

1

Имеется porteus базированный на slackware. Хочу скомпилировать wine, но мне во время компиляции пишет следующее:

checking for ld... ld
checking whether gcc -m32 works... no
configure: error: Cannot build a 32-bit program, you need to install 32-bit development libraries.

На ubuntu нужно сделать лишь apt-get install gcc-multilib, но вот в porteus, я пытался установить эти библиотеки разработчиков по этой инструкции https://docs.slackware.com/ru:slackware:multilib . Появляются только ошибки связанные с glibc и компилятор в добавок ломается. Попробовал скомпилировать glibc из исходников. Это получается, но нужны 32 битные библиотеки, потому-что проверочный хелловорлд (proba.c):

#include<stdio.h>
int main() {printf ("This\n");}

не компилируется на 32-битной архитектуре:

root@porteus:/# gcc -m32 /mnt/sda3/proba.c 
In file included from /usr/include/features.h:474,
                 from /usr/include/bits/libc-header-start.h:33,
                 from /usr/include/stdio.h:27,
                 from /mnt/sda3/proba.c:1:
/usr/include/gnu/stubs.h:7:11: fatal error: gnu/stubs-32.h: No such file or directory
    7 | # include <gnu/stubs-32.h>
      |           ^~~~~~~~~~~~~~~~
compilation terminated.

root@porteus:/# gcc /mnt/sda3/proba.c 
root@porteus:/# ./a.out 
This

Но на 64, всё хорошо.

Вопросы. Как мне добавить 32-битные библиотеки разработчика для компиляции wine? Или с каким флагом указать компилятору создавать мультифиблиотечные библиотеки?

Вот какие флаги использую для компиляции glibc.

../configure --prefix=`pwd`/libc

Возможно нужно добавлять флаги –libdir и указывать на 32-битные библиотеки, но не уверен, что у меня появится stubs-32.h в директории include/gnu без дополнительных флагов. Есть ещё –enable-multi-arch, но думаю, что это не то. -m32 не работает для компиляции. Потому что не знаю как менять значения компиляции по умолчанию. Где их найти или название переменной где записаны для gcc g++.

Вот ещё. есть флаг –disable-multilib

root@porteus:# gcc -v
Reading specs from /usr/lib64/gcc/x86_64-slackware-linux/9.1.0/specs
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-slackware-linux/9.1.0/lto-wrapper
Target: x86_64-slackware-linux
Configured with: ../gcc-9.1.0/configure --... --... --disable-multilib --... --...
Thread model: posix
gcc version 9.1.0 (GCC) 

Вопрос в том, как его изменить на –enable-multilib и если я буду компилировать с ним, то будет ли включена поддержка мультибиблиотечности? (дальше странный вопрос, на который хочется ответ) Он включается так ./configure –enable-multilib? или надо в make задавать? make –enable-multilib

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

У ubuntu такой список пакетов, который устанавливается после apt-get install gcc-multilib

gcc-9-multilib gcc-multilib lib32asan5 lib32atomic1 lib32gcc-9-dev
  lib32gomp1 lib32itm1 lib32quadmath0 lib32ubsan1 libc6-dev-i386 libc6-dev-x32
  libc6-x32 libx32asan5 libx32atomic1 libx32gcc-9-dev libx32gcc-s1 libx32gomp1
  libx32itm1 libx32quadmath0 libx32stdc++6 libx32ubsan1

Перемещено Shaman007 из admin

32 bit libc dev

первый результат в гугле(но и так можно было догадаться)

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

Для debian и ubuntu там полно ссылок, соглашусь, но как мне скомпилировать исходник, чтобы я получил stubs-32.h, а не stubs-64.h? Для slackware это работает, а на porteus нужно перекомпилировать из-за проблем с версиями glibc

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

К сожалению, я в этом не сильно разбираюсь. Вот поэтому хотелось бы разобраться по лучше

SaintAnd ()

Слакбилды мультилибного gcc доступны, их содержимое даст вам однозначный ответ о том, как он собран для Slackware.

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

Слакбилды посмотрел, но проблему решил другим путём. После долгой паузы. Успешно обновил glibc для multilib. Заодно обновился gcc с версии 7.3.0 до 10.3.0.

Но пришлось устанавливать библиотеки isl,zstd,mpc (компилируя на gcc 7.3.0), потому что подключаемые модули (multilib+gcc) сбивали символические ссылки на эти библиотеки. Вот сами ошибки после обновления:

guest@porteus:~$ gcc /mnt/sda3/proba.c 
/usr/libexec/gcc/x86_64-slackware-linux/10.3.0/cc1: error while loading shared libraries: libzstd.so.1: cannot open shared object file: No such file or directory

guest@porteus:~$ ldd /usr/libexec/gcc/x86_64-slackware-linux/10.3.0/cc1
	linux-vdso.so.1 (0x00007ffc339eb000)
	libisl.so.23 => not found
	libmpc.so.3 => not found
	libmpfr.so.6 => /usr/lib64/libmpfr.so.6 (0x00007f9821957000)
	libgmp.so.10 => /usr/lib64/libgmp.so.10 (0x00007f98216e2000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f98216dd000)
	libz.so.1 => /lib64/libz.so.1 (0x00007f98214c6000)
	libzstd.so.1 => not found
	libm.so.6 => /lib64/libm.so.6 (0x00007f982137a000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f982119b000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f9821be5000)

Плюс нужно было установить binutils, потому что писало такую ошибку:

guest@porteus:~$ gcc glib.c
gcc: fatal error: cannot execute ‘as’: execvp: No such file or directory
compilation terminated.
SaintAnd ()
Ответ на: комментарий от SaintAnd

Вернее там не сбивались символические ссылки, а не были установлены те библиотеки, потому что они не хранились в модуле 05-devel.xzm. Поэтому пришлось их компилировать, т.к. бинарников для slackware не нашёл. Хотя я пробовал установить бинарники от разных дистрибутивов, где версия бинарника для libc.so.6 должна быть >= 2.14, но <= моей версии (была у меня GLIBC_2.23). Бинарники искал через сайт pkgs.org:

libzstd.so.1 - AlmaLinux 8 libzstd-1.4.4-1.el8.x86_64.rpm
libmpc.so.3 - CentOS 8 libmpc-1.0.2-9.el8.x86_64.rpm
libisl.so.23 - Debian Sid libisl23_0.23-1_amd64.deb - (здесь пришлось распаковывать дополнительный архив data.tar.xz и из содержимого добавлять библиотеки в директории (делаю модули предусмотренные porteus).

А wine буду брать с https://sourceforge.net/projects/wine/files/Slackware%20Packages/ потому что для компиляции 32 битной wine, требуется устанавливать java, какие-то студии и другое.

SaintAnd ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.