Search code examples
androidandroid-ndkautotoolsautoconf

Cross Compile with autoconf with Android toolchain


Objective Cross compile Cisco libsrtp for Android using NDK toolchain and use libsrtp.a to statically link against my own library.

Setup : I make use of the following file

<setup.sh>
  export CROSS_SYSROOT=/home/psurana/aa/sysroot
  export CROSS_COMPILE=aarch64-linux-android-
  export SYSROOT=/home/psurana/aa/sysroot
  export CC="${CROSS_COMPILE}gcc  --sysroot=${SYSROOT}"
  export CXX="${CROSS_COMPILE}gxx --sysroot=${SYSROOT}" 
  PATH=/home/psurana/aa/bin:$PATH

then I do the following configure:

source setup.sh && ./configure --host=aarch64-linux-android --build=`./config.guess` && make -j

This compiles it for me. doing a readelf -h libsrtp.a, yields--

File: libsrtp.a(ut_sim.o)
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              REL (Relocatable file)
  Machine:                           AArch64
  Version:                           0x1
  Entry point address:               0x0
  Start of program headers:          0 (bytes into file)
  Start of section headers:          1480 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           0 (bytes)
  Number of program headers:         0
  Size of section headers:           64 (bytes)
  Number of section headers:         10
  Section header string table index: 7

So far so good.

Problem

However, when I link libsrtp.a as a prebuilt static library, I get following errors:

./srtp/libsrtp.a(rand_source.o): In function `rand_source_init':

err.c:(.text+0x0): undefined reference to `stdout'
err.c:(.text+0xc): undefined reference to `stdout'

and,

rand_source.c:(.text+0x28): undefined reference to `stderr'
rand_source.c:(.text+0x3c): undefined reference to `stderr'

My understanding is that Android does not have stderr in its libc, but then how does libsrtp get these?

I have previously built the same library using something similar and I know it builds. I do not know what the error might be.


Solution

  • I usually get this undefined reference with libc in any platform after 21 so I usually add -D__ANDROID_API__=21 to CFLAGS and it ends up fixing it. I believe the issue comes from the new unified headers in newer ndk versions.