This article contains instructions on how to create a true multilib Slackware64. A multilib 64bit Linux system is capable of running 64bit as well as 32bit software. The Filesystem Hierarchy Standard documents the optimal method to achieve a clean separation between 64bit and 32bit software on a single system. When starting with the development of “Slackware64” (the official port to the x86_64 architecture) we chose to adopt this standard. Therefore Slackware64 has been configured to look for 64bit libraries in /lib64
and /usr/lib64
directories. This is why I call Slackware64 “multilib-ready” - even though 32bit libraries will be looked for in /lib
and /usr/lib
, Slackware64 does not ship with any 32bit software. There is one more step that must be taken (by you, the user) before Slackware64 can be called “multilib-enabled”.
This is accomplished as follows:
When Slackware64 was released, it had an advantage over the 64bit “forks” that existed out there. These forks added the 32bit compatibility layer by recompiling a lot of their packages as 32bit binaries. Slackware on the other hand, is a distribution that consists of a 32bit and 64bit release, both of which are being developed in parallel. This means, that you do not have to compile 32-bit packages from scratch in order to add multilib capability to the 64bit system. You simply take them from the 32-bit Slackware package tree!
This was one of the reasons for not adding full multilib to Slackware64 - we create the right preconditions but require the user to act if she needs multilib.
In a section further down, I will explain how you can take a 32-bit Slackware package (say, the “mesa” package) and re-package its content into a “mesa-compat32” package that you can install straight away on Slackware64.
I will give some examples of programs that require multilib support on a 64bit Slackware because they will not start or compile on Slackware64 without the 32bit compatibility layer:
Luckily, 64bit support is becoming more and more common. Adobe was a sore point for a long time, but they eventually released their Flash browser plugin in a 64bit version. Sun (now absorbed by Oracle) revealed a 64bit version of their Java browser plugin. These two events were major triggers to start working on Slackware64.
You can download a set of multilib-enabled packages and scripts from my web site: http://slackware.com/~alien/multilib/ .
Apart from several README files (this Wiki article basically is an enhanced version of one of these READMEs), you will find one subdirectory for every 64-bit Slackware release below the toplevel directory “multilib”. There is another directory called “source”. The “source” directory contains package sources and SlackBuild scripts.
The stuff that you are really interested in - the binary packages - is available in the <slackware_release_number> directory below the toplevel directory. Every such directory also contains a “slackware64-compat32” subdirectory where you will find an essential set of converted 32-bit Slackware packages, ready for installing on your 64-bit Slackware.
In order to keep up to date, I advise you to keep an eye on the ChangeLog (RSS feed) which I maintain for my multilib packages. Usually, I will have updated glibc and gcc packages available within a day after Slackware has updates to gcc and glibc.
Automation:
# slackpkg update # slackpkg upgrade multilib # slackpkg install multilib
That last command will show you if any new packages were added to the collection of “compat32” packages, such as llvm-compat32 and orc-compat32 recently.
SLACKPKGPLUS=on VERBOSE=1 ALLOW32BIT=off USEBL=1 WGETOPTS="--timeout=5 --tries=1" GREYLIST=on PKGS_PRIORITY=( multilib restricted alienbob ktown ) REPOPLUS=( slackpkgplus multilib restricted alienbob ktown ) MIRRORPLUS['multilib']=https://slackware.nl/people/alien/multilib/current/ MIRRORPLUS['alienbob']=https://slackware.nl/people/alien/sbrepos/current/x86_64/ MIRRORPLUS['restricted']=https://slackware.nl/people/alien/restricted_sbrepos/current/x86_64/ MIRRORPLUS['ktown']=https://slackware.nl/alien-kde/current/latest/x86_64/ MIRRORPLUS['slackpkgplus']=https://slackware.nl/slackpkgplus/
This section contains the essential instructions to add full multilib capability to your Slackware64 system. If you want to understand the process in more detail, or need information on how to compile 32bit software in Slackware64, you should also read the sections that follow.
Note that the “#
” in front of the commands depicts a root prompt.
# SLACKVER=15.0 # mkdir multilib # cd multilib # lftp -c "open http://slackware.nl/people/alien/multilib/ ; mirror -c -e ${SLACKVER}" # cd ${SLACKVER}
# upgradepkg --reinstall --install-new *.t?z
after you changed to the directory where you downloaded these packages.
This command will also install an additional package called “compat32-tools”.
lftp
” command will have done that) then you are lucky, because I did the 32bit package conversion for you already! All you do is run the command: # upgradepkg --install-new slackware64-compat32/*-compat32/*.t?z
which will install all the converted 32-bit Slackware packages (or upgrade them if you already had installed older multilib packages, for instance when you are upgrading to a newer Slackware). That's all!
/home/ftp/pub/slackware/slackware-15.0/slackware/
”./media/SlackDVD/slackware/
” but I will not use that in the example commands below).# mkdir slackware64-compat32 ; cd slackware64-compat32
# massconvert32.sh -i /home/ftp/pub/slackware/slackware-15.0/slackware/
# upgradepkg --install-new *-compat32/*.t?z
glibc
and gcc
package names to its package blacklist. If you do not take this precaution, you run the risk of your package manager accidentally replacing your multilib versions with Slackware's original pure 64-bit versions!/etc/slackpkg/blacklist
will be enough to blacklist all of my packages (including multilib gcc and glibc packages and all compat32
packages): [0-9]+alien [0-9]+compat32
On the other hand, if you are using the slackpkg extension called slackpkg+ then you should definitely not blacklist these packages, because that prevents slackpkg+ from managing them!
# massconvert32.sh -u http://someserver.org/path/to/slackware-15.0/slackware
The following glibc/gcc packages are replacements for - not additions to - standard Slackware packages. You use the “upgradepkg
” program to upgrade to my multilib versions of gcc and glibc. You will need these in order to run (glibc), and build (gcc), 32-bit software on your 64-bit Slackware computer:
gcc-java
package because its development has ceased.
glibc-zoneinfo
package is not a part of multilib, since it does not contain code. You need to install Slackware's stock glibc-zoneinfo
package.
There is one additional package that you need to install using the “installpkg” program. The actual version may vary for each release of Slackware, but the package can be found in the same directory where you also find the multilib versions of gcc
and glibc
:
The upgrade of glibc and gcc which I described in the previous section changes your system from “multilib-ready” to “multilib-enabled”.
Now, all you need to do is to install 32bit versions of Slackware's system software so that future 32bit programs that you are going to install and/or compile will find all the 32bit libraries they need in order to work.
This is not as simple as grabbing 32bit Slackware packages and installing them in Slackware64:
/usr/bin/foo
), they will overwrite their 64bit counterparts when you install the 32bit package on top. It will seriously mess up your system if that happens.A little bit of extra care is required so that unnecessary/unwanted files are stripped from the 32bit packages before you install them. What you need, is a 32bit package that does not conflict with whatever is already present in 64bit Slackware. Hence the name “32bit compatibility package”.
I decided that it would be a waste of download bandwidth if I created 32bit compatibility versions of Slackware packages myself. After all, you have probably bought the Slackware 14.2 DVD so you already possess both 64bit and 32bit versions of Slackware… or else the 32bit Slackware tree is available for free download of course
Instead, I wrote a few scripts (parts of the script code were written by Fred Emmott of Slamd64 fame) and wrapped these into a “compat32-tools” package. Their purpose is to let you extract the content from any 32bit Slackware package and use that to create a new package which you can safely install on your 64bit Slackware.
This “compat32-tools” package needs some explanation.
Please read the detailed 'README' file in the /usr/doc/compat32-tools-*/
directory, it will help you on your way. These are the three useful scripts which the package installs:
x/mesa-7.5-i486-1.txz
) and then run # convertpkg-compat32 -i /path/to/mesa-7.5-i486-1.txz
which will create a new package called mesa-compat32-7.5-x86_64-1compat32.txz
. This new package (which is created in your /tmp
directory unless you specified another destination) is basically the old 32bit package, but stripped from non-essential stuff. The changed basename (mesa becomes mesa-compat32) allows you to install this new package in Slackware64 where it will co-exist with the 64bit mesa package, not overwriting any files.
The script leaves temporary files in the directory “/tmp/package-<prgnam>-compat32
” which you can safely delete.
/mnt/dvd
): # massconvert32.sh -i /mnt/dvd/slackware -d ~/compat32
This action will result in about 150 MB of new packages which you will find inside the newly created directory ~/compat32
(the directory's name is arbitrary of course, I chose it for the sake of this example). These packages comprise the 32bit component of your multilib Slackware64 system.
They should be installed using “installpkg
”, and they give you a pretty complete 32-bit compatibility layer on top of Slackware64:
# installpkg ~/compat32/*/*.t?z
If you are upgrading from an earlier version of these packages (because for instance you upgraded your 64-bit Slackware to a newer release) then you do not use “installpkg
” of course, but “upgradepkg –install-new
” instead:
# upgradepkg --install-new ~/compat32/*/*.t?z
The “–install-new” parameter is needed to install the new compat32
packages which were added between releases.
compat32
packages you will notice that some will show errors about missing files in /etc
. This is “by design”, and these errors can be ignored. These messages are caused by the fact that files in /etc
are removed from a “-compat32” package during conversion (except for pango and gtk+2). I assume that files in /etc
will already have been installed by the original 64bit packages.cups-compat32
package: Executing install script for cups-compat32-1.3.11-x86_64-1.txz. install/doinst.sh: line 5: [: too many arguments cat: etc/cups/interfaces: Is a directory cat: etc/cups/ppd: Is a directory cat: etc/cups/ssl: Is a directory cat: etc/cups/*.new: No such file or directory cat: etc/dbus-1/system.d/cups.conf.new: No such file or directory chmod: cannot access `etc/rc.d/rc.cups.new': No such file or directory cat: etc/rc.d/rc.cups.new: No such file or directory Package cups-compat32-1.3.11-x86_64-1.txz installed.
convertpkg-compat32
script to convert a non-Slackware package to a -compat32 package, I must strongly advise against this. The script is written with a single purpose and that is to make 32bit versions of the official Slackware64 binaries/libraries available in a multilib setup. As such, the script will remove a lot of stuff that is present in the original 32bit package - stuff which is expected to have been installed as part of the 64bit version of the package.Running a pre-compiled 32-bit program is easy after you've done the above system preparation. Just download, install and run it!
At times, you may run into a program that requires a certain 32-bit Slackware library that you do not yet have available. In that case, find out which 32bit Slackware package contains this missing library. Use the “convertpkg-compat32” script to convert that original 32bit Slackware package and install the resulting 32bit “compatibility” package on Slackware64.
In case you need to compile a 32-bit program (wine and grub are two examples of open source programs that are 32-bit only) you first configure root's shell environment by running the command:
# . /etc/profile.d/32dev.sh
Note the 'dot' at the beginning of the line - that is actually part of the commandline! The use of the dot is equivalent to the 'source' command.
Running this command changes or creates several environment variables. The effect of this is, that 32-bit versions of binaries are preferred over 64bit binaries when you compile source code - you will be running a 32bit compilation. The effect will last until you logout from your root shell.
In this changed environment, you will be able to use standard SlackBuilds to build 32-bit packages for Slackware64. There's a couple of things to keep in mind:
# convertpkg-compat32 -i /path/to/your/fresh/foo-VERSION-i486-BUILD.tgz # upgradepkg --install-new /tmp/foo-compat32-VERSION-x86_64-BUILDcompat32.txz
-compat32
” packages, you may have to re-install your binary Nvidia or Ati video X.Org drivers. These driver packages contain both 64bit and 32bit libraries to be maximally useful on a 64bit multilib OS. If you installed the driver files for both architectures, the “mesa-compat32
” package will overwrite some of the 32bit library files.
This is the list of packages that is converted into “-compat32” versions by the massconvert32.sh
script. Note that some of these packages are not part of older Slackware releases, they were added in a later Slackware version so they will produce a “* FAIL: package 'package_name' was not found!” message when you run the script on an older release. The other way round is true as well - some packages have been removed in later versions of Slackware and they will also trigger the “* FAIL: package 'package_name' was not found!” message. Don't worry about that.
# The A/ series: aaa_elflibs aaa_libraries attr bzip2 cracklib cups cxxlibs dbus e2fsprogs elogind eudev libgudev libpwquality lzlib openssl-solibs openssl10-solibs openssl11-solibs pam plzip udev util-linux xz # The AP/ series: cdparanoia cups cups-filters flac lm_sensors mariadb mpg123 mysql sqlite # The D/ series: libtool llvm opencl-headers # The L/ series: Imath Mako SDL2 SDL2_gfx SDL2_image SDL2_mixer SDL2_net SDL2_ttf aalib alsa-lib alsa-oss alsa-plugins atk at-spi2-atk at-spi2-core audiofile brotli cairo dbus-glib elfutils esound expat ffmpeg fftw fluidsynth freetype fribidi gamin gc gdk-pixbuf2 gdk-pixbuf2-xlib giflib glib2 gmp gnome-keyring gobject-introspection graphene graphite2 gtk+2 gtk+3 gst-plugins-bad-free gst-plugins-base gst-plugins-base0 gst-plugins-good gst-plugins-good0 gst-plugins-libav gstreamer gstreamer0 hal harfbuzz icu4c isl jansson jasper json-c json-glib keyutils lame lcms lcms2 libaio libarchive libart_lgpl libasyncns libbluray libcaca libcap libcdio libcdio-paranoia libclc libcroco libdbusmenu libdeflate libdvdnav libedit libelf libexif libffi libglade libgnt libgphoto2 libidn libidn2 libieee1284 libjpeg libjpeg-turbo libmad libmng libmpc libnice libnl3 libnsl libnotify libnss_nis libogg libpcap libpng librsvg libsamplerate libsigc++3 libsndfile libssh libtasn1 libtermcap libtheora libtiff libunistring libunwind liburing libusb libvisual libvorbis libvpx libwebp libxkbcommon libxml2 libxslt lmdb lz4 lzo mozilla-nss neon ncurses ocl-icd openal-soft opencv openexr openjpeg opus orc pango pcre pcre2 pipewire polkit popt pulseaudio python-six qrencode qt qt5 readline rpcsvc-proto sbc sdl slang speex speexdsp spirv-llvm-translator startup-notification svgalib taglib talloc tdb tevent v4l-utils vid.stab wavpack woff2 xxHash zlib zstd zxing-cpp # The N/ series: c-ares curl cyrus-sasl gnutls krb5 libgcrypt libgpg-error libtirpc nettle nghttp2 openldap-client openldap openssl p11-kit samba # The X/ series: egl-wayland eglexternalplatform fontconfig freeglut glew glu intel-vaapi-driver libFS libICE libSM libX11 libXScrnSaver libXTrap libXau libXaw libXcomposite libXcursor libXdamage libXdmcp libXevie libXext libXfixes libXfont libXfont2 libXfontcache libXft libXi libXinerama libXmu libXp libXpm libXprintUtil libXrandr libXrender libXres libXt libXtst libXv libXvMC libXxf86dga libXxf86misc libXxf86vm libdmx libdrm libepoxy libfontenc libglvnd libinput libpciaccess libpthread-stubs libva libva-intel-driver libvdpau libwacom libxcb libxshmfence mesa pixman vulkan-sdk wayland xcb-util xcb-util-keysyms xorgproto # The XAP/ series: sane
You can download the multilib packages from (at least) these locations:
Have fun!
Eric