Getting rid of X11 in my app

I want to distribute my Gstreamer application with minimal external dependencies (especially of X11, because the app is intended to be used on Linux servers without any window subsystem). I build Gstreamer plugins as single shared library, using the next setup:

meson setup --wipe --default-library=static
–strip
-Dgpl=enabled
-Dgst-full-libraries=gstreamer-app-1.0,gstreamer-video-1.0,gstreamer-base-1.0,gstreamer-audio-1.0
-Dgood=enabled
-Dbad=enabled
-Dugly=disabled
-Dbase=enabled
-Dwebrtc=disabled
-Dlibav=disabled
-Dges=disabled
-Dgtk_doc=disabled
-Dexamples=disabled
-Dtests=disabled
-Dtools=enabled
-Dintrospection=disabled
-Dglib:tests=false

-Dgst-plugins-base:x11=disabled
-Dgst-plugins-base:xvideo=disabled
-Dgst-plugins-base:xshm=disabled
-Dgst-plugins-base:gl=disabled
-Dgst-plugins-base:pango=disabled
-Dgst-plugins-base:alsa=disabled
-Dgst-plugins-base:cdparanoia=disabled
-Dgst-plugins-base:libvisual=disabled
-Dgst-plugins-base:tremor=disabled
-Dgst-plugins-base:gio=disabled
-Dgst-plugins-base:ogg=disabled
-Dgst-plugins-base:theora=disabled
-Dgst-plugins-base:opus=disabled
-Dgst-plugins-base:vorbis=disabled
-Dgst-plugins-good:cairo=disabled
-Dgst-plugins-good:flac=disabled

-Dqt5=disabled
-Dqt6=disabled

-Dgst-plugins-good:cairo=disabled
-Dgst-plugins-good:jpeg=disabled
-Dgst-plugins-good:png=disabled
-Dgst-plugins-good:soup=disabled
-Dgst-plugins-good:pulse=disabled
-Dgst-plugins-good:vpx=disabled
-Dgst-plugins-good:lame=disabled
-Dgst-plugins-good:gtk3=disabled
-Dgst-plugins-good:qt5=disabled

-Dgst-plugins-bad:wayland=disabled
-Dgst-plugins-bad:opencv=disabled
-Dgst-plugins-bad:webrtc=disabled
-Dgst-plugins-bad:nvcodec=disabled
-Dgst-plugins-bad:aja=disabled
-Dgst-plugins-bad:x265=disabled
-Dgst-plugins-bad:va=disabled
-Dgst-plugins-bad:onnx=disabled
-Dgst-plugins-bad:tensordecoders=disabled
-Dgst-plugins-bad:fdkaac=enabled
-Dgst-plugins-bad:gl=disabled
-Dgst-plugins-bad:vulkan=disabled
-Dgst-plugins-bad:kms=disabled
-Dgst-plugins-bad:fbdev=disabled
-Dgst-plugins-bad:directfb=disabled
-Dgst-plugins-bad:msdk=disabled
-Dgst-plugins-bad:qsv=disabled
builddir
```

As you can see, I tried to exclude everything that is not needed, especially related to X11. I disabled pango, cairo, X11, and everything I was able to determine as potentially excessive and bringing Xs.

After compilation, I getting file libgstreamer-full-1.0.so and checking it with ldd:

```
$ ldd builddir/libgstreamer-full-1.0.so

