2014-04-30 31 views
7

tl; dr
Come posso compilare Ada codice sorgente in un file di libreria statica adatto per applicazioni su obiettivi iPad con sistema operativo iOS di collegare contro? (GCC non è un requisito. Soluzioni utilizzando LLVM o altri sono i benvenuti!)
Ada cross-compilatore per iOS si rivolge


Ho una grande libreria di codice Ada portatile che vorrei utilizzare in un progetto iPad/iOS. Il mio sistema operativo host è Mac OS X 10.9 (con GCC 4.8.1 installato a /opt/local con MacPorts). Per fare questo, sto cercando di creare un cross-compiler ARM GCC con supporto Ada.

sono in grado di costruire un GCC di lavoro e GNAT che crea eseguibili ARM, ma io non riesco a costruire o installare la libreria standard di Ada, che è necessario per costruire il mio codice Ada

I pacchetti sorgente I 'm utilizzando:

gcc-4.8.1 
binutils-2.24 
libiconv-1.14 
gmp-5.1.3 
mpc-1.0.2 
mpfr-3.1.2 

La configurazione GCC costruzione:

$ bin/arm-none-eabi-gcc -v --version 
Using built-in specs. 
COLLECT_GCC=bin/arm-none-eabi-gcc 
COLLECT_LTO_WRAPPER=/Users/ardnew/cross/libexec/gcc/arm-none-eabi/4.8.1/lto-wrapper 
arm-none-eabi-gcc (GCC) 4.8.1 
Copyright (C) 2013 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 


