[Bug 1172018] New: The 32-bit GStreamer 1.0 packages are broken on 64-bit openSUSE Leap
http://bugzilla.opensuse.org/show_bug.cgi?id=1172018 Bug ID: 1172018 Summary: The 32-bit GStreamer 1.0 packages are broken on 64-bit openSUSE Leap Classification: openSUSE Product: openSUSE Distribution Version: Leap 15.1 Hardware: Other OS: Other Status: NEW Severity: Normal Priority: P5 - None Component: GNOME Assignee: gnome-bugs@suse.de Reporter: fgouget@codeweavers.com QA Contact: qa-bugs@suse.de Found By: --- Blocker: --- Created attachment 838082 --> http://bugzilla.opensuse.org/attachment.cgi?id=838082&action=edit Test case Description of problem: 32-bit applications fail to find any GStreamer element with errors like: (gst-plugin-scanner:16235): GStreamer-WARNING **: Failed to load plugin '/usr/lib/gstreamer-1.0/libgstvideoconvert.so': /usr/lib/gstreamer-1.0/libgstvideoconvert.so: wrong ELF class: ELFCLASS32 Versions impacted: This impacts at least gstreamer 1.12.5-lp151.2.5 package in openSUSE Leap 15.1. This issue was supposedly ****fixed in Tumbleweed in may 2018***** (see bug 1049452). Yet here we are two years later with the same issue in openSUSE Leap 15.1, hence this new bug. How reproducible: 100% reproducible. Steps to reproduce: 1. Install a 64-bit version of openSUSE Leap. This is expected to install the 64-bit GStreamer packages. 2. Install the 32-bit GStreamer packages: zypper install gstreamer-32bit gstreamer-plugins-base-32bit 3. Ideally I'd recommend using the 32 bit gst-inspect-1.0 tool but it is nowhere to be found. So instead download the attached test application and compile it: gcc -m32 -o cxgstcheck `pkg-config --cflags gstreamer-1.0` `pkg-config --libs gstreamer-1.0` cxgstcheck.c 4. Clear the 32-bit registry and run the 32-bit cxgstcheck application to force recreating it: rm ~/.cache/gstreamer-1.0/registry.i586.bin ./cxgstcheck Note that while in this case we are using a test application, this affects any 32-bit application. In particular it impacts Wine and thus any 32-bit Windows application (such as games) that uses winegstreamer.dll. Actual results: $ ./cxgstcheck [...] (gst-plugin-scanner:16235): GStreamer-WARNING **: Failed to load plugin '/usr/lib/gstreamer-1.0/libgstvideoconvert.so': /usr/lib/gstreamer-1.0/libgstvideoconvert.so: wrong ELF class: ELFCLASS32 [...] Bitness: 32 bits could not instantiate h264parse could not instantiate videoconvert could not instantiate vp9dec could not instantiate asfdemux Expected results: cxgstcheck should not issue ELFCLASS32 errors. It should also at least find the videoconvert element since we installed gstreamer-plugins-base-32bit. $ ./cxgstcheck Bitness: 32 bits could not instantiate h264parse found videoconvert could not instantiate vp9dec could not instantiate asfdemux Additional info: The reason for this bug is that GStreamer applications rely on the ~/.cache/gstreamer-1.0/registry.i586.bin file to figure out which plugin (aka library) provides a given GStreamer element. However generating that file is delegated to the /usr/lib/gstreamer-1.0/gst-plugin-scanner tool and on a 64-bit system this is a 64-bit executable provided by the gstreamer package. As a 64-bit tool it is only able to load 64-bit GStreamer plugins. As a result ~/.cache/gstreamer-1.0/registry.i586.bin is empty and 32-bit applications are unable to find any GStreamer element. -- You are receiving this mail because: You are on the CC list for the bug.
http://bugzilla.opensuse.org/show_bug.cgi?id=1172018 Marcus Meissner <meissner@suse.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |meissner@suse.com Assignee|gnome-bugs@suse.de |meissner@suse.com -- You are receiving this mail because: You are on the CC list for the bug.
http://bugzilla.opensuse.org/show_bug.cgi?id=1172018 http://bugzilla.opensuse.org/show_bug.cgi?id=1172018#c3 Francois Gouget <fgouget@codeweavers.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #838082|0 |1 is obsolete| | --- Comment #3 from Francois Gouget <fgouget@codeweavers.com> --- Created attachment 838107 --> http://bugzilla.opensuse.org/attachment.cgi?id=838107&action=edit Simple testcase I uploaded an updated test case: * Contains the compilation command line in a comment (for my future self). * Fixes the bitness trace (duh!). However I have not figured out how to compile it from a clean 64-bit openSUSE 15.1 install because there is no gstreamer-devel-32bit package! # zypper install gcc glibc-devel glibc-devel-32bit gstreamer-devel # zypper install gstreamer-devel-32bit Loading repository data... Reading installed packages... Package 'gstreamer-devel-32bit' not found. Resolving package dependencies... As a result the 32-bit headers (and pkg-config files) are missing and that causes the compilation to fail. Maybe I missed something? So instead I simply compile it on another machine and copy the binary over. I guess this also means one cannot produce a 32-bit Wine with GStreamer support on 64-bit openSUSE :-( -- You are receiving this mail because: You are on the CC list for the bug.
http://bugzilla.opensuse.org/show_bug.cgi?id=1172018 http://bugzilla.opensuse.org/show_bug.cgi?id=1172018#c4 --- Comment #4 from Francois Gouget <fgouget@codeweavers.com> --- Note that when I say that "registry.i586.bin is empty" I don't mean that its size is 0 bytes. I mean that it does not contain any useful information (and it's size is still quite small <= 25 kB instead of > 200 kB): $ strings .cache/gstreamer-1.0/registry.i586.bin | head -n12 1.3.0 libgstcoreelements.so Plugin for blacklisted file /usr/lib/gstreamer-1.0/libgstcoreelements.so 0.0.0 BLACKLIST BLACKLIST BLACKLIST BLACKLIST libgstcoretracers.so Plugin for blacklisted file /usr/lib/gstreamer-1.0/libgstcoretracers.so That's a clear result of the 64-bit gst-plugin-scanner being unable to load the libraries to see what they contain. Contrast it with the 64-bit file: $ strings .cache/gstreamer-1.0/registry.x86_64.bin | head -n12 1.3.0 coreelements GStreamer core elements /usr/lib64/gstreamer-1.0/libgstcoreelements.so 1.12.5 LGPL gstreamer openSUSE GStreamer package http://download.opensuse.org 2018-03-28 GstElementFactory capsfilter -- You are receiving this mail because: You are on the CC list for the bug.
http://bugzilla.opensuse.org/show_bug.cgi?id=1172018 http://bugzilla.opensuse.org/show_bug.cgi?id=1172018#c5 --- Comment #5 from Francois Gouget <fgouget@codeweavers.com> --- Here are some more details: * It is possible for a 32-bit application to avoid triggering this bug: the trick is to pass the --gst-disable-registry-fork option to gst_init_check(): BOOL *status = param; char argv0[] = "wine"; char argv1[] = "--gst-disable-registry-fork"; [...] *status = gst_init_check(&argc, &argv, &err); * Wine uses this workaround so it will not _trigger_ this bug. But GStreamer's tools (e.g. gst-inspect-1.0) and probably most other tools don't use the workaround and thus will break 32-bit GStreamer. * Once registry.i586.bin has been filled with bad data every application is impacted, including Wine, and the issue will only be fixed once a 32-bit application using the workaround performs a registry update. In other words, one must hope that after a plugins upgrade the first 32-bit application to trigger the registry file update is one that uses the workaround. This leads to a situation where things work or break seemingly at random. -- You are receiving this mail because: You are on the CC list for the bug.
http://bugzilla.opensuse.org/show_bug.cgi?id=1172018 http://bugzilla.opensuse.org/show_bug.cgi?id=1172018#c9 --- Comment #9 from Francois Gouget <fgouget@codeweavers.com> --- Of course you want also to install some 32-bit plugins to perform the test: zypper install gstreamer-plugins-base-32bit gstreamer-plugins-good-32bit # etc. -- You are receiving this mail because: You are on the CC list for the bug.
participants (1)
-
bugzilla_noreply@suse.com