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 installed Ubuntu 14.04 and the current Android development SDK, which contains 32-bit executables. I found that I cannot run those 32-bit binaries. Trying to start them from bash gives me an error:

thomas@thinkpad$ ./adb

bash: ./adb: No such file or directory

It is there though:

thomas@thinkpad$ ls -al ./adb

-rwxrwxrwx 1 thomas thomas 1231255 Jan 17 13:31 ./adb

thomas@thinkpad$ file ./adb

./adb: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped. Same symptom for all the other 32-bit tools in the Android SDK. 

In olden days one could just install 32-bit libraries on 64-bit Ubuntu to get 32-bit support, but that does not seem to work anymore.

How do I run 32-bit apps on a 64-bit Ubuntu 14.04?

share|improve this question

4 Answers 4

up vote 44 down vote accepted

To run a 32-bit executable file on a 64-bit multi-architecture Ubuntu system, you have to add the i386 architecture and install the three library packages libc6:i386, libncurses5:i386, and libstdc++6:i386:

sudo dpkg --add-architecture i386

Or if you are using Ubuntu 12.04 LTS (Precise Pangolin) or below, use this:

echo "foreign-architecture i386" > /etc/dpkg/dpkg.cfg.d/multiarch

Then:

sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386

After these steps, you should be able to run the 32-bit application:

./example32bitprogram
share|improve this answer
    
@AvinashRaj This helped me out! However, what is the last command "sudo ./adb" supposed to do actually? –  Marcel May 22 '14 at 21:33
1  
It executes the 32bit adb binary file which was present in the current directory. –  Avinash Raj May 23 '14 at 1:05
    
to get aapt working on Ubuntu 14.04, I had to install lib32z1 as well, but noticed it pulled in libc6-i386 (distinction, notice the hyphen, not the colon). –  Chris Betti May 23 '14 at 19:09
    
I did your steps, libc6:i386, libncurses5:i386, libstdc++6:i386 are newest version and set to manually installed. But after that it says: "Soma packages could not be installed.This may mean you have requested impossible situation or you are using unstable distribution ..." and unmet dependancies: libstdc++6-4.4-dev:i386 depends g++-4.4:i386(wont be installed). conflicts: libstdc++6-4.4-dbg:i386 ... and other conflicts about libstdc++6-4.4/6/7 etc. What is wrong or should i leave it as it is now? –  Fredrick Gauss Jun 4 '14 at 6:09
    
@FredrickGauss get into here. –  Avinash Raj Jun 4 '14 at 6:13

"No such file or directory" may appaear when you have your binary, but it lacks some libraries. If you install build-essential package, you will have ldd command available. This command ldd ./adb | grep not will show you what libraries are missing. Just install these libraries in i386 arch with apt. Like this: apt-get install libmissing:i386 Beware, some buggy packages will try to delete 64bit version firs.

share|improve this answer
    
Thank you, that would explain the weird error message. I was first confused why bash would give me this error (instead of some error coming more clearly from the child process which misses the libraries), but now I guess bash just sees exec(3) returning ENOENT and prints this out. –  Thomas Stuefe Apr 24 '14 at 12:30

And if you want to use "adb" there is a package for it:

sudo apt-get install android-tools-adb

And about 32-bit libraries - only:

sudo apt-add-architecture i386

will be enough.

share|improve this answer
    
Thanks for the tip, but I wanted to use the android tools downloaded from google, not the ones in the Ubuntu repos. I am also not sure about the completeness of that package. –  Thomas Stuefe Apr 24 '14 at 12:36
    
Ubuntu repositories must have the new version. The package contains only adb. If you want fastboot - there is package for it too :) –  alb3rtano0012 Apr 24 '14 at 12:44

You also have to remember that the i686 architecture wasn't a Sandy Bridge type of design as you may have now. The true difference is the fact the more recent 64-bit architectures now lack a northbridge and the processor now handles the tasks that would typically be handled by the northbridge.

This translates as a completely different synapsis that your 32-bit program hasn't anticipated and compensated for. Linux, I would have to say, isn't intuitive enough to breakdown a 32-bit thread into a 64-bit processor. Think of bytes as a bus (yes, that's funny xD) and bits as the passengers on the bus.

Your i386 program has 32 dudes on a bus that carries 64. The bus driver then says to you and every one aboard, that's not fair to the other 32 bits, and I'm not going anywhere! Then promptly starts eating his lunch.

share|improve this answer
2  
This doesn't make any sense at all. –  sstn Nov 12 '14 at 10:43
    
This is so off the subject it's almost funny. –  Sylvain May 21 at 9:51

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.