2013/8/9 Thiago Macieira <[email protected]> > On sexta-feira, 9 de agosto de 2013 17:14:11, Tomasz Olszak wrote: > > Application without changing RPATH in Qt libraries and application > binary: > > http://pbrd.co/136t3GI > > > > This is application after RPATH modification: > > http://pbrd.co/136tyR2 > > Hi Tomasz > > RPATH and deprecated and you should not use it in new applications. You may > use the newer RUNPATH, which has different semantics (see other thread). > > I think the best solution is to use RUNPATH with $ORIGIN, pointing to the > libraries. > > Alternatively, the simplest solution is to replace the main application > binary > with a shell script that sets LD_LIBRARY_PATH. > -- > Thiago Macieira - thiago.macieira (AT) intel.com > Software Architect - Intel Open Source Technology Center > > _______________________________________________ > Development mailing list > [email protected] > http://lists.qt-project.org/mailman/listinfo/development > > Hi I tried to build Qt with RUNPATH but with no luck. LD_LIBRARY_PATH is not an option. Binary is position independent executables and has extern function that is invoked by external process. So application is in fact shared library. I spent couple of hours trying to make things work and have following results:
*Application dir layout:* /opt/usr/app/APPID/bin/App.exe(-pie binary) /opt/usr/app/APPID/lib - Qt libraries /opt/usr/app/APPID/data/plugins - Qt plugins /opt/usr/app/APPID/data/qml - QtQuick2 and Qml plugins *Application qt.conf file:* [Paths] Prefix=/opt/usr/apps/QtControls Libraries=lib Binaries=bin Plugins=data/plugins Qml2Imports=data/qml qt.conf file is needed because QCoreApplication::applicationDir() returns /usr/bin. It is launch_app directory (launch_app loads App.exe and runs extern function). I will look at http://codereview.qt-project.org/62455<http://www.google.com/url?q=http%3A%2F%2Fcodereview.qt-project.org%2F62455&sa=D&sntz=1&usg=AFQjCNHpYBYWk45Mypv0RtkT6kEN0wy4IA> and fix it for tizen too in the future. *Application QMAKE_LFLAGS:* QMAKE_LFLAGS+=-pie -rdynamic -Wl,-rpath,/opt/usr/apps/QtControls/lib *Qt QMAKE_LFLAGS* set ind mkspecs/devices/...: QMAKE_LFLAGS += -Wl,--enable-new-dtags '-Wl,-rpath,\'\$$ORIGIN/../lib\'' QMAKE_LFLAGS_PLUGIN += '-Wl,-rpath,\'\$$ORIGIN/../../../lib\'' Some notices: It looks like LD_LIBRARY_PATH doesn't work because even if I set LD_LIBRARY_PATH=. in /opt/usr/APPID/lib directory and execute ldd on e.g. libQt5Qml.so I get: linux-gate.so.1 => (0xb776a000) /usr/lib/libsys-assert.so (0xb7514000) libQt5Network.so.5 => /opt/usr/apps/QtControls/lib/./../lib/libQt5Network.so.5 (0xb73f5000) libQt5Core.so.5 => /opt/usr/apps/QtControls/lib/./../lib/libQt5Core.so.5 (0xb6f8e000) libpthread.so.0 => /lib/libpthread.so.0 (0xb6f62000) librt.so.1 => /lib/librt.so.1 (0xb6f59000) libQt5V8.so.5 => /opt/usr/apps/QtControls/lib/./../lib/libQt5V8.so.5 (0xb6b77000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb6a8f000) libm.so.6 => /lib/libm.so.6 (0xb6a68000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb6a4d000) libc.so.6 => /lib/libc.so.6 (0xb68f1000) libunwind.so.8 => /lib/libunwind.so.8 (0xb68de000) libdl.so.2 => /lib/libdl.so.2 (0xb68da000) libz.so.1 => /lib/libz.so.1 (0xb68b9000) libicui18n.so.48 => /usr/lib/libicui18n.so.48 (0xb66d3000) libicuuc.so.48 => /usr/lib/libicuuc.so.48 (0xb656a000) libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xb6568000) libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0xb643e000) /lib/ld-linux.so.2 (0xb776b000) libicudata.so.48 => /usr/lib/libicudata.so.48 (0xb5335000) So it looks like runpath(rpath) has bigger priority. ldd shows that dependencies of all executables are resolved (App.exe and Qt libraries in lib directory). Unfortunately when I try to run App.exe I get: ./App.exe: error while loading shared libraries: libQt5V8.so.5: cannot open shared object file: No such file or directory In the same time ldd App.exe gives: linux-gate.so.1 => (0xb77d8000) /usr/lib/libsys-assert.so (0xb77b2000) libQt5Quick.so.5 => /opt/usr/apps/QtControls/bin/./../lib/libQt5Quick.so.5 (0xb7507000) libQt5Qml.so.5 => /opt/usr/apps/QtControls/bin/./../lib/libQt5Qml.so.5 (0xb72b9000) libQt5Network.so.5 => /opt/usr/apps/QtControls/bin/./../lib/libQt5Network.so.5 (0xb719a000) libQt5Gui.so.5 => /opt/usr/apps/QtControls/bin/./../lib/libQt5Gui.so.5 (0xb6e11000) libQt5Core.so.5 => /opt/usr/apps/QtControls/bin/./../lib/libQt5Core.so.5 (0xb69aa000) libGLESv2.so.1 => /usr/lib/libGLESv2.so.1 (0xb6963000) libpthread.so.0 => /lib/libpthread.so.0 (0xb6948000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb6860000) libm.so.6 => /lib/libm.so.6 (0xb683a000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb681f000) libc.so.6 => /lib/libc.so.6 (0xb66c3000) libunwind.so.8 => /lib/libunwind.so.8 (0xb66b0000) libdl.so.2 => /lib/libdl.so.2 (0xb66ab000) libQt5V8.so.5 => /opt/usr/apps/QtControls/bin/./../lib/../lib/libQt5V8.so.5 (0xb62c9000) librt.so.1 => /lib/librt.so.1 (0xb62c0000) libz.so.1 => /lib/libz.so.1 (0xb62a0000) libpng12.so.0 => /usr/lib/libpng12.so.0 (0xb6277000) libEGL.so.1 => /usr/lib/libEGL.so.1 (0xb6260000) libicui18n.so.48 => /usr/lib/libicui18n.so.48 (0xb607a000) libicuuc.so.48 => /usr/lib/libicuuc.so.48 (0xb5f11000) libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xb5f0f000) libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0xb5de4000) /lib/ld-linux.so.2 (0xb77d9000) libX11.so.6 => /usr/lib/libX11.so.6 (0xb5cab000) libicudata.so.48 => /usr/lib/libicudata.so.48 (0xb4ba3000) libxcb.so.1 => /usr/lib/libxcb.so.1 (0xb4b82000) libXau.so.6 => /usr/lib/libXau.so.6 (0xb4b7e000) And ldd libQt5V8.so: linux-gate.so.1 => (0xb77b2000) /usr/lib/libsys-assert.so (0xb73c8000) libpthread.so.0 => /lib/libpthread.so.0 (0xb739c000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb72b4000) libm.so.6 => /lib/libm.so.6 (0xb728e000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7273000) libc.so.6 => /lib/libc.so.6 (0xb7117000) libunwind.so.8 => /lib/libunwind.so.8 (0xb7104000) libdl.so.2 => /lib/libdl.so.2 (0xb7100000) /lib/ld-linux.so.2 (0xb77b3000) Also strange is fact that event if ldd libQt5Qml.so prints: linux-gate.so.1 => (0xb7794000) /usr/lib/libsys-assert.so (0xb753d000) libQt5Network.so.5 => /opt/usr/apps/QtControls/lib/./../lib/libQt5Network.so.5 (0xb741e000) libQt5Core.so.5 => /opt/usr/apps/QtControls/lib/./../lib/libQt5Core.so.5 (0xb6fb7000) libpthread.so.0 => /lib/libpthread.so.0 (0xb6f8b000) librt.so.1 => /lib/librt.so.1 (0xb6f82000) libQt5V8.so.5 => /opt/usr/apps/QtControls/lib/./../lib/libQt5V8.so.5 (0xb6ba0000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb6ab8000) libm.so.6 => /lib/libm.so.6 (0xb6a91000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb6a76000) libc.so.6 => /lib/libc.so.6 (0xb691a000) libunwind.so.8 => /lib/libunwind.so.8 (0xb6907000) libdl.so.2 => /lib/libdl.so.2 (0xb6903000) libz.so.1 => /lib/libz.so.1 (0xb68e2000) libicui18n.so.48 => /usr/lib/libicui18n.so.48 (0xb66fc000) libicuuc.so.48 => /usr/lib/libicuuc.so.48 (0xb6593000) libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xb6591000) libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0xb6467000) /lib/ld-linux.so.2 (0xb7795000) libicudata.so.48 => /usr/lib/libicudata.so.48 (0xb535e000) the /lib/ld-linux.so --list ./libQt5Qml.so returns: ./libQt5Qml.so.5: error while loading shared libraries: libQt5Network.so.5: cannot open shared object file: No such file or directory I would like to mention that If you build Qt with /opt/usr/apps/APPID things work as expected... Anyway there are rumors that dynamic loader is significantly modified on Tizen (LD_LIBRARY_PATH and LD_PRELOAD doesn't work) so I will stick to changing runpath with chrpath. I investigated that this strange font error reveals by changing displayed text by 4 signs up :) So if I set ABC then EFG is displayed even though the console.log(text) shows ABC. Is it possible that *.ttf file can break font engine somehow? Tomasz
_______________________________________________ Development mailing list [email protected] http://lists.qt-project.org/mailman/listinfo/development
