Как я могу скомпилировать libgnat в один файл битового кода LLVM?Последняя версия dragonegg очень старая, поэтому я предоставляю dockerfile, чтобы упростить тестирование.Моя конечная цель - запустить 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
hello.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, чтобы связать его с программой.