cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
tcurbishley
Level 3

Building a vendor daemon for maximum portability: libc.so.6 not found

How do you compile your vendor daemon for maximum portability to older (Linux) systems?

We recently upgraded our Linux development system to openSUSE LEAF 42.1. In the process, we movied from glibc2.14 to glibc 2.19.
Previous to the upgrade, we could build a vendor daemon on our system and it would work on pretty much any Linux flavor and version we tried.
Since the upgrade, our customers often see the following message when they start up lmadmin: "/lib/libc.so.6: version `GLIBC_2.14' not found (required by fnpdaemon)"

As I understand (from posts like this: http://lightofdawn.org/wiki/wiki.cgi/-wiki/NewAppsOnOldGlibc), glibc is very backward compatible in that old apps will run under new glibc versions, but it's a little more complicated for new apps running under older versions of glibc.

The daemon produced by our older glibc 2.14 system ran everywhere, while the same daemon built with glibc 2.19 needs glibc 2.14 or newer. I would like to be able to build a vendor daemon on our development system that runs on the maximum possible number of target systems. Perhaps that means linking against an older glibc. Perhaps there are other tricks. How do you build your vendor daemon?

0 Kudos
(1) Reply
tcurbishley
Level 3

The answer is to build your vendor daemon on an older system.

The maintainers of glibc go to great pains to ensure backward compatibility. It works very well going forward, that is, running an executable built with an older version of glibc runs on a system that features a newer version of glibc. Going in the other direction doesn't always work; an executable build with a newer version of glibc will not necessarily run on a system that features an older version of glibc. The dividing line appears to be glibc 2.14. If your older/newer systems are all earlier than 2.14, everything runs. Likewise if the older/newer systems are later than 2.14. It's when you build your executable on a "new" system (glibc > 2.14) and try to run it on an "older" system (glibc < 2.14) that there is trouble.

The ray of hope is that executables built on an "older" system seem to run well on "new" systems.

My solution was to create an "old" system in a virtual machine to build our daemons. In my case I created a VM in VirtualBox and installed CentOS 6.5, which has glibc 2.12. Add some compilers and install the FNP toolkit, and you're ready to build portable daemons.

Hope this helps someone!
0 Kudos