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!!!
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.”…
Cabelo, vc. me esclereceu muito !
Estou começando um projeto.
Tenho um APAD e estou tentando compilar o usbms para ele suportar modem 3G USB.
Segui teu tutorial (com as correcoes necrssarias) inclui o usb.h e no momento da linkagem da u seguinte erro:
usbms.o: In function `main’:
usbms.c:(.text+0x13c4): undefined reference to `signal’
usbms.c:(.text+0x1b28): undefined reference to `stderr’
usbms.o: In function `write_bulk’:
usbms.c:(.text+0x1ce4): undefined reference to `__errno_location’
usbms.c:(.text+0x1cf0): undefined reference to `__errno_location’
usbms.o: In function `release_usb_device’:
usbms.c:(.text+0x1efc): undefined reference to `stderr’
usbms.o: In function `ReadParseParam’:
usbms.c:(.text+0x25d0): undefined reference to `stderr’
Nem desconfio o que pode ser… Me de uma luz !