171

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:

$ ./adb
bash: ./adb: No such file or directory

It is there though:

$ ls -al ./adb
-rwxrwxrwx 1 thomas thomas 1231255 Jan 17 13:31 ./adb
$ 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 distribution?

4

5 Answers 5

251

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

If fails, do also

sudo apt-get install multiarch-support

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

./example32bitprogram
10
  • @AvinashRaj This helped me out! However, what is the last command "sudo ./adb" supposed to do actually?
    – Marcel
    May 22, 2014 at 21:33
  • 1
    It executes the 32bit adb binary file which was present in the current directory. May 23, 2014 at 1:05
  • 1
    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). May 23, 2014 at 19:09
  • 1
    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? Jun 4, 2014 at 6:09
  • @FredrickGauss get into here. Jun 4, 2014 at 6:13
12

"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.

1
  • 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. Apr 24, 2014 at 12:30
9

Additionally to the excellent answer of Zanna and Avinash Raj I had to install gcc-multilib as well:

sudo apt-get install gcc-multilib

Possibly this is because I wanted to run an old gcc version on 64bit.

5

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.

2
  • 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. Apr 24, 2014 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 :)
    – aastefanov
    Apr 24, 2014 at 12:44
0

Just an addition to Zanna:
The following has solved the android studio problem of "unable to install libraries":

sudo apt-get install libdb1-compact tzdata initscripts

This replaces missing library libstdc++6-i386 which is probably because the package has been obsoleted. Not sure why this specific library was important.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .