Search code examples
gstreamergstreamer-1.0

Compiling gstreamer with msdkh264enc results in relocation errors


I would like to use msdkh264enc (on Linux) which requires that I build gstreamer from sources, as per the docs.

I run the following configure step:

meson setup -Dbad=enabled -Dgst-plugins-bad:msdk=enabled -Dgst-plugins-bad:avtp=disabled build

Which enables msdk (that's the point here) and disables avtp (because it fails to build on my Alpine Linux).

The configure step works and shows the required output

Run-time dependency libmfx found: YES 1.28
Has header "mfx/mfxdefs.h" : YES 
Has header "mfxvp9.h" : YES

At the end of the build I install in /tmp/blah with:

meson install --destdir /tmp/blah -C build

I have a libgstmsdk.so, but its ldd libgstmsdk.so output looks like there are runtime issues:

ldd /tmp/blah/usr/local/lib/gstreamer-1.0/libgstmsdk.so                                                                                                                                                                            [0]
    /lib/ld-musl-x86_64.so.1 (0x7f33e7666000)
    libgstbase-1.0.so.0 => /usr/lib/libgstbase-1.0.so.0 (0x7f33e75a2000)
    libgstreamer-1.0.so.0 => /usr/lib/libgstreamer-1.0.so.0 (0x7f33e7457000)
    libgstvideo-1.0.so.0 => /usr/lib/libgstvideo-1.0.so.0 (0x7f33e7393000)
    libgstpbutils-1.0.so.0 => /usr/lib/libgstpbutils-1.0.so.0 (0x7f33e7354000)
    libgstcodecparsers-1.0.so.0 => /usr/lib/libgstcodecparsers-1.0.so.0 (0x7f33e72ca000)
    libgstva-1.0.so.0 => /usr/lib/libgstva-1.0.so.0 (0x7f33e72b6000)
    libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x7f33e716a000)
    libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0x7f33e710d000)
    libmfx.so.1 => /usr/lib/libmfx.so.1 (0x7f33e70fd000)
    libva.so.2 => /usr/lib/libva.so.2 (0x7f33e70d3000)
    libdrm.so.2 => /usr/lib/libdrm.so.2 (0x7f33e70bd000)
    libgudev-1.0.so.0 => /usr/lib/libgudev-1.0.so.0 (0x7f33e70b2000)
    libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7f33e7666000)
    libintl.so.8 => /usr/lib/libintl.so.8 (0x7f33e70a0000)
    libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0x7f33e7099000)
    liborc-0.4.so.0 => /usr/lib/liborc-0.4.so.0 (0x7f33e701b000)
    libgstaudio-1.0.so.0 => /usr/lib/libgstaudio-1.0.so.0 (0x7f33e6f9c000)
    libgsttag-1.0.so.0 => /usr/lib/libgsttag-1.0.so.0 (0x7f33e6f5e000)
    libgstallocators-1.0.so.0 => /usr/lib/libgstallocators-1.0.so.0 (0x7f33e6f57000)
    libva-drm.so.2 => /usr/lib/libva-drm.so.2 (0x7f33e6f52000)
    libpcre2-8.so.0 => /usr/lib/libpcre2-8.so.0 (0x7f33e6eab000)
    libffi.so.8 => /usr/lib/libffi.so.8 (0x7f33e6ea1000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7f33e6c08000)
    libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7f33e6be4000)
    libudev.so.1 => /lib/libudev.so.1 (0x7f33e6bd4000)
    libz.so.1 => /lib/libz.so.1 (0x7f33e6bba000)
Error relocating /tmp/blah/usr/local/lib/gstreamer-1.0/libgstmsdk.so: gst_va_dmabuf_get_modifier_for_format: symbol not found
Error relocating /tmp/blah/usr/local/lib/gstreamer-1.0/libgstmsdk.so: gst_video_info_dma_drm_to_video_info: symbol not found
Error relocating /tmp/blah/usr/local/lib/gstreamer-1.0/libgstmsdk.so: gst_video_dma_drm_fourcc_from_string: symbol not found
Error relocating /tmp/blah/usr/local/lib/gstreamer-1.0/libgstmsdk.so: gst_video_info_dma_drm_new_from_caps: symbol not found
Error relocating /tmp/blah/usr/local/lib/gstreamer-1.0/libgstmsdk.so: gst_video_dma_drm_fourcc_to_string: symbol not found
Error relocating /tmp/blah/usr/local/lib/gstreamer-1.0/libgstmsdk.so: gst_video_info_dma_drm_init: symbol not found
Error relocating /tmp/blah/usr/local/lib/gstreamer-1.0/libgstmsdk.so: gst_video_info_dma_drm_to_caps: symbol not found
Error relocating /tmp/blah/usr/local/lib/gstreamer-1.0/libgstmsdk.so: gst_video_is_dma_drm_caps: symbol not found
Error relocating /tmp/blah/usr/local/lib/gstreamer-1.0/libgstmsdk.so: gst_va_drm_fourcc_from_video_format: symbol not found
Error relocating /tmp/blah/usr/local/lib/gstreamer-1.0/libgstmsdk.so: gst_video_info_dma_drm_free: symbol not found
Error relocating /tmp/blah/usr/local/lib/gstreamer-1.0/libgstmsdk.so: gst_va_video_format_from_drm_fourcc: symbol not found

