2014-04-30 8 views
7

tl; dr
Wie kann ich Ada-Quellcode in eine statische Bibliotheksdatei geeignet für Anwendungen auf iPad Ziele mit iOS kompilieren gegen verlinken? (GCC ist keine Voraussetzung. Lösungen mit LLVM oder andere sind auch willkommen!)
Ada Cross-Compiler für iOS zielt


Ich habe eine große Bibliothek von tragbarem Ada-Code, Ich mag würde in einem iPad/iOS-Projekt verwenden. Mein Host-Betriebssystem ist Mac OS X 10.9 (mit installiertem GCC 4.8.1 unter /opt/local mit MacPorts). Um dies zu tun, versuche ich einen GCC ARM Cross-Compiler mit Ada-Unterstützung zu bauen.

Ich bin in der Lage, eine Arbeits GCC und GNAT zu bauen, die ARM-Executables erzeugt, aber ich kann nicht die Ada-Standardbibliothek zu bauen oder zu installieren scheinen, die für den Aufbau meiner Ada Code

die Quellpakete erforderlich ist I mit ‚m:

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

Die GCC Build-Konfiguration:

$ 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. 

Testprogramm, um seine Gebäude ARM-Binärdateien zu gewährleisten:

$ 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; 

Kompilieren Sie dann den Ada-Code und Inspektion mit 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 

Und dann, wenn ich versuche, die Bibliothek Objektdatei zu binden, es kotzt:

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

zurück zu meinem GCC gehen Build Logs, ich fand, dass Libada (die ich glaube, dass Teil von GNAT ist) wurde nie gebaut. Wenn ich versuche, make all-target-libada vom GCC Build-Verzeichnis zu führen, sagt er schließlich mir:

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 

Und so gehe ich prüfen, dass config.log seiner Bezugnahme und finden Sie die folgenden:

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. 

So bei Dieser Punkt bin ich über meinen Kopf und nicht wirklich sicher, was ich als nächstes tun soll. Es sieht so aus, als ob ich eine C-Laufzeitbibliothek für ARM vermisse?

Jede Hilfe bei der Konfiguration von GNAT/libada für ARM-Ziele wäre großartig.

Alternativ - gibt es einen einfacheren Weg, um Ada-Bibliotheken von einem Xcode-iOS-Projekt zu verknüpfen?

+0

sollten Sie prüfen, ob Sie 'arm-none-eabi' Cross-Compiler ELF oder Macho-Binärdateien erzeugt - letzteres sowohl für Mac OS X erforderlich ist, aber ich vermute stark, dass die Konfiguration ELF produzieren, die Sie nicht verwenden können. Das ist kein großes Problem, aber Sie müssen sich möglicherweise einen Cross-Compiling-GCC und bin-utils mit Mach-o-Unterstützung erstellen. – marko

+0

@marko die 'arm-none-eabi-gcc' produziert ELF-Bins (Entschuldigung für die Wand des Textes, aber überprüfen Sie den Code-Block ich eingefügt 4. von oben), und Sie sagen, das Ziel iOS auf einem echten, physisches iPad erwartet Mach-O-Format und nicht ELF? Wenn ich das Format ändere, glaube ich, dass mein aktuelles Problem noch existiert, obwohl – ardnew

+2

Ja. ELF-Objektdateien sind für MacOSX oder iOS nicht von Nutzen, da sie nur Mach-o-Objektdateien und gemeinsam genutzte Bibliotheken verwenden. Der ARM ABI ist auch subtil anders. Ich würde erwarten, dass ein gcc, das für ARM auf iOS ins Visier genommen wird, einen Arm-Arm-Apfel-Darwin-Präfix oder etwas Ähnliches hat. Ihre Fehlermeldungen hängen möglicherweise mit dem nicht kompatiblen Dateiformat zusammen. – marko

Antwort

1

Leider ist die Antwort, dass es kein Auto-magisches Werkzeug gibt, um dies zu erreichen. Sie können Werkzeuge verwenden, um die Übersetzungen nach der Tat zu validieren, aber was Sie wollen, ist noch nicht verfügbar.

Ich hatte in der Vergangenheit mit dieser Frage zu tun. Eine andere Antwort hätte auch eines der Budgets meines Projekts dramatisch verändert. Vielleicht eines Tages.

Obwohl ich gebe zu, ich denke, es gibt letztlich genug Inkompatibilitäten, dass Ihre Quelle drastisch geändert werden müsste - den Wert dessen reduzieren, was Sie hier erreichen wollen. Am Ende ist die neue Investition ein Misserfolg, aber wird eine bessere Quelle ergeben, wenn Sie es sich leisten können.