[oe] Qt 5.4.1 loading libGLESv2.so directly and ignoring soname

Andre McCurdy armccurdy at gmail.com
Tue May 12 03:50:05 UTC 2015


I'm seeing Qt 5.4.1 apps which use the eglfs platform plug-in exit soon
after startup with the following error:

  Failed to load libGLESv2

The issue seems to be that Qt 5.4.1 tries to dlopen "libGLESv2.so" at
runtime, but due to OE's packaging rules the libGLESv2.so symlink isn't
available.

As a temporary workaround I'm using the mesa patch below to force the
libGLESv2.so symlink out of libgles2-mesa-dev and into libgles2-mesa.

Strace shows:

 | ...
 | open("/usr/lib/libGLESv2.so.2", O_RDONLY|O_CLOEXEC) = 3
 | read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\0`\36D4\0\0\0"..., 512) = 512
 | fstat64(3, {st_mode=S_IFREG|0755, st_size=50368, ...}) = 0
 | mmap2(0x441e6000, 51276, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x441e6000
 | mmap2(0x441f2000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xb000) = 0x441f2000
 | close(3)                                = 0
 | ...

ie the dynamic linker initially succeeds by using the soname, but then later:

 | ...
 | open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 20
 | fstat64(20, {st_mode=S_IFREG|0644, st_size=10354, ...}) = 0
 | mmap2(NULL, 10354, PROT_READ, MAP_PRIVATE, 20, 0) = 0xb76fb000
 | close(20)                               = 0
 | open("/lib/libGLESv2.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
 | open("/usr/lib/libGLESv2.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
 | munmap(0xb76fb000, 10354)               = 0
 | open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 20
 | fstat64(20, {st_mode=S_IFREG|0644, st_size=10354, ...}) = 0
 | mmap2(NULL, 10354, PROT_READ, MAP_PRIVATE, 20, 0) = 0xb76fb000
 | close(20)                               = 0
 | open("/lib/libGLESv2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
 | open("/usr/lib/libGLESv2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
 | munmap(0xb76fb000, 10354)               = 0
 | open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 20
 | fstat64(20, {st_mode=S_IFREG|0644, st_size=10354, ...}) = 0
 | mmap2(NULL, 10354, PROT_READ, MAP_PRIVATE, 20, 0) = 0xb76fb000
 | close(20)                               = 0
 | open("/lib/GLESv2.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
 | open("/usr/lib/GLESv2.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
 | munmap(0xb76fb000, 10354)               = 0
 | open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 20
 | fstat64(20, {st_mode=S_IFREG|0644, st_size=10354, ...}) = 0
 | mmap2(NULL, 10354, PROT_READ, MAP_PRIVATE, 20, 0) = 0xb76fb000
 | close(20)                               = 0
 | open("/lib/GLESv2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
 | open("/usr/lib/GLESv2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
 | munmap(0xb76fb000, 10354)               = 0
 | write(2, "Failed to load libGLESv2\n", 25Failed to load libGLESv2
 | ) = 25
 | rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0
 | tgkill(438, 438, SIGABRT)               = 0
 | --- SIGABRT {si_signo=SIGABRT, si_code=SI_TKILL, si_pid=438, si_uid=0} ---
 | +++ killed by SIGABRT +++
 | Aborted


diff --git a/meta/recipes-graphics/mesa/mesa.inc b/meta/recipes-graphics/mesa/mesa.inc
index 1857f3c..e2fad05 100644
--- a/meta/recipes-graphics/mesa/mesa.inc
+++ b/meta/recipes-graphics/mesa/mesa.inc
@@ -162,7 +162,17 @@ FILES_mesa-megadriver = "${libdir}/dri/*"
 FILES_libegl-mesa = "${libdir}/libEGL.so.*"
 FILES_libgbm = "${libdir}/libgbm.so.*"
 FILES_libgles1-mesa = "${libdir}/libGLESv1*.so.*"
-FILES_libgles2-mesa = "${libdir}/libGLESv2.so.*"
+
+# ------------------------------------------------------------------------------
+# Move the /usr/lib/libGLESv2.so symlink into the runtime package as workaround
+# for issues seem with Qt 5.4.1, which seems to try to dlopen libGLESv2.so using
+# a hardcoded filename (instead of relying on the dynamic linker and therefore
+# loading libGLESv2.so via it's soname).
+# ------------------------------------------------------------------------------
+FILES_libgles2-mesa = "${libdir}/libGLESv2.so.* ${libdir}/libGLESv2.so"
+FILES_SOLIBSDEV_libgles2-mesa = ""
+INSANE_SKIP_libgles2-mesa += "dev-so"
+
 FILES_libgl-mesa = "${libdir}/libGL.so.*"
 FILES_libglapi = "${libdir}/libglapi.so.*"
 FILES_libosmesa = "${libdir}/libOSMesa.so.*"




More information about the Openembedded-devel mailing list