Note how e.g. libgstreamer-1.0.so.0 => /usr/lib/libgstreamer-1.0.so.0, which is the system libgstreamer, where it should actually be pointing to libgstreamer-1.0.so.0 => ./subprojects/gst-plugins-bad/sys/msdk/../../../gstreamer/gst/libgstreamer-1.0.so.0!

If I ldd ./subprojects/gst-plugins-bad/sys/msdk/libgstmsdk.so (so the library before it gets installed), it seems fine. But I need to install all those binaries in order to use them (I can't reasonably point GST_PLUGIN_PATH to each separate build directory)!

What am I doing wrong in the installation step?


Solution

  • I think it is not about how meson installs the binaries, but rather it has to do with the dynamic linking at runtime. I am no sure if there is a better solution, but setting the LD_LIBRARY_PATH works here:

    % LD_LIBRARY_PATH=/tmp/blah/usr/local/lib ldd /tmp/blah/usr/local/lib/gstreamer-1.0/libgstmsdk.so        [0]
        /lib/ld-musl-x86_64.so.1 (0x7f7117484000)
        libgstbase-1.0.so.0 => /tmp/blah/usr/local/lib/libgstbase-1.0.so.0 (0x7f71173be000)
        libgstreamer-1.0.so.0 => /tmp/blah/usr/local/lib/libgstreamer-1.0.so.0 (0x7f7117266000)
        libgstvideo-1.0.so.0 => /tmp/blah/usr/local/lib/libgstvideo-1.0.so.0 (0x7f711718e000)
        libgstpbutils-1.0.so.0 => /tmp/blah/usr/local/lib/libgstpbutils-1.0.so.0 (0x7f711714b000)
        libgstcodecparsers-1.0.so.0 => /tmp/blah/usr/local/lib/libgstcodecparsers-1.0.so.0 (0x7f71170b7000)
        libgstva-1.0.so.0 => /tmp/blah/usr/local/lib/libgstva-1.0.so.0 (0x7f71170a1000)
        libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x7f7116f55000)
        libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0x7f7116ef8000)
        libmfx.so.1 => /usr/lib/libmfx.so.1 (0x7f7116ee8000)
        libva.so.2 => /usr/lib/libva.so.2 (0x7f7116ebe000)
        libdrm.so.2 => /usr/lib/libdrm.so.2 (0x7f7116ea8000)
        libgudev-1.0.so.0 => /usr/lib/libgudev-1.0.so.0 (0x7f7116e9d000)
        libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7f7117484000)
        libintl.so.8 => /usr/lib/libintl.so.8 (0x7f7116e8b000)
        libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0x7f7116e84000)
        liborc-0.4.so.0 => /tmp/blah/usr/local/lib/liborc-0.4.so.0 (0x7f7116dce000)
        libgstaudio-1.0.so.0 => /tmp/blah/usr/local/lib/libgstaudio-1.0.so.0 (0x7f7116d47000)
        libgsttag-1.0.so.0 => /tmp/blah/usr/local/lib/libgsttag-1.0.so.0 (0x7f7116d06000)
        libgstallocators-1.0.so.0 => /tmp/blah/usr/local/lib/libgstallocators-1.0.so.0 (0x7f7116cfd000)
        libva-drm.so.2 => /usr/lib/libva-drm.so.2 (0x7f7116cf8000)
        libpcre2-8.so.0 => /usr/lib/libpcre2-8.so.0 (0x7f7116c51000)
        libffi.so.8 => /usr/lib/libffi.so.8 (0x7f7116c47000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7f71169ae000)
        libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7f711698a000)
        libudev.so.1 => /lib/libudev.so.1 (0x7f711697a000)
        libz.so.1 => /lib/libz.so.1 (0x7f7116960000)