HIPL on Android

Bug #715126 reported by Miika Komu
8
This bug affects 1 person
Affects Status Importance Assigned to Milestone
HIPL
Fix Committed
Wishlist
Pupu Toivonen

Bug Description

HIPL does not build or work on Android yet. Android platform is problematic because it is targeted for java applications. The challenges include:

* DNS proxy is written with python, so it's not possible to port it at all
* The h/w platform for Android is really picky with memory alignments and requires some modifications to the code.
* Many of the libraries are missing, so HIPL has to be cross-compiled and statically linked with some ofthe libraries.

However, the latest Android 2.3 seems to have OpenSSL already available should make the work easier. Please check out (especially the end of the latter link):

http://gigaom.com/video/vlc-for-android-coming-soon/
http://developer.android.com/sdk/android-2.3-highlights.html

Revision history for this message
Miika Komu (miika-iki) wrote :
Download full text (3.7 KiB)

This is what we have managed so far to complete with a student with a bit older version of HIPL:

1 Download arm-linux tools-chain:
download from http://www.handhelds.org/download/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2
unzip tar to / directory.
export PATH=$PATH:/usr/local/arm/3.4.1/bin

2 build openssl:
download openssl source code from http://www.openssl.org/source/
./config no-asm shared
Change the Makefile
replace the section started from line 62 with the following:

CC= arm-linux-gcc
CFLAG= -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DOPENSSL_N -DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall
DEPFLAG= -DOPENSSL_NO_GMP -DOPENSSL_NO_JPAKE -DOPENSSL_NO_MD2 -DOPENSSL_NO_R C5 -DOPENSSL_NO_RFC3779 -DOPENSSL_NO_STORE
PEX_LIBS=
EX_LIBS= -ldl
EXE_EXT=
ARFLAGS=
AR= arm-linux-ar $(ARFLAGS) r
RANLIB= arm-linux-ranlib
NM= arm-linux-nm
PERL= /usr/bin/perl
TAR= tar
TARFLAGS= --no-recursion
MAKEDEPPROG= gcc
LIBDIR=lib

and then make it!
make install

3 download Android SDK and NDK
http://developer.android.com/sdk/index.html
http://developer.android.com/sdk/ndk/index.html
unzip ndk into sdk directory.
export ANDROID_ROOT=XXX/android-sdk-linux_86/android-ndk-r3
export PATH=$PATH:XXX/android-sdk-linux_86/android-ndk-r3/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin

copy openssl headers from openssl-1.0.0a/include/openssl directory to $ANDROID_ROOT/build/platforms/android-3/arch-arm/usr/include/ directory
copy libcrypto.so and libcrypto.a libraries to $ANDROID_ROOT/build/platforms/android-3/arch-arm/usr/lib/ directory

4 build HIPL
product configure by run command
autoreconf --install

method 1: use arm-eabi-gcc provided by NDK:
./configure -host=arm-eabi CC=arm-eabi-gcc CPPFLAGS=”-I$ANDROID_ROOT/build/platforms/android-3/arch-arm/usr/include/” CFLAGS=”-nostdlib” LDFLAGS=”-Wl,-rpath-link=$ANDROID_ROOT/build/platforms/android-3/arch-arm/usr/lib/ -L$ANDROID_ROOT/build/platforms/android-3/arch-arm/usr/lib/” LIBS=”-lc “
method 2 (WORKS): use arm-linux-gcc which is a general crosscompile tool:
./configure --disable-gcc-warn --disable-firewall -host=arm-linux CC=arm-linux-gcc CPPFLAGS="-I$OPENSSL/include/" CFLAGS="-nostdlib" LDFLAGS="-Wl,-rpath-link=$ANDROID_ROOT/build/platforms/android-3/arch-arm/usr/lib,-L$ANDROID_ROOT/build/platforms/android-3/arch-arm/usr/lib/" LIBS="-lc"

If you get this far, there are some compilation issues for you to solve:

In file included from ./lib/modularization/lmod.h:37,
                 from lib/core/state.h:37,
                 from lib/core/builder.h:43,
                 from lib/core/builder.c:98:
./lib/core/linkedlist.h:64: warning: declaration of 'index' shadows a global declaration
/home/mkomu/usr/local/arm/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/string.h:267: warning: shadowed declaration is here
./lib/core/linkedlist.h:67: warning: declaration of 'index' shadows a global declaration
/home/mkomu/usr/local/arm/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/../../../../arm-linux/sys-include/string.h:267: warning: shadowed declaration is here
./lib/core/linkedlist.h:70: warning: declaration of 'index' shadows a global declaration
/home/mkomu/usr/l...

Read more...

Changed in hipl:
importance: Undecided → Wishlist
Revision history for this message
Miika Komu (miika-iki) wrote :

The alignment problems can be fixed with:

