ARM Linux software fun
wtorek, 30 listopada 2010
wrong ELF class: ELFCLASS64
I'm using Telit provided arm-linux compiler to compile software for our latest project. The problem is the compiler is provided only as virtual linux machine for windows. Once you've got it installed you can take out the compilers binaries and move it to your linux machine. The compiler is located in /opt/crosscompiler/ in addition you also have already configured eclipse development environment in /opt/eclipse/
I've moved both folder to my native linux. It should run straight away on 32bit machine. The problem was running it on amd64 architecture.
mariusz@star:/opt/eclipse$ ./eclipse
/usr/lib/gio/modules/libgvfsdbus.so: wrong ELF class: ELFCLASS64
Failed to load module: /usr/lib/gio/modules/libgvfsdbus.so
Obviously, the binary is trying to load 64bit library libgvfsdbus.so instead of 32bit. Let's make sure I have 32bit libs installed:
mariusz@star:/opt/eclipse$ sudo apt-get install ia32-libs lib32stdc++6 lib32gcc1
Ok, now check what libs are actually called
mariusz@star:/opt/eclipse$ ldd ./eclipse
linux-gate.so.1 => (0xf7712000)
libgtk-x11-2.0.so.0 => /usr/lib32/libgtk-x11-2.0.so.0 (0xf7340000)
libgdk_pixbuf-2.0.so.0 => /usr/lib32/libgdk_pixbuf-2.0.so.0 (0xf7327000)
libgobject-2.0.so.0 => /usr/lib32/libgobject-2.0.so.0 (0xf72e4000)
libgdk-x11-2.0.so.0 => /usr/lib32/libgdk-x11-2.0.so.0 (0xf724d000)
libpthread.so.0 => /lib32/libpthread.so.0 (0xf7214000)
libdl.so.2 => /lib32/libdl.so.2 (0xf7210000)
libc.so.6 => /lib32/libc.so.6 (0xf70b6000)
libXext.so.6 => /usr/lib32/libXext.so.6 (0xf70a5000)
libXrender.so.1 => /usr/lib32/libXrender.so.1 (0xf709b000)
libXinerama.so.1 => /usr/lib32/libXinerama.so.1 (0xf7097000)
libXi.so.6 => /usr/lib32/libXi.so.6 (0xf7089000)
libXrandr.so.2 => /usr/lib32/libXrandr.so.2 (0xf7081000)
libXcursor.so.1 => /usr/lib32/libXcursor.so.1 (0xf7077000)
libpangocairo-1.0.so.0 => /usr/lib32/libpangocairo-1.0.so.0 (0xf706a000)
libX11.so.6 => /usr/lib32/libX11.so.6 (0xf6f4d000)
libXcomposite.so.1 => /usr/lib32/libXcomposite.so.1 (0xf6f49000)
libXdamage.so.1 => /usr/lib32/libXdamage.so.1 (0xf6f45000)
libXfixes.so.3 => /usr/lib32/libXfixes.so.3 (0xf6f3f000)
libatk-1.0.so.0 => /usr/lib32/libatk-1.0.so.0 (0xf6f23000)
libcairo.so.2 => /usr/lib32/libcairo.so.2 (0xf6e70000)
libm.so.6 => /lib32/libm.so.6 (0xf6e4a000)
libpng12.so.0 => /usr/lib32/libpng12.so.0 (0xf6e25000)
libgio-2.0.so.0 => /usr/lib32/libgio-2.0.so.0 (0xf6d39000)
libpangoft2-1.0.so.0 => /usr/lib32/libpangoft2-1.0.so.0 (0xf6d12000)
libpango-1.0.so.0 => /usr/lib32/libpango-1.0.so.0 (0xf6cd0000)
libfreetype.so.6 => /usr/lib32/libfreetype.so.6 (0xf6c59000)
libz.so.1 => /usr/lib32/libz.so.1 (0xf6c44000)
libfontconfig.so.1 => /usr/lib32/libfontconfig.so.1 (0xf6c14000)
libgmodule-2.0.so.0 => /usr/lib32/libgmodule-2.0.so.0 (0xf6c0f000)
libgthread-2.0.so.0 => /usr/lib32/libgthread-2.0.so.0 (0xf6c0a000)
librt.so.1 => /lib32/librt.so.1 (0xf6c01000)
libglib-2.0.so.0 => /lib32/libglib-2.0.so.0 (0xf6b32000)
libpcre.so.3 => /lib32/libpcre.so.3 (0xf6afd000)
/lib/ld-linux.so.2 (0xf7713000)
libxcb.so.1 => /usr/lib32/libxcb.so.1 (0xf6ae2000)
libpixman-1.so.0 => /usr/lib32/libpixman-1.so.0 (0xf6a82000)
libxcb-shm.so.0 => /usr/lib32/libxcb-shm.so.0 (0xf6a7e000)
libxcb-render.so.0 => /usr/lib32/libxcb-render.so.0 (0xf6a76000)
libresolv.so.2 => /lib32/libresolv.so.2 (0xf6a61000)
libselinux.so.1 => /lib32/libselinux.so.1 (0xf6a45000)
libexpat.so.1 => /lib32/libexpat.so.1 (0xf6a1e000)
libXau.so.6 => /usr/lib32/libXau.so.6 (0xf6a1a000)
libXdmcp.so.6 => /usr/lib32/libXdmcp.so.6 (0xf6a14000)
Ok, so eclipse binary is fine, must be something else.
mariusz@star:/opt/eclipse$ strace -f -F -o log.txt ./eclipse
[ Process PID=10746 runs in 32 bit mode. ]
[ Process PID=10747 runs in 64 bit mode. ]
[ Process PID=10746 runs in 32 bit mode. ]
/usr/lib/gio/modules/libgvfsdbus.so: wrong ELF class: ELFCLASS64
Failed to load module: /usr/lib/gio/modules/libgvfsdbus.so
-f option is to strace forks
-F options it to strace vforks
-o is the output log file
From that we can see the process 10747 is running in 64 bit mode. Lets gedit log.txt and see what process 10747 was:
10747 execve("/usr/bin/java", ["/usr/bin/java", "-Dosgi.requiredJavaVersion=1.5", "-Xms40m", "-Xmx256m", "-jar", "/opt/eclipse/plugins/org.eclipse"..., "-os", "linux", "-ws", "gtk", "-arch", "x86", "-showsplash", "-launcher", "/opt/eclipse/eclipse", "-name", ...], [/* 32 vars */]) = 0
So the eclipse 32bit binary is using 64 bit java version. We need to install 32bit version of java, but I don't want to get rid of 64 bit version either. Lets gedit log.txt to find where eclipse binary was looking for java:
10746 stat64("/opt/eclipse/jre/bin/java", 0xffd1e66c) = -1 ENOENT (No such file or directory)
10746 stat64("/usr/local/sbin/java", 0xffd1e66c) = -1 ENOENT (No such file or directory)
10746 stat64("/usr/local/bin/java", 0xffd1e66c) = -1 ENOENT (No such file or directory)
10746 stat64("/usr/sbin/java", 0xffd1e66c) = -1 ENOENT (No such file or directory)
10746 stat64("/usr/bin/java", {st_mode=S_IFREG|0755, st_size=39520, ...}) = 0
The first path to look for was /opt/eclipse/jre/bin/java ! So let's install 32bit java there. We can get package from http://packages.ubuntu.com/karmic-updates/amd64/ia32-sun-java6-bin/download (there's currently no package for ubuntu 10.10):
mariusz@star:/opt/eclipse$ wget http://ftp.halifax.rwth-aachen.de/ubuntu//pool/multiverse/s/sun-java6/ia32-sun-java6-bin_6.22-0ubuntu1~9.10.1_amd64.deb
mariusz@star:/opt/eclipse$ ar vx ia32-sun-java6-bin_6.22-0ubuntu1~9.10.1_amd64.deb
x - debian-binary
x - control.tar.gz
x - data.tar.gz
mariusz@star:/opt/eclipse$ tar -xzf data.tar.gz
mariusz@star:/opt/eclipse$ mv usr/lib/jvm/ia32-java-6-sun/jre .
mariusz@star:/opt/eclipse$ rm -R usr/
mariusz@star:/opt/eclipse$ rm control.tar.gz data.tar.gz debian-binary
Done, now you can start eclipse without errors.
Subskrybuj:
Posty (Atom)