]> git.ipfire.org Git - thirdparty/xz.git/commit
liblzma: #define lzma_attr_visibility_hidden in common.h.
authorLasse Collin <lasse.collin@tukaani.org>
Sun, 22 Oct 2023 14:08:39 +0000 (17:08 +0300)
committerLasse Collin <lasse.collin@tukaani.org>
Mon, 30 Oct 2023 16:03:39 +0000 (18:03 +0200)
commita2f5ca706acc6f7715b8d260a8c6ed50d7717478
treef6ea15c96b49e4405a3d39ba622ec236fc935e52
parent2c7ee92e44e1e66f0a427555233eb22c78f6c4f8
liblzma: #define lzma_attr_visibility_hidden in common.h.

In ELF shared libs:

-fvisibility=hidden affects definitions of symbols but not
declarations.[*] This doesn't affect direct calls to functions
inside liblzma as a linker can replace a call to lzma_foo@plt
with a call directly to lzma_foo when -fvisibility=hidden is used.

[*] It has to be like this because otherwise every installed
    header file would need to explictly set the symbol visibility
    to default.

When accessing extern variables that aren't defined in the
same translation unit, compiler assumes that the variable has
the default visibility and thus indirection is needed. Unlike
function calls, linker cannot optimize this.

Using __attribute__((__visibility__("hidden"))) with the extern
variable declarations tells the compiler that indirection isn't
needed because the definition is in the same shared library.

About 15+ years ago, someone told me that it would be good if
the CRC tables would be defined in the same translation unit
as the C code of the CRC functions. While I understood that it
could help a tiny amount, I didn't want to change the code because
a separate translation unit for the CRC tables was needed for the
x86 assembly code anyway. But when visibility attributes are
supported, simply marking the extern declaration with the
hidden attribute will get identical result. When there are only
a few affected variables, this is trivial to do. I wish I had
understood this back then already.
src/liblzma/common/common.h