Target: arm-none-eabi 
Configured with: /Users/ardnew/cross/src/gcc-4.8.1/configure --target=arm-none-eabi --prefix=/Users/ardnew/cross --with-cpu=cortex-a8 --enable-languages=c,ada --disable-multilib --enable-interwork --disable-threads --disable-shared --disable-nls --disable-lto --disable-libssp --disable-decimal-float --disable-libgomp --disable-libmudflap 
Thread model: single 
gcc version 4.8.1 (GCC) 
COLLECT_GCC_OPTIONS='-v' '--version' '-mcpu=cortex-a8' 
/Users/ardnew/cross/libexec/gcc/arm-none-eabi/4.8.1/cc1 -quiet -v -D__USES_INITFINI__ help-dummy -quiet -dumpbase help-dummy -mcpu=cortex-a8 -auxbase help-dummy -version --version -o /var/folders/4c/y_sll7bj6b9bt15389wr66_80000gn/T//ccrSSKFx.s 
GNU C (GCC) version 4.8.1 (arm-none-eabi) 
    compiled by GNU C version 4.8.1, GMP version 5.1.3, MPFR version 3.1.2, MPC version 1.0.2 
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
COLLECT_GCC_OPTIONS='-v' '--version' '-mcpu=cortex-a8' 
/Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/../../../../arm-none-eabi/bin/as -mcpu=cortex-a8 -meabi=5 --version -o /var/folders/4c/y_sll7bj6b9bt15389wr66_80000gn/T//ccZYvQLp.o /var/folders/4c/y_sll7bj6b9bt15389wr66_80000gn/T//ccrSSKFx.s 
GNU assembler (GNU Binutils) 2.24 
Copyright 2013 Free Software Foundation, Inc. 
This program is free software; you may redistribute it under the terms of 
the GNU General Public License version 3 or later. 
This program has absolutely no warranty. 
This assembler was configured for a target of `arm-none-eabi'. 
COMPILER_PATH=/Users/ardnew/cross/libexec/gcc/arm-none-eabi/4.8.1/:/Users/ardnew/cross/libexec/gcc/arm-none-eabi/4.8.1/:/Users/ardnew/cross/libexec/gcc/arm-none-eabi/:/Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/:/Users/ardnew/cross/lib/gcc/arm-none-eabi/:/Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/../../../../arm-none-eabi/bin/ 
LIBRARY_PATH=/Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/:/Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/../../../../arm-none-eabi/lib/ 
COLLECT_GCC_OPTIONS='-v' '--version' '-mcpu=cortex-a8' 
/Users/ardnew/cross/libexec/gcc/arm-none-eabi/4.8.1/collect2 -X --version /Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/crti.o /Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/crtbegin.o crt0.o -L/Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1 -L/Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/../../../../arm-none-eabi/lib /var/folders/4c/y_sll7bj6b9bt15389wr66_80000gn/T//ccZYvQLp.o --start-group -lgcc -lc --end-group /Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/crtend.o /Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/crtn.o 
collect2 version 4.8.1 
/Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/../../../../arm-none-eabi/bin/ld -X --version /Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/crti.o /Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/crtbegin.o crt0.o -L/Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1 -L/Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/../../../../arm-none-eabi/lib /var/folders/4c/y_sll7bj6b9bt15389wr66_80000gn/T//ccZYvQLp.o --start-group -lgcc -lc --end-group /Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/crtend.o /Users/ardnew/cross/lib/gcc/arm-none-eabi/4.8.1/crtn.o 
GNU ld (GNU Binutils) 2.24 
Copyright 2013 Free Software Foundation, Inc. 
This program is free software; you may redistribute it under the terms of 
the GNU General Public License version 3 or (at your option) a later version. 
This program has absolutely no warranty. 

programma di test per assicurare i propri file binari ARM costruzione:

$ cat told_unit1.adb told_unit1.ads 

-- 
-- FILE: told_unit1.adb 
-- 
with Ada.Text_IO; 
use Ada.Text_IO; 

package body told_unit1 is 

    procedure hello is 
    begin 
    put_line("hello, world"); 
    end hello; 

    function double(x : in float) return float is 
    begin 
    return x + x; 
    end double; 

end told_unit1; 


-- 
-- FILE: told_unit1.ads 
-- 
package told_unit1 is 

    procedure hello; 
    pragma Export 
    (
    convention  => C, 
    entity   => hello, 
    external_name => "ada_hello" 
); 

    function double(x : in float) return float; 
    pragma Export 
    (
    convention  => C, 
    entity   => double, 
    external_name => "ada_double" 
); 

end told_unit1; 

Poi compilare il codice Ada e ispezionare con file:

$ arm-none-eabi-gcc -c told_unit1.adb 

$ file told_unit1.o 
told_unit1.o: ELF 32-bit LSB relocatable, ARM, version 1 (SYSV), not stripped 

E poi quando provo a legare il file oggetto della libreria si vomita:

$ arm-none-eabi-gnatbind -aO$ADA_OBJECT_PATH -Ltold told_unit1 
error: "a-textio.ali" not found, "a-textio.adb" must be compiled 

Tornando alla mia GCC costruire log, ho trovato che libada (che credo sia parte di GNAT) non è mai stato costruito. Quando provo ad eseguire make all-target-libada dalla directory GCC costruzione, alla fine mi dice:

Configuring in arm-none-eabi/libada 
configure: loading cache ./config.cache 
checking build system type... x86_64-apple-darwin13.1.0 
checking host system type... arm-none-eabi 
checking target system type... arm-none-eabi 
checking for arm-none-eabi-gcc... /Users/ardnew/cross/src/gcc-4.8.1-obj/./gcc/xgcc -B/Users/ardnew/cross/src/gcc-4.8.1-obj/./gcc/ -B/Users/ardnew/cross/arm-none-eabi/bin/ -B/Users/ardnew/cross/arm-none-eabi/lib/ -isystem /Users/ardnew/cross/arm-none-eabi/include -isystem /Users/ardnew/cross/arm-none-eabi/sys-include 
checking for C compiler default output file name... 
configure: error: in `/Users/ardnew/cross/src/gcc-4.8.1-obj/arm-none-eabi/libada': 
configure: error: C compiler cannot create executables 
See `config.log' for more details. 
make: *** [configure-target-libada] Error 1 

E così vado ispezionare che config.log il suo riferimento alla e trovare la seguente:

configure:2351: $? = 0 
configure:2340: /Users/ardnew/cross/src/gcc-4.8.1-obj/./gcc/xgcc -B/Users/ardnew/cross/src/gcc-4.8.1-obj/./gcc/ -B/Users/ardnew/cross/arm-none-eabi/bin/ -B/Users/ardnew/cross/arm-none-eabi/lib/ -isystem /Users/ardnew/cross/arm-none-eabi/include -isystem /Users/ardnew/cross/arm-none-eabi/sys-include -v >&5 
COLLECT_LTO_WRAPPER=/Users/ardnew/cross/src/gcc-4.8.1-obj/./gcc/lto-wrapper 
Target: arm-none-eabi 
Configured with: /Users/ardnew/cross/src/gcc-4.8.1/configure --target=arm-none-eabi --prefix=/Users/ardnew/cross --with-cpu=cortex-a8 --enable-languages=c,ada --disable-multilib --enable-interwork --disable-threads --disable-shared --disable-nls --disable-lto --disable-libssp --disable-decimal-float --disable-libgomp --disable-libmudflap 
configure:2351: $? = 0 
xgcc: error: unrecognized command line option '-qversion' 
xgcc: fatal error: no input files 
compilation terminated. 
configure:2351: $? = 1 
configure:2371: checking for C compiler default output file name 
configure:2393: /Users/ardnew/cross/src/gcc-4.8.1-obj/./gcc/xgcc -B/Users/ardnew/cross/src/gcc-4.8.1-obj/./gcc/ -B/Users/ardnew/cross/arm-none-eabi/bin/ -B/Users/ardnew/cross/arm-none-eabi/lib/ -isystem /Users/ardnew/cross/arm-none-eabi/include -isystem /Users/ardnew/cross/arm-none-eabi/sys-include -g -O2 conftest.c >&5 
/Users/ardnew/cross/arm-none-eabi/bin/ld: cannot find crt0.o: No such file or directory 
/Users/ardnew/cross/arm-none-eabi/bin/ld: cannot find -lg 
/Users/ardnew/cross/arm-none-eabi/bin/ld: cannot find -lc 
collect2: error: ld returned 1 exit status 
configure:2397: $? = 1 
configure:2434: result: 
configure: failed program was: 
| /* confdefs.h */ 
| #define PACKAGE_NAME "" 
| #define PACKAGE_TARNAME "" 
| #define PACKAGE_VERSION "" 
| #define PACKAGE_STRING "" 
| #define PACKAGE_BUGREPORT "" 
| #define PACKAGE_URL "" 
| /* end confdefs.h. */ 
| 
| int 
| main() 
| { 
| 
| ; 
| return 0; 
| } 
configure:2440: error: in `/Users/ardnew/cross/src/gcc-4.8.1-obj/arm-none-eabi/libada': 
configure:2444: error: C compiler cannot create executables 
See `config.log' for more details. 

Così a questo punto sono sopra la mia testa e non sono sicuro di cosa fare dopo. Forse mi manca una libreria di runtime C per ARM forse?

Qualsiasi aiuto nella configurazione di GNAT/libada per obiettivi ARM sarebbe ottimo.

In alternativa, c'è un modo più semplice per collegarsi alle librerie Ada da un progetto Xcode iOS?

+0

Si dovrebbe verificare se il compilatore incrociato 'arm-none-eabi' sta generando file binari ELF o Macho - quest'ultimo è richiesto per entrambi i MacOSX, ma ho il forte sospetto che la configurazione produrrà ELF, che non è possibile utilizzare. Questo non è un problema enorme, ma potrebbe essere necessario crearsi un GCC cross-compiling e bin-util con il supporto per Mach-o. – marko

+0

@marko il 'arm-none-eabi-gcc' sta producendo bidoni ELF (mi dispiace per il muro di testo, ma controlla il blocco di codice che ho incollato 4 ° dall'alto), e stai dicendo che il target iOS su un vero, l'iPad fisico si aspetta il formato Mach-O e non l'ELF? se cambio il formato, credo che il mio attuale problema esisterà comunque – ardnew

+2

Sì. I file oggetto ELF non sono utili su MacOSX o iOS poiché utilizzano solo file di oggetti Mach-o e librerie condivise. L'ARM ABI è anche sottigliezza diversa. Mi aspetterei che un gcc destinato a ARM su iOS abbia un prefisso "arm-apple-darwin-' o qualcosa di simile. Gli errori potrebbero essere correlati alla mancata corrispondenza del formato di file eseguibile. – marko

risposta

1

Sfortunatamente, la risposta è che non esiste uno strumento di auto-magia per realizzare questo. È possibile utilizzare gli strumenti per convalidare le traduzioni dopo il fatto, ma ciò che si desidera non è ancora disponibile.

Ho avuto a che fare con questa stessa domanda in passato. Una risposta diversa avrebbe cambiato drasticamente anche uno dei budget del mio progetto. Forse un giorno.

Anche se ammetto, penso che in definitiva ci siano abbastanza incompatibilità che la tua fonte avrebbe bisogno di essere drasticamente alterata - riducendo il valore di ciò che stai cercando di ottenere qui. Alla fine, il nuovo investimento è un fiasco ma si tradurrà in una fonte migliore, se ci si può permettere.