system("echo 3 > /proc/cpu/alignment");

However, this degrades the performance of the system radically. So, this was solved by a student (on some really old version of Android) using packed data structures. I have some patches from him, but I am not going to publish them online because they do not work with the current data base. Instead, I'll just quote his report:

When you cast unaligned pointer to an aligned type, the gcc takes your word and inlines memcpy. But this will generate unaligned trap, but will work in x86 and other processors where unaligned accesses will be fixed automatically, but not in ARM.

For example, the following code will raise SIGBUS when run in ARM
(in foo(), the types are same, even though we have typecasted it from a packed struct, so gcc inlines the memcpy)

#include <string.h>

typedef struct {
  unsigned int a;
  unsigned int b;
  unsigned char c;
} s;

typedef struct {
  unsigned int a;
  unsigned int b;
  unsigned char c;
} __attribute__ ((packed)) ust;

void foo(s *cp)
{
  s dst;

  memcpy(&dst, cp, sizeof(s));

  return 0;
}

int main(int k, char *kk[]) {

  ust tt;
  return foo(&tt);
}

One place where this was causing a problem was hadb.c::hip_hadb_find_byhits(). There is still one more place where this problem is present: nlink.c::xfrm_fill_selector(), because "struct in6_addr" is packed but not any of the xfrm* structs. But I am not sure if I should modify it, so I have disabled optimization for that lib (libhiptool) for now.

Revision history for this message
Diego Biurrun (diego-biurrun) wrote :

The compilation problems about shadowed declarations should be trivial to fix. Just rename the "index" variables to "idx".

Miika Komu (miika-iki)
Changed in hipl:
assignee: nobody → ibrahim (brah-gharbi)
Revision history for this message
Miika Komu (miika-iki) wrote :

Rene gave a pointer earlier: the new GCC version may actually help you with HIPL for Android:
http://www.h-online.com/open/news/item/Many-new-features-in-GCC-4-6-1216177.html

Ibraham, feel free to pose questions here too...

Revision history for this message
Miika Komu (miika-iki) wrote :

Ibrahim will not be able to complete this task.

Changed in hipl:
assignee: ibrahim (brah-gharbi) → nobody
Miika Komu (miika-iki)
Changed in hipl:
assignee: nobody → Vidhuran (vidhuran2012)
Revision history for this message
Miika Komu (miika-iki) wrote :
Revision history for this message
Miika Komu (miika-iki) wrote :

New up-to-date instructions for Ubuntu *oneiric*. Did not double check the instructions, I hope they are ok from my history. I don't know if there's some unncessary parts in the instructions.

Please note that there's absolutely no reason install android stuff to "/" - everything should be in your home directory. Also, no need to have root privileges for compilation.

# gcc -6 requires a new Ubuntu
mkomu@bling:~/projects/hipl-bzr/arm$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 11.10
Release: 11.10
Codename: oneiric

# let's install it, no need to compile in Oneiric
sudo aptitude install gcc-4.6-arm-linux-gnueabi

# Download and SDK and NDK. Set Android root to make paths shorter later.
cd ~
wget http://dl.google.com/android/android-sdk_r16-linux.tgz
tar xvzf android-sdk_r16-linux.tgz
cd android-sdk-linux
wget http://dl.google.com/android/ndk/android-ndk-r7-linux-x86.tar.bz2
tar xvjf android-ndk-r7-linux-x86.tar.bz2
export ANDROID_ROOT=~/android-sdk-linux/android-ndk-r7
source ~/.bashrc

# Download, compile, modify and install OpenSSL to the NDK directory.
cd ~
wget http://www.openssl.org/source/openssl-1.0.0g.tar.gz
tar xvzf openssl-1.0.0g.tar.gz
cd openssl-1.0.0g
./config no-asm shared --prefix=$ANDROID_ROOT/platforms/android-3/arch-arm/usr
edit Makefile:
  CC= arm-linux-gnueabi-gcc-4.6
  CFLAG= -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DOPENSSL_N -DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall -fPIC
  DEPFLAG= -DOPENSSL_NO_GMP -DOPENSSL_NO_JPAKE -DOPENSSL_NO_MD2 -DOPENSSL_NO_R C5 -DOPENSSL_NO_RFC3779 -DOPENSSL_NO_STORE
  PEX_LIBS=
  EX_LIBS= -ldl
  EXE_EXT=
  ARFLAGS=
  AR= arm-linux-gnueabi-ar $(ARFLAGS) r
  RANLIB= arm-linux-gnueabi-ranlib
  NM= arm-linux-gnueabi-nm
  PERL= /usr/bin/perl
  TAR= tar
  TARFLAGS= --no-recursion
  MAKEDEPPROG= gcc
  LIBDIR=lib
make install

