Table of Contents

Adding Multilib Capability to Slackware on x86_64 Architecture

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:

  1. First we need to switch to multilib versions of
    • glibc (i.e. a glibc that supports running both 32bit and 64bit binaries), and
    • gcc (i.e. able to compile 32bit binaries as well as 64bit binaries).
  2. Then, system libraries are taken from 32bit Slackware and installed in the 64bit Slackware system alongside their 64bit versions which completes the process of creating a 32bit compatibility software layer.

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.

Slackware for the x86_64 architecture (or “Slackware64” for short) is a pure 64-bit Operating System, but easily upgradable to multilib. Out of the box, Slackware64 is only capable of compiling and running 64bit binaries.

Advantage of a multilib system

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.

Obtaining multilib packages

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.

Keeping your multilib up-to-date

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:

  1. Check out compat32pkg by Sėbastien Ballet which automates this process, similar to slackpkg.
  2. If you prefer slackpkg for package management, then it is worthwhile to check out slackpkg+, an extension to slackpkg which manages the packages you installed from 3rd-party repositories - including multilib. When properly configured, keeping your multilib is as easy as running:
    # 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.

    • This is how a typical configuration would look like - for a computer running Slackware-current and using Alien BOB's KDE testing repository. The PKGS_PRIORITY ensures that multilib packages of gcc and glibc have precedence over the Slackware originals. The keyword “multilib” which defines the name for the repository must be the same keyword used in the “slackpkg” commands above. The choice of the word “multilib” is arbitrary, it could just as well have been “compat32”, as long as you use it consistently.
      Contents of an example file “/etc/slackpkg/slackpkgplus.conf” would be as follows:
      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/

Enabling multilib support on Slackware64

The quick 'n' dirty instructions

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.

If you use a package manager like slackpkg on Slackware releases older dan 13.37 you will have to add all the 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!
If you run Slackware 13.37 or newer, then slackpkg supports regular expressions in the blacklist file. In that case, a single line in /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!

If you are running Slackware 13.1 or newer, and downloaded the compat32-tools package for that release, the massconvert32.sh script can use a remote webserver to download the 32-bit Slackware packages from, instead of requiring a local Slackware mirror or a DVD. You use the “-u” parameter to specify the remote URL like this:
# massconvert32.sh -u http://someserver.org/path/to/slackware-15.0/slackware

Detailed instructions

Upgrading glibc and gcc

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:

Slackware64 13.0

Slackware64 13.1

Slackware64 13.37

Slackware64 14.0

Slackware64 14.1

Slackware64 14.2

Slackware64 current

Since the update to gcc 7, there is no more gcc-java package because its development has ceased.
The 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.

All releases of Slackware

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:

Adding 32-bit Slackware libraries

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:

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:

When installing the 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.
An example of these “errors” for the 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.
If you were considering to use the 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.
In almost all cases where you have downloaded a non-Slackware 32bit package and want to make it work on Slackware64, the best way is to find the sources and build a 64bit version of the package. Alternatively, just install the original 32bit package instead of trying to “convert it” and then run it from the commandline to find out any missing 32bit libraries you may still have to extract from an official Slackware package.

Running 32-bit programs

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.

Compiling 32-bit programs

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:

  1. You have to define the ARCH variable as 'i486' because even on your 'x86_64' computer you are compiling a 32-bit program!
    This is related to the triplet of “$ARCH-slackware-linux” which is normally used in the “configure” command.
    1. As an exception, you will have to compile the “wine” package with 'ARCH=x86_64' because you will install this package directly on your multilib computer without converting to a 'compat32' package.
  2. If you want to install this 32-bit package on Slackware64-multilib you will have to convert it to a 'compat32' package:
    # convertpkg-compat32 -i /path/to/your/fresh/foo-VERSION-i486-BUILD.tgz
    # upgradepkg --install-new /tmp/foo-compat32-VERSION-x86_64-BUILDcompat32.txz

Caveats

Packages converted by massconvert32.sh

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

Multilib download mirrors

You can download the multilib packages from (at least) these locations:

3rd party support tools

Translations

Acknowledgements

Have fun!

Eric

Sources