Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

I am using an Ubuntu 12.10 (ARMHF) distribution on a panda board. I want to run applications compiled for ARMEL. It was not possible due to a changed dynamic loader location (https://wiki.linaro.org/OfficeofCTO/HardFloat/LinkerPathCallApr2012)

I succeeded by creating the following symbolic link /lib/ld-linux.so.3 -> /lib/ld-linuxarmhf.so.3

Is there a way to install a portability package instead? Is there a reason why this is not done by the distribution?

Thanks in advance

share|improve this question

2 Answers 2

Perhaps, such a compatibility package doesn't exist (for the purpose of running older, 3rd-party armhf binaries expecting /lib/ld-linux.so.3 instead of the new standard, agreed upon /lib/ld-linuxarmhf.so.3, right?) because that package (if installed) would give a "false promise" to suit just any armel binaries. But the armhf dynamic linker must break armel binaries because the ABIs are incompatible, if I understand this correctly. (In this case, the correct solution would be to wrap the few special non-standard armhf binaries so that the expected location of the dynamic linker is adapted for your system. Or re-write this value in the binaries. If this is possible. Then this won't cause any problems when you'd try to run real armel binaries.)

On the other hand, if you want to run real armel binaries on an armhf system, you need simply to go for "multiarch" (and hence use a real armel dynamic linker, instead of your symlink!): install the armel prerequisites for your armel binaries. Among the prerequisites, libc6:armel or the like (correct the pkg name if I'm wrong, please) would certainly include the needed /lib/ld-linux.so.3.

(Regarding the incompatibility of the ABIs: As I could understand, in armhf, floating-point arguments are passed directly in floating-point registers, whereas in armel, they are passed in integer registers. This indirection adds extra cost for ARM that support floating-point, that's why armhf is better for modern ARM.)

share|improve this answer

The dynamic linker is baked in at compile time. to see which dynamic linker is being used run. readelf -l /usr/bin/foo | grep Request

The only way to change this is to adjust the gcc spec files. See gcc -dumpspecs | grep ld-linux. Or by passing the --dynamic-linker flag to the linker at build time with something like gcc -Wl,--dynamic-linker,/lib/ld-linux.so.3 foo.c

However none of that is needed if the toolchain is setup up right, and you really should not mess with it unless you really have a reason for it.

In short your solution is probably the best one, however I would try to find the armhf package and use that if you can, or rebuild the package.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.