andlabs / ui

Platform-native GUI library for Go.
Other
8.33k stars 651 forks source link

(Question) Unnecessary library links on Linux? #344

Closed jclc closed 5 years ago

jclc commented 5 years ago

Using the ui package on Linux adds a whole bunch of .so links, a lot of which are understandable while others are less so.

ldd output:

    linux-vdso.so.1 (0x00007fffaef74000)
    libm.so.6 => /usr/lib/libm.so.6 (0x00007fb7716db000)
    libdl.so.2 => /usr/lib/libdl.so.2 (0x00007fb7716d6000)
    libgtk-3.so.0 => /usr/lib/libgtk-3.so.0 (0x00007fb770f8b000)
    libgdk-3.so.0 => /usr/lib/libgdk-3.so.0 (0x00007fb770e91000)
    libpangocairo-1.0.so.0 => /usr/lib/libpangocairo-1.0.so.0 (0x00007fb770e81000)
    libpango-1.0.so.0 => /usr/lib/libpango-1.0.so.0 (0x00007fb770e35000)
    libatk-1.0.so.0 => /usr/lib/libatk-1.0.so.0 (0x00007fb770e0c000)
    libcairo-gobject.so.2 => /usr/lib/libcairo-gobject.so.2 (0x00007fb770e00000)
    libcairo.so.2 => /usr/lib/libcairo.so.2 (0x00007fb770cd9000)
    libgdk_pixbuf-2.0.so.0 => /usr/lib/libgdk_pixbuf-2.0.so.0 (0x00007fb770cb2000)
    libgio-2.0.so.0 => /usr/lib/libgio-2.0.so.0 (0x00007fb770b10000)
    libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0x00007fb770ab8000)
    libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x00007fb770995000)
    libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fb770974000)
    libc.so.6 => /usr/lib/libc.so.6 (0x00007fb7707b0000)
    librt.so.1 => /usr/lib/librt.so.1 (0x00007fb7707a6000)
    /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fb7719ec000)
    libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0x00007fb7707a0000)
    libX11.so.6 => /usr/lib/libX11.so.6 (0x00007fb77065f000)
    libXi.so.6 => /usr/lib/libXi.so.6 (0x00007fb77064c000)
    libXfixes.so.3 => /usr/lib/libXfixes.so.3 (0x00007fb770446000)
    libatk-bridge-2.0.so.0 => /usr/lib/libatk-bridge-2.0.so.0 (0x00007fb770412000)
    libepoxy.so.0 => /usr/lib/libepoxy.so.0 (0x00007fb7702e3000)
    libharfbuzz.so.0 => /usr/lib/libharfbuzz.so.0 (0x00007fb7701e2000)
    libpangoft2-1.0.so.0 => /usr/lib/libpangoft2-1.0.so.0 (0x00007fb7701c9000)
    libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x00007fb770182000)
    libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x00007fb76feb9000)
    libXinerama.so.1 => /usr/lib/libXinerama.so.1 (0x00007fb76fcb6000)
    libXrandr.so.2 => /usr/lib/libXrandr.so.2 (0x00007fb76faab000)
    libXcursor.so.1 => /usr/lib/libXcursor.so.1 (0x00007fb76f8a1000)
    libXcomposite.so.1 => /usr/lib/libXcomposite.so.1 (0x00007fb76f69c000)
    libXdamage.so.1 => /usr/lib/libXdamage.so.1 (0x00007fb76f499000)
    libxkbcommon.so.0 => /usr/lib/libxkbcommon.so.0 (0x00007fb76f25a000)
    libwayland-cursor.so.0 => /usr/lib/libwayland-cursor.so.0 (0x00007fb76f251000)
    libwayland-egl.so.1 => /usr/lib/libwayland-egl.so.1 (0x00007fb76f24c000)
    libwayland-client.so.0 => /usr/lib/libwayland-client.so.0 (0x00007fb76f23b000)
    libXext.so.6 => /usr/lib/libXext.so.6 (0x00007fb76f027000)
    libthai.so.0 => /usr/lib/libthai.so.0 (0x00007fb76f01c000)
    libfribidi.so.0 => /usr/lib/libfribidi.so.0 (0x00007fb76ee00000)
    libpixman-1.so.0 => /usr/lib/libpixman-1.so.0 (0x00007fb76ed59000)
    libpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007fb76ed21000)
    libxcb-shm.so.0 => /usr/lib/libxcb-shm.so.0 (0x00007fb76ed1a000)
    libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007fb76ecf0000)
    libxcb-render.so.0 => /usr/lib/libxcb-render.so.0 (0x00007fb76ece0000)
    libXrender.so.1 => /usr/lib/libXrender.so.1 (0x00007fb76ecd3000)
    libz.so.1 => /usr/lib/libz.so.1 (0x00007fb76eabc000)
    libmount.so.1 => /usr/lib/libmount.so.1 (0x00007fb76ea5e000)
    libresolv.so.2 => /usr/lib/libresolv.so.2 (0x00007fb76ea43000)
    libffi.so.6 => /usr/lib/libffi.so.6 (0x00007fb76ea38000)
    libpcre.so.1 => /usr/lib/libpcre.so.1 (0x00007fb76e9c5000)
    libdbus-1.so.3 => /usr/lib/libdbus-1.so.3 (0x00007fb76e972000)
    libatspi.so.0 => /usr/lib/libatspi.so.0 (0x00007fb76e93e000)
    libgraphite2.so.3 => /usr/lib/libgraphite2.so.3 (0x00007fb76e917000)
    libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00007fb76e8db000)
    libuuid.so.1 => /usr/lib/libuuid.so.1 (0x00007fb76e8d2000)
    libbz2.so.1.0 => /usr/lib/libbz2.so.1.0 (0x00007fb76e8bf000)
    libdatrie.so.1 => /usr/lib/libdatrie.so.1 (0x00007fb76e6b8000)
    libXau.so.6 => /usr/lib/libXau.so.6 (0x00007fb76e4b2000)
    libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007fb76e2ac000)
    libblkid.so.1 => /usr/lib/libblkid.so.1 (0x00007fb76e257000)
    libsystemd.so.0 => /usr/lib/libsystemd.so.0 (0x00007fb76e1cb000)
    liblzma.so.5 => /usr/lib/liblzma.so.5 (0x00007fb76dfa5000)
    liblz4.so.1 => /usr/lib/liblz4.so.1 (0x00007fb76df84000)
    libgcrypt.so.20 => /usr/lib/libgcrypt.so.20 (0x00007fb76de65000)
    libgpg-error.so.0 => /usr/lib/libgpg-error.so.0 (0x00007fb76de43000)

