On Thu, Sep 14, 2023 at 10:25 AM Arsen Arsenović <ar...@gentoo.org> wrote:
> Madhu <enom...@meer.net> writes:
> > systemd-udev cannot be built as a static binary again presumably a
> > carefully thought out design decision behind its design and
> > philosophy.
>
> Since static linking is seldom a good idea, it is more likely that
> simply nobody bothered.  I don't recall any udev components in systemd
> v249 (which is the version I attempted to rebase eudev on top of) which
> can't be static linked.

The main issue is symbol conflicts with several major projects.

systemd makes careful use of ELF symbol visibility (hidden symbols) to
prevent conflicts when libudev or libsystemd are linked with other
projects.

As I understand it, it is up to the linker to apply any visibility
rules. This doesn't work for static libs since the linker isn't
actually involved in their creation. A static library is really just
an archive with a bunch of unlinked ELF objects.

Since the symbol visibility rules are not applied, attempting to link
against libudev.a or libsystemd.a leads to symbol conflicts in
packages like LVM2 and cryptsetup. There are some Gentoo bug reports
about this, but I can't find them immediately.

The systemd project (upstream) has chosen not to work around these
conflicts by renaming symbols, and instead chooses not to support
static linking at all. They see static libs as being defective by
design. If the symbol visibility issue could be resolved at the
toolchain level, they would probably be more willing to support it.

Reply via email to