Deixo neste post, minha primeira chamada da libc no Android com sucesso (Sem o NDK da Google). Serei o mais claro possível com relação ao meus  passos durante a  jornada. Em primeiro lugar baixei  as  ferramentas GNU necessárias  para a compilação cruzada (ARM GNU/Linux and IA32 GNU/Linux). Yes!!!

Download

Após o download, descompacte o arquivo na pasta de sua preferência, e insira a localização do pacote na  variável ambiental PATH.

Agora crie o arquvio CRT0.S, este arquivo é escrito em Assembly, pois contém informações de inicialização de memória e registradores executada antes do código escrito em C. Assim garantindo que o hardware execute o binário segundo as convenções da linguagem C. O código de inicialização crt0, define um símbolo especial denominado __start, como também inicializa toda a mémoria da seção entre __init_array_start e  __fini_array_start. Ou seja, este símbolo representa o endereço de início de execução do aplicativo hello word.

crt0.s:
 .text
 .global _start
 _start:
 mov     r0, sp
 mov     r1, #0
 add     r2, pc, #4
 add     r3, pc, #4
 b       __libc_init
 b       main
 .word   __preinit_array_start
 .word   __init_array_start
 .word   __fini_array_start
 .word   __ctors_start
 .word   0
 .word   0

 .section .preinit_array
 __preinit_array_start:
 .word   0xffffffff
 .word   0x00000000

 .section .init_array
 __init_array_start:
 .word   0xffffffff
 .word   0x00000000

 .section .fini_array
 __fini_array_start:
 .word   0xffffffff
 .word   0x00000000

 .section .ctors
 __ctors_start:
 .word   0xffffffff
 .word   0x00000000

Agora crie um hello word com o conteúdo a seguir. Vale a  pena mencionar  que o  programa a seguir, define e exibe variáveis ambientais apenas como prova de conceito.

#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv, char**env) {
 int i;
 for (i = 0; i < argc; i++) {
     printf("argv[%d] = %s\n", i, argv[i]);
 }
 for (i = 0; env[i] != NULL; i++) {
     printf("env[%d] = %s\n", i, env[i]);
 }
 printf("PATH = %s\n", getenv("PATH"));
 setenv("HELLO", "world!", 1);
 putenv("GOODBYE=cruel world!");
 printf("HELLO = %s\n", getenv("HELLO"));
 printf("GOODBYE = %s\n", getenv("GOODBYE"));
 return 0;
}

Agora como ambos  arquivos fontes  salvo em disco, compile o mesmo conforme os comando a seguir.

$ arm-none-linux-gnueabi-gcc -c -fno-builtin  -o crt0.o crt0.s
$ arm-none-linux-gnueabi-gcc -c -fno-builtin  -o hello.o hello.c
$ arm-none-linux-gnueabi-ld --dynamic-linker /system/bin/linker \
   -nostdlib  -rpath /system/lib -rpath \
   ~/android/system/lib -L ~/android/system/lib \
   -lc -o hello3 crt0.o hello.o

Agora copie a aplicação para o seu aparelho e execute o primeiro helloword.

$ adb push hello3 /data/run
$ adb shell
# cd /data/run
# ./hello3
argv[0] = ./hello3
env[0] = ANDROID_ROOT=/system
env[1] = PWD=/data/run
env[2] = LD_LIBRARY_PATH=/system/lib
env[3] = PATH=/sbin:/system/sbin:/system/bin:/system/xbin
env[4] = BOOTCLASSPATH=/system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar
env[5] = ANDROID_BOOTLOGO=1
env[6] = ANDROID_ASSETS=/system/app
env[7] = EXTERNAL_STORAGE=/sdcard
env[8] = ANDROID_DATA=/data
env[9] = ANDROID_PROPERTY_WORKSPACE=9,32768
PATH = /sbin:/system/sbin:/system/bin:/system/xbin
HELLO = world!
GOODBYE = cruel world!
#

Lindo não? Agora o céu é o limite na plataforma Android…

“Um velho sábio já dizia que embora muitos se satisfaçam em comer o mel, sempre haverá aqueles que prefeririam mascar as abelhas.”…