LWN.net Logo

Link-time optimization for the kernel

Link-time optimization for the kernel

Posted Aug 22, 2012 8:15 UTC (Wed) by jezuch (subscriber, #52988)
Parent article: Link-time optimization for the kernel

AFAIK there's another benefit of LTO: it can merge identical functions and data from multiple object files. This is especially beneficial for C++, where, for example, every time one #includes <cstream>, the compiler generates several stubs which turn out to be identical and unnecessarily duplicated. This and other optimizations usually result in about 10% reduction in the final binary's size.

That said, I notice that the kernel actually grows with LTO. The modules do get smaller - especially large ones like GPU and filesystem drivers - but not vmlinuz.

Oh, and the development version which will become GCC 4.8 reduces memory use even further. So much that it can actually build itself on my machine with 8 gigs of ram, although with some swapping :)


(Log in to post comments)

Link-time optimization for the kernel

Posted Aug 22, 2012 13:34 UTC (Wed) by jwakely (subscriber, #60262) [Link]

> it can merge identical functions and data from multiple object files

But in practice does it actually do so?

> every time one #includes <cstream>, the compiler generates several stubs which turn out to be identical and unnecessarily duplicated

I assume you mean <iostream>, and AFAIK LTO doesn't change that situation at all (see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44952 for a suggestion to make it do so, and other suggestions that wouldn't rely on LTO.)

Link-time optimization for the kernel

Posted Aug 22, 2012 13:37 UTC (Wed) by andikleen (subscriber, #39006) [Link]

I don't think that works currently with LTO

There were some linker based approaches for this though (it only really needs a checksum per function)

Link-time optimization for the kernel

Posted Aug 22, 2012 18:19 UTC (Wed) by stevenb (guest, #11536) [Link]

GCC doesn't do this, but AFAIU the gold linker's icf.cc does this. From binutils-2.22:src/gold/icf.cc:

// Identical Code Folding Algorithm
// ----------------------------------
// Detecting identical functions is done here and the basic algorithm
// is as follows. A checksum is computed on each foldable section using
// its contents and relocations. If the symbol name corresponding to
// a relocation is known it is used to compute the checksum. If the
// symbol name is not known the stringified name of the object and the
// section number pointed to by the relocation is used. The checksums
// are stored as keys in a hash map and a section is identical to some
// other section if its checksum is already present in the hash map.
// Checksum collisions are handled by using a multimap and explicitly
// checking the contents when two sections have the same checksum.
//
// However, two functions A and B with identical text but with
// relocations pointing to different foldable sections can be identical if
// the corresponding foldable sections to which their relocations point to
// turn out to be identical. Hence, this checksumming process must be
// done repeatedly until convergence is obtained.

Whether this works with LTO, I don't know. And I suppose it requires -ffunction-sections but I'm not sure about that either.

Not a very helpful post, sorry ;-)

Link-time optimization for the kernel

Posted Aug 22, 2012 22:43 UTC (Wed) by andikleen (subscriber, #39006) [Link]

gold unfortunately does not work with LTO kernel builds at the moment.
You could only use it without.

Link-time optimization for the kernel

Posted Aug 23, 2012 10:05 UTC (Thu) by jwakely (subscriber, #60262) [Link]

No need to apologise, I'd somehow missed that gold did ICF and thought Microsoft's was the only mainstream linker to support it. Thanks, Steven!

Link-time optimization for the kernel

Posted Aug 23, 2012 10:19 UTC (Thu) by mgedmin (subscriber, #34497) [Link]

Wasn't there recently a post about a kernel bug caused by the compiler merging two different functions that turned out to contain identical code? IIRC it was caused by a check of a function pointer in order to determine an object's type misfiring.

Copyright © 2013, Eklektix, Inc.
Comments and public postings are copyrighted by their creators.
Linux is a registered trademark of Linus Torvalds