linux-vdso.so.1 (0x00007f77fd34b000)
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f77f3c9b000)
libgobject-2.0.so.0 => /lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007f77f3c38000)
libgmodule-2.0.so.0 => /lib/x86_64-linux-gnu/libgmodule-2.0.so.0 (0x00007f77f3c31000)
libunwind.so.8 => /lib/x86_64-linux-gnu/libunwind.so.8 (0x00007f77f3c16000)
libdw.so.1 => /lib/x86_64-linux-gnu/libdw.so.1 (0x00007f77f3b62000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f77f3b46000)
libgio-2.0.so.0 => /lib/x86_64-linux-gnu/libgio-2.0.so.0 (0x00007f77f3976000)
libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f77f3962000)
libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 (0x00007f77f392f000)
libv4l2.so.0 => /lib/x86_64-linux-gnu/libv4l2.so.0 (0x00007f77f391f000)
libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6 (0x00007f77f37e2000)
libXext.so.6 => /lib/x86_64-linux-gnu/libXext.so.6 (0x00007f77f37ce000)
libXfixes.so.3 => /lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007f77f37c6000)
libXdamage.so.1 => /lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007f77f37c1000)
libXtst.so.6 => /lib/x86_64-linux-gnu/libXtst.so.6 (0x00007f77f37b9000)
libxml2.so.2 => /lib/x86_64-linux-gnu/libxml2.so.2 (0x00007f77f35d7000)
libnettle.so.8 => /lib/x86_64-linux-gnu/libnettle.so.8 (0x00007f77f3582000)
libicuuc.so.74 => /lib/x86_64-linux-gnu/libicuuc.so.74 (0x00007f77f3200000)
libbrotlidec.so.1 => /lib/x86_64-linux-gnu/libbrotlidec.so.1 (0x00007f77f3572000)
libgdk_pixbuf-2.0.so.0 => /lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0 (0x00007f77f3544000)
libgnutls.so.30 => /lib/x86_64-linux-gnu/libgnutls.so.30 (0x00007f77f3006000)
libssl.so.3 => /lib/x86_64-linux-gnu/libssl.so.3 (0x00007f77f349a000)
libcrypto.so.3 => /lib/x86_64-linux-gnu/libcrypto.so.3 (0x00007f77f2a00000)
libpangocairo-1.0.so.0 => /lib/x86_64-linux-gnu/libpangocairo-1.0.so.0 (0x00007f77f3487000)
libpango-1.0.so.0 => /lib/x86_64-linux-gnu/libpango-1.0.so.0 (0x00007f77f341c000)
libcairo.so.2 => /lib/x86_64-linux-gnu/libcairo.so.2 (0x00007f77f28bc000)
libass.so.9 => /lib/x86_64-linux-gnu/libass.so.9 (0x00007f77f2fcd000)
libaom.so.3 => /lib/x86_64-linux-gnu/libaom.so.3 (0x00007f77f2200000)
libcurl.so.4 => /lib/x86_64-linux-gnu/libcurl.so.4 (0x00007f77f27fb000)
libfdk-aac.so.2 => /lib/x86_64-linux-gnu/libfdk-aac.so.2 (0x00007f77f2f37000)
libopenjp2.so.7 => /lib/x86_64-linux-gnu/libopenjp2.so.7 (0x00007f77f279a000)
libopus.so.0 => /lib/x86_64-linux-gnu/libopus.so.0 (0x00007f77f21a1000)
librtmp.so.1 => /lib/x86_64-linux-gnu/librtmp.so.1 (0x00007f77f2f19000)
libwebp.so.7 => /lib/x86_64-linux-gnu/libwebp.so.7 (0x00007f77f2126000)
libwebpmux.so.3 => /lib/x86_64-linux-gnu/libwebpmux.so.3 (0x00007f77f278c000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f77f1e00000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f77f1d17000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f77f20f8000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f77f1a00000)
/lib64/ld-linux-x86-64.so.2 (0x00007f77fd34d000)
libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007f77f1c7d000)
libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007f77f2780000)
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f77f20c6000)
libelf.so.1 => /lib/x86_64-linux-gnu/libelf.so.1 (0x00007f77f20a7000)
libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007f77f1946000)
libmount.so.1 => /lib/x86_64-linux-gnu/libmount.so.1 (0x00007f77f1c30000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f77f1919000)
libcap.so.2 => /lib/x86_64-linux-gnu/libcap.so.2 (0x00007f77f209a000)
libv4lconvert.so.0 => /lib/x86_64-linux-gnu/libv4lconvert.so.0 (0x00007f77f189f000)
libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f77f1876000)
libicudata.so.74 => /lib/x86_64-linux-gnu/libicudata.so.74 (0x00007f77efa00000)
libbrotlicommon.so.1 => /lib/x86_64-linux-gnu/libbrotlicommon.so.1 (0x00007f77f1853000)
libpng16.so.16 => /lib/x86_64-linux-gnu/libpng16.so.16 (0x00007f77f181b000)
libjpeg.so.8 => /lib/x86_64-linux-gnu/libjpeg.so.8 (0x00007f77f1798000)
libp11-kit.so.0 => /lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007f77ef85c000)
libidn2.so.0 => /lib/x86_64-linux-gnu/libidn2.so.0 (0x00007f77f1776000)
libunistring.so.5 => /lib/x86_64-linux-gnu/libunistring.so.5 (0x00007f77ef6af000)
libtasn1.so.6 => /lib/x86_64-linux-gnu/libtasn1.so.6 (0x00007f77f2084000)
libhogweed.so.6 => /lib/x86_64-linux-gnu/libhogweed.so.6 (0x00007f77ef667000)
libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x00007f77ef5e3000)
libpangoft2-1.0.so.0 => /lib/x86_64-linux-gnu/libpangoft2-1.0.so.0 (0x00007f77f1c15000)
libharfbuzz.so.0 => /lib/x86_64-linux-gnu/libharfbuzz.so.0 (0x00007f77ef4d6000)
libfontconfig.so.1 => /lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f77ef485000)
libfribidi.so.0 => /lib/x86_64-linux-gnu/libfribidi.so.0 (0x00007f77ef467000)
libthai.so.0 => /lib/x86_64-linux-gnu/libthai.so.0 (0x00007f77f176b000)
libfreetype.so.6 => /lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f77ef39b000)
libXrender.so.1 => /lib/x86_64-linux-gnu/libXrender.so.1 (0x00007f77ef38f000)
libxcb-render.so.0 => /lib/x86_64-linux-gnu/libxcb-render.so.0 (0x00007f77ef380000)
libxcb-shm.so.0 => /lib/x86_64-linux-gnu/libxcb-shm.so.0 (0x00007f77f207f000)
libpixman-1.so.0 => /lib/x86_64-linux-gnu/libpixman-1.so.0 (0x00007f77ef2d1000)
libunibreak.so.5 => /lib/x86_64-linux-gnu/libunibreak.so.5 (0x00007f77ef2af000)
libnghttp2.so.14 => /lib/x86_64-linux-gnu/libnghttp2.so.14 (0x00007f77ef284000)
libssh.so.4 => /lib/x86_64-linux-gnu/libssh.so.4 (0x00007f77ef213000)
libpsl.so.5 => /lib/x86_64-linux-gnu/libpsl.so.5 (0x00007f77ef1ff000)
libgssapi_krb5.so.2 => /lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007f77ef1ab000)
libldap.so.2 => /lib/x86_64-linux-gnu/libldap.so.2 (0x00007f77ef14d000)
liblber.so.2 => /lib/x86_64-linux-gnu/liblber.so.2 (0x00007f77ef13d000)
libsharpyuv.so.0 => /lib/x86_64-linux-gnu/libsharpyuv.so.0 (0x00007f77f1763000)
libblkid.so.1 => /lib/x86_64-linux-gnu/libblkid.so.1 (0x00007f77ef102000)
libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6 (0x00007f77ef0fc000)
libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f77ef0f4000)
libgraphite2.so.3 => /lib/x86_64-linux-gnu/libgraphite2.so.3 (0x00007f77ef0ce000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f77ef0a2000)
libdatrie.so.1 => /lib/x86_64-linux-gnu/libdatrie.so.1 (0x00007f77ef099000)
libkrb5.so.3 => /lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007f77eefd0000)
libk5crypto.so.3 => /lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007f77eefa4000)
libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007f77eef9e000)
libkrb5support.so.0 => /lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007f77eef91000)
libsasl2.so.2 => /lib/x86_64-linux-gnu/libsasl2.so.2 (0x00007f77eef77000)
libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f77eef61000)
libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007f77eef5a000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f77eef47000)
```
As you can see, X11 is still in the list. Also, there are pango and cairo, despite I explicitly disabled them.

My question is, how I can get rid of X11 and related plugins?

GStreamer 1.27, OS Ubuntu 24 LTS

You would need to determine which plugin is depending on X11 in some form. This is much easier when you are not using gstreamer-full as you can ldd the specific plugin .so. You can also grep through plugin .pc files to see which plugin links to X11.

1 Like

I solved this problem from another end.

Instead of exclude everything I don’t need, I decided to include only needed:

meson setup
–wipe
–default-library=static
–wrap-mode=forcefallback \ # this option makes ninja to pack Gstreamer’s dependencies
-Dauto_features=disabled \ # this option excludes everything

-Dgst-full=enabled \ # this option forces ninja my build monolithic library
… then I must include only those plugins that I need …
-Dgpl=enabled \
-Dgst-full-libraries=app,video,base,audio #
-Dbase=enabled
-Dgood=enabled
-Dbad=enabled
-Dugly=enabled
-Ddoc=disabled
-Dexamples=disabled
-Dtools=enabled
-Dtests=disabled \
-Dgstreamer:tools=enabled
-Dintrospection=disabled
-Dgstreamer-1.0:coreelements=enabled
-Dgstreamer-1.0:coretracers=enabled
-Dgst-plugins-base:typefind=enabled
-Dgst-plugins-base:app=enabled
-Dgst-plugins-base:playback=enabled
… other plugins
builddir

Resulted library now has 37 dependencies in ldd instead of 97, and there is no X11 dependencies.