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

问题描述 投票:1回答:1

如何将libgnat编译为单个LLVM位代码文件?最新的Dragonegg版本非常旧,因此我提供了一个dockerfile来简化测试。我的最终目标是在LLVM IR位码解释器中运行Ada。

最新的官方Dragonegg发行版的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

download gcc-4.6.4.tar.gz

download clang+llvm-3.3-amd64-Ubuntu-12.04.2.tar.gz

download 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.llgcc 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位代码文件,因此可以将其与程序链接。

ada llvm-ir gnat
1个回答
0
投票

您为什么使用DragonEgg?那真是太死了!请参见https://github.com/AdaCore/gnat-llvm

© www.soinside.com 2019 - 2024. All rights reserved.