Images 💾

Last commit ⭐

commit c0cf6e3744ac1190ca735d1de8974df1fa90b511
Author:     Daniel Bertalan <dani@danielbertalan.dev>
AuthorDate: Sat Aug 12 00:40:34 2023 +0200
Commit:     Andreas Kling <kling@serenityos.org>
CommitDate: Sat Aug 12 05:14:20 2023 +0200

    CMake: Set `-fvisibility-inlines-hidden` on ELF platforms
    
    The C++ semantics of `inline` dictate that such functions might be
    defined in multiple translation units. As with all other functions, they
    must have the same address in all TUs. Because of this, the compiler
    emits `inline` functions as weak symbols, which the dynamic linker can
    then resolve to the same address everywhere.
    
    This rule is responsible for a significant overhead at startup, as such
    lookups happen by name. Namely, 86'000 of the 114'000 by-name symbol
    lookups when loading LibWeb can be attributed to this. Most of these
    are only ever defined in a single object, making this even more
    pointless.
    
    As nothing in our code relies on either ELF symbol interposition rules
    or function address equality, we can use the -fvisibility-inlines-hidden
    escape hatch, which causes this rule to be disregarded. As the symbols
    are now hidden, no load-time symbol lookup is needed. This flag is used
    without issues in other large C++ codebases like Chromium and LLVM.
    
    Some relevant light reading, suggested by Nico:
    - https://ridiculousfish.com/blog/posts/i-didnt-order-that-so-why-is-it-on-my-bill-episode-1.html
    - https://www.cs.dartmouth.edu/~sergey/cs258/ABI/UlrichDrepper-How-To-Write-Shared-Libraries.pdf
    - https://blog.llvm.org/2018/11/30-faster-windows-builds-with-clang-cl_14.html
    - https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Dialect-Options.html#index-fvisibility-inlines-hidden