# Download and cross-compile HIPL.
cd ~
bzr co lp:hipl trunk
cd trunk
edit configure.ac and comment out all AM_CFLAGS
autoreconf --install
./configure --disable-gcc-warn --disable-firewall -host=arm-linux CC=arm-linux-gnueabi-gcc-4.6 CPPFLAGS="-I$ANDROID_ROOT/platforms/android-3/arch-arm/usr/include" CFLAGS="-nostdlib" LDFLAGS="-Wl,-rpath-link=$ANDROID_ROOT/platforms/android-3/arch-arm/usr/lib,-L$ANDROID_ROOT/platforms/android-3/arch-arm/usr/lib" LIBS="-lc"
make
make all-am
make[1]: Entering directory `/home/mkomu/projects/hipl-bzr/arm'
  CC lib/core/builder.lo
In file included from lib/core/debug.h:34:0,
                 from lib/core/crypto.h:43,
                 from lib/core/builder.c:100:
lib/core/protodefs.h:917:5: error: unknown type name 'in_port_t'
lib/core/protodefs.h:929:5: error: unknown type name 'in_port_t'
lib/core/protodefs.h:1027:5: error: unknown type name 'in_port_t'
lib/core/protodefs.h:1036:5: error: unknown type name 'in_port_t'
lib/core/protodefs.h:1043:5: error: unknown type name 'in_port_t'
lib/core/protodefs.h:1054:5: error: unknown type name 'in_port_t'
lib/core/protodefs.h:1055:5: error: unknown type name 'in_port_t'
...
(it appears in_port_t definition is missing from android (?), so it may have to be declared redudantly in some header file)

Revision history for this message
Miika Komu (miika-iki) wrote :
Miika Komu (miika-iki)
Changed in hipl:
assignee: Vidhuran (vidhuran2012) → Juhani Toivonen (scolphoy)
Pupu Toivonen (scolphoy)
Changed in hipl:
status: New → In Progress
Revision history for this message
Pupu Toivonen (scolphoy) wrote :

Just an update, the code doesn't completely compile yet, but this is how I'd initialize a build environment under Ubuntu 13.04 now:

sudo apt-get -y install gcc-4.7-arm-linux-gnueabi autoconf automake libtool make gcc libssl-dev iptables-dev libnet-ip-perl libnet-dns-perl bzr libnetfilter-queue-dev xmlto doxygen check libconfig8-dev fakeroot dpkg-dev debhelper devscripts w3m;

cd ~
wget http://dl.google.com/android/android-sdk_r22.0.5-linux.tgz
tar xvf android-sdk_r22.0.5-linux.tgz
cd android-sdk-linux/
wget http://dl.google.com/android/ndk/android-ndk-r9-linux-x86_64.tar.bz2
tar xvf android-ndk-r9-linux-x86_64.tar.bz2
cd android-ndk-r9/
echo "export ANDROID_ROOT=$(pwd)" >> ~/.bashrc
export ANDROID_ROOT=$(pwd)

cd ~
wget http://www.openssl.org/source/openssl-1.0.0g.tar.gz
tar xvzf openssl-1.0.0g.tar.gz
cd openssl-1.0.0g
./config no-asm shared --prefix=$ANDROID_ROOT/platforms/android-18/arch-arm/usr
wget http://bit.net.co/hipl/droid-openssl-makefile.patch
patch Makefile < droid-openssl-makefile.patch
make install

cd ~
mkdir hipl
cd hipl
bzr branch lp:~hipl-core/hipl/android-port-new
cd android-port-new
autoreconf --install
./configure --disable-gcc-warn --disable-firewall -host=arm-linux CC=arm-linux-gnueabi-gcc-4.7 CPPFLAGS="-I$ANDROID_ROOT/platforms/android-18/arch-arm/usr/include" CFLAGS="-nostdlib -std=gnu99" LDFLAGS="-Wl,-rpath-link=$ANDROID_ROOT/platforms/android-18/arch-arm/usr/lib,-L$ANDROID_ROOT/platforms/android-18/arch-arm/usr/lib" LIBS="-lc"

echo "You are now ready to run 'make' and 'make all-am'"

Revision history for this message
Miika Komu (miika-iki) wrote :

From Juhani (another way to configure):

./configure --disable-gcc-warn --disable-firewall --host=arm-linux --enable-cross-compile CC=$ANDROID_ROOT/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc CPPFLAGS="-I$ANDROID_ROOT/platforms/android-18/arch-arm/usr/include" CFLAGS="-nostdlib -std=gnu99" LDFLAGS="-Wl,--entry=main,-rpath-link=$ANDROID_ROOT/platforms/android-18/arch-arm/usr/lib,-L$ANDROID_ROOT/platforms/android-18/arch-arm/usr/lib" LIBS="-lc -lgcc";

Miika Komu (miika-iki)
Changed in hipl:
status: In Progress → Fix Committed
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.