Скомпилируйте libgnat в один файл битового кода LLVM

Как я могу скомпилировать libgnat в один файл битового кода LLVM? Последняя версия Dragonegg очень старая, поэтому я предоставляю файл докеры, чтобы упростить тестирование. Моя конечная цель — запустить Ada в интерпретаторах битового кода LLVM IR.

Dockerfile для последней официальной версии Dragonegg

FROM ubuntu:trusty

COPY . /usr/src/workdir
WORKDIR /usr/src/workdir

RUN apt-get update \
    && apt-get -y install build-essential gnat-4.6 libgmp-dev libmpfr-dev libmpc-dev libz-dev gcc-4.6-plugin-dev
    # libz-dev for ld when compiling dragonegg 3.3
    # gcc-4.6-plugin-dev needed when compiling dragonegg 3.3

RUN tar -xzf gcc-4.6.4.tar.gz \
    && cd gcc-4.6.4 \
    && mkdir build \
    && cd build \
    && CC=gcc-4.6 ../configure --disable-multilib --enable-languages=ada,c,c++ --prefix=/opt/gcc-4.6.4 \
    && make -j4 \
    && make install

RUN tar -xzf clang+llvm-3.3-amd64-Ubuntu-12.04.2.tar.gz \
    && mv clang+llvm-3.3-amd64-Ubuntu-12.04.2 /opt/llvm-3.3

ENV PATH="/opt/llvm-3.3/bin:/opt/gcc-4.6.4/bin:${PATH}"

RUN tar -xzf dragonegg-3.3.src.tar.gz \
    && mv dragonegg-3.3.src dragonegg-3.3 \
    && cd dragonegg-3.3 \
    && GCC=/opt/gcc-4.6.4/bin/gcc make \
    && cp dragonegg.so /opt/dragonegg.so

загрузить gcc-4.6.4.tar .gz

скачать clang+llvm-3.3-amd64 -Ubuntu-12.04.2.tar.gz

скачать dragonegg-3.3.src.tar.gz

привет.adb

with Ada.Text_IO;

procedure Hello is
begin
   Ada.Text_IO.Put_Line("Hello world from Ada (dragonegg)!");
end Hello;

Запустите gcc hello.adb -S -O1 -o hello.ll -fplugin=/opt/dragonegg.so -fplugin-arg-dragonegg-emit-ir, чтобы скомпилировать файл hello.adb. Когда я пытаюсь собрать двоичный файл с llc -filetype=obj hello.ll и gcc hello.o, я получаю следующую ошибку:

/usr/lib/x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
hello.o: In function `_ada_hello':
hello.ll:(.text+0xb): undefined reference to `ada__text_io__put_line__2'
collect2: ld returned 1 exit status

Сообщение об ошибке указывает на отсутствие библиотеки времени выполнения Ada. В настоящее время я понятия не имею, как я могу скомпилировать libgnat в один файл битового кода LLVM, чтобы я мог связать его с программой.


person user1091344    schedule 09.02.2019    source источник


Ответы (1)


Почему вы используете DragonEgg? Это хорошо и действительно мертво! Вместо этого см. https://github.com/AdaCore/gnat-llvm.

person Luke A. Guest    schedule 03.10.2019