I just rebuilt my glibc, optimizing the build for my particular CPU. I was amazed at how much more speed it brought me on this >5-year-old laptop, 2G RAM, dual-core 2 GHz Intel. Here’s what I did. If you’re following this, bear in mind that version numbers will have to be changed as development goes on!
- Get everything you need to build glibc. You may very well discover more packages to install if errors show up further down, depending on how you installed Debian to begin with.
apt-get build-dep glibc
- Create a folder for your build, and get the current source.
cd ~/Downloads; mkdir glibc-recompile; cd glibc-recompile; apt-get source glibc
- Edit a few files to set the optimization.
First change directory here: cd ~/Downloads/glibc-recompile/glibc-2.19/debian
Now edit the file named rules
, and look for these two lines:
BUILD_CFLAGS = -O2 -g HOST_CFLAGS = -pipe -O2 -g $(call xx,extra_cflags)
Change them as follows:
BUILD_CFLAGS = -O2 -march=native -mtune=native HOST_CFLAGS = -pipe -O2 $(call xx,extra_cflags) -march=native -mtune=native
Now change to here: cd ~/Downloads/glibc-recompile/glibc-2.19/debian/sysdeps
You’ll now want to edit the file x32.mk
, find this line:
i386_extra_cflags = -march=pentium4 -mtune=generic
and change it to:
i386_extra_cflags = -march=native -mtune=native
Then, if your CPU is Intel/AMD-compatible and your OS is 32-bit, you’ll want to edit i386.mk
, find this:
i686_extra_cflags = -march=i686 -mtune=generic
and change it to this:
i686_extra_cflags = -march=native -mtune=native
and also find this:
xen_extra_cflags = -march=i686 -mtune=generic -mno-tls-direct-seg-refs
and change it to:
xen_extra_cflags = -march=native -mtune=native -mno-tls-direct-seg-refs
and if you’re Intel-compatible but your OS is 64-bit, edit amd64.mk
, find this:
i386_extra_cflags = -march=pentium4 -mtune=generic
and change it to this:
i386_extra_cflags = -march=native -mtune=native
If you are running outside of the Intel/AMD world, you’ll want to find the correct file at this point for your CPU and make the same sort of setting, the idea is that “native” refers to whatever CPU on which the compiler finds itself running.
- Use Debian packaging tools to set a local package version. The last command in the string below will load the appropriate file in an editor:
cd ~/Downloads/glibc-recompile/glibc-2.19/debian ; dch
At this writing the original is “2.19-13”, and dch has already added this to the top:
glibc (2.19-13.1) UNRELEASED; urgency=medium
and I changed that top line to this:
glibc (2.19-13+local-native.1) UNRELEASED; urgency=medium
and then we save and close. dch then takes care of telling the other files that this local version is legit, and renames the package directory to match, which prepares us for the next step.
- Create a .tar.gz of the new source tree.
cd ~/Downloads/glibc-recompile ; tar czvf glibc_2.19-13+local.orig.tar.gz glibc-2.19-13+local
- Begin the build.
cd ~/Downloads/glibc-recompile/glibc-2.19-13+local ; debuild -us -uc
At this point you may discover additional packages which are needed. Install them, and begin #6 again. Otherwise it will generate several .deb files one level up, in ~/Downloads/glibc-recompile
.
- Install the .deb files.
First traverse here:
cd ~/Downloads/glibc-recompile/
Then try to install them all:
sudo dpkg -i *.deb
You may get errors related to the presence of libc6
or libc6_2.19-13+local-native.1_i386.deb
. If you do, install this one individually:
sudo dpkg -i libc6_2.19-13+local-native.1_i386.deb
and then do them all again:
sudo dpkg -i *.deb
Then reboot, and see!