Solved

Linux, Centos 5.2 (RHEL 5), compiling live555 for X-Linux embedded, c++: Incompatable libraries

Posted on 2008-06-25
2
1,963 Views
Last Modified: 2013-12-16
My current setup looks like this.....

Host:
   : Dell D800 1.7GHZ with Centos 5.2 which is equivalent with RHEL 5.
   : Your Developer's manual indicates to install Red Hat, Mandrake, or SUSE.  Centos is made from same source as RHEL.

Target:
   : Vortex86SX with 2GB DOM
   : X-Linux from DMP vi GHOST

I have a program that I compiled on the Host with following ldd program:
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00235000)        Actual version: libstdc++.so.6.0.8
        libm.so.6 => /lib/libm.so.6 (0x007a0000)                              Actual version: libm-2.5.so
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00a9c000)                Actual version: libgcc_s-4.1.2-20080102.so.1
        libc.so.6 => /lib/libc.so.6 (0x00655000)                                Actual version: libc-2.5.so
        /lib/ld-linux.so.2 (0x00633000)                                             Actual version: ld-2.5.so


So I copied...over libstdc++ and libgcc over to the Target via ftp, following the Install your program instructions.  When I run the program on the target, I get:
/usr/bin/program: error while loading shard libraries: libstdc++.so.6: cannot handle TLS data

In investigating, I found that the other libraries in the ldd are symmlinks to different versions of the libraries...for instance
   Target:
       libc.so.6 => libc-2.3.3.so
   Host:
       libc.so.6 => libc-2.5.so

The Targets versions look like this:
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00235000)        Not there....copied
        libm.so.6 => /lib/libm.so.6 (0x007a0000)                              Actual version: libm-2.3.3.so
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00a9c000)                Not there...copied
        libc.so.6 => /lib/libc.so.6 (0x00655000)                                Actual version: libc-2.3.3.so
        /lib/ld-linux.so.2 (0x00633000)                                             Actual version: ld-2.3.3.so

I am pretty sure that just copying these other libraries will fix the problem with the program I wrote, but won't it break the programs on the target?  I don't want to break them...

Recall the target is running X-Linux 2.54 http://www.dmp.com.tw/tech/os-xlinux/ so I can't really upgrade this so I will have to find a way to compile on the Centos Host machine and then transfer exe to the Target.

How do I get the appropriate libstdc++.so.6 and libgcc_s.so.1 that match up with the already existing other libraries on the Target.  How do I compile against these libraries...I don't want to break the Host either by "downgrading".  I am pretty sure the Host machine would become unusable with all those old versions.

Thanks in advance.
0
Comment
Question by:javatexan
2 Comments
 
LVL 9

Expert Comment

by:e-tsik
ID: 21907248
Hi :-)

I know this problem, but from another direction - when I try to ship a glibc along with the executable and redirect the library using LD_LIBRARY_PATH .
tls is threading method introduced by later GCCs. GCC can compile and/or link against the TLS version of glibc or the non-tls version. LD also has to be able to link to the proper version on the other side.
Using CentOS 4, your GCC is 4 . If sending a glibc would not work then you can either make GCC not compile tls code for you (man gcc ?) .
I googled and saw some references to a GCC bug. Here is the one I think is most relevant:
http://www.mail-archive.com/debian-gcc@lists.debian.org/msg18769.html

Hope this helps
:-)
0
 

Accepted Solution

by:
javatexan earned 0 total points
ID: 21928024
I found an answer.  First off I had to find a distro that was binary compatable.  I had to find a version of Centos that had closer versions of the common libraries, if not older than the X-Linux had.  After installing Centos version 4 and 3 on two separate VMs, I found Centos 3.9 to be slightly older than the target.  In fact it was one rev older on each of the common libraries.  

Then I recompiled my code in Centos 3.9 and hoped that it did not rely upon newer features of C++ and such...I lucked out.  Then I copied the binaries and libraries over to the target and voila.  Working system.

The boss didn't like using a really old version b/c of security fixes etc....so now I have to figure out how to cross compile and create a host/target system, building kernels and the whole nine yards :P.
0

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Fine Tune your automatic Updates for Ubuntu / Debian
Google Drive is extremely cheap offsite storage, and it's even possible to get extra storage for free for two years.  You can use the free account 15GB, and if you have an Android device..when you install Google Drive for the first time it will give…
Learn several ways to interact with files and get file information from the bash shell. ls lists the contents of a directory: Using the -a flag displays hidden files: Using the -l flag formats the output in a long list: The file command gives us mor…
Learn how to find files with the shell using the find and locate commands. Use locate to find a needle in a haystack.: With locate, check if the file still exists.: Use find to get the actual location of the file.:

831 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question