Linking issues with Qt 5.2.1 when building for ARM
I'm building Qt 5.2.1 for ARM/Linux/X11.
My target platform is Nvidia Tegra 2 and I configured Qt with the following command (sorry, it's pretty long):
@./configure -prefix /opt/QtTegra2 -opensource -confirm-license -mtdev -no-sql-db2 -no-sql-ibase -no-sql-mysql -no-sql-oci -no-sql-odbc -no-sql-psql -no-sql-sqlite -no-sql-sqlite2 -no-sql-tds -no-glib -make libs -nomake examples -no-cups -no-pch -no-dbus -device tegra2 -device-option CROSS_COMPILE=/opt/local/bin/arm-linux-gnueabihf- -no-eglfs -no-directfb -no-linuxfb -no-kms -qpa xcb -sysroot /home/siro/ubuntu/rootfs -opengl es2 2>&1 | tee configure.log@
After compiling the components of libQt5Core.so comes the linking issue.
The resulting error follows:
@/opt/local/bin/../lib/gcc/arm-linux-gnueabihf/4.8.3/../../../../arm-linux-gnueabihf/bin/ld: /home/siro/ubuntu/rootfs/usr/lib/arm-linux-gnueabihf/libz.a(compress.o): relocation R_ARM_THM_MOVW_ABS_NC against a local symbol can not be used when making a shared object; recompile with -fPIC
/home/siro/ubuntu/rootfs/usr/lib/arm-linux-gnueabihf/libz.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status@
I'm kind of lost since I couldn't find any solution to this issue.
PS: -fPIC is among the options employed to compile objects since I'm not using the -static option of the configure script and the pkgconfig of libz inside usr/lib/arm-linux-gnueabihf/pkgconfig seems correct.
Adding -static to the configuration option (after a make clean) brings up other issues...
I've done some additional testing, with the same flags except for -device, -device-option, -no-neon, and -sysroot I can safely compile for x86.
A litte late but i found the problem/solution:
The problem is the sysroot. Normally gcc links to shared libraries. But when it cant find it, gcc uses the static libraries (.a). When you look in [sysroot]/usr/lib/arm-linux-gnueabihf the shared libraries are not in this place. There are only symlinks to /lib/arm-linux-gnueabihf. So gcc looks for the shared libraries on you host-pc, where it can not find them.
Create just the right symlink. (here an example for your libz, the X is the version number)
ln -s [sysroot]/lib/arm-linux-gnueabihf/libz.so.X [sysroot]/usr/lib/arm-linux-gnueabihf/libz.so
(Dont forget to remove the old symlink and create it after compiling successfully; i just mv the symlink from "file.so" to "file.so.backup" befor compiling)
ln -s ../../../lib/arm-linux-gnueabihf/libz.so.X [sysroot]/usr/lib/arm-linux-gnueabihf/libz.so