Ada 将libgnat编译为单个LLVM位代码文件

Ada 将libgnat编译为单个LLVM位代码文件,ada,llvm-ir,gnat,Ada,Llvm Ir,Gnat,如何将libgnat编译为单个LLVM位代码文件?最新的dragonegg版本非常旧,所以我提供了一个dockerfile,以使测试更加容易。我的最终目标是在LLVM IR位码解释器中运行Ada 最新官方龙蛋发布的Dockerfile FROM ubuntu:trusty COPY . /usr/src/workdir WORKDIR /usr/src/workdir RUN apt-get update \ && apt-get -y install build-e

如何将libgnat编译为单个LLVM位代码文件?最新的dragonegg版本非常旧,所以我提供了一个dockerfile,以使测试更加容易。我的最终目标是在LLVM IR位码解释器中运行Ada

最新官方龙蛋发布的Dockerfile

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

你好,亚洲开发银行

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位代码文件,以便将其与程序链接。

为什么要使用DragonEgg?那真是死定了!请看