Are wayland, lzma, systemd, gpg-error, gcrypt, blkid etc. really necessary? What are these libraries used for and is it even reasonable to expect a fresh install of a distro to have all of these?

andlabs commented 5 years ago

Wayland is a backend option for GTK+ in addition to X11. The rest are used by the GLib portable utility library, which GTK+ is built on top of. You'd have to consult your distro to see if it's safe to remove the other packages, but GTK+ and GLib can certainly be built in a way that minimizes shared dependencies (but libui cannot ship with such a thing due to the licenses).

jclc commented 5 years ago

Why is systemd linked? If I ran this program on a distribution that doesn't use systemd, would it run?

andlabs commented 5 years ago

What does the following command print for you?

pkg-config --libs gtk+-3.0

I'm now wondering if your binary will or will not work on a system that links GTK+ differently...

jclc commented 5 years ago
-lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0

Shouldn't the package produce an identical binary regardless of operating system?

andlabs commented 5 years ago

It should, especially with that list of linked libraries. I wonder if ldd is going through the entire dependency chain.

jclc commented 5 years ago

Just confirmed that the ldd output is the same on Ubuntu as it is on my Manjaro machine. I've also confirmed it on Fedora.

jclc commented 5 years ago

It should, especially with that list of linked libraries. I wonder if ldd is going through the entire dependency chain.

This seems to be the case. I installed Void Linux on a VM; libsystemd didn't appear in the ldd output and the binary ran just fine.