2

目的:

我在 LLVM 后端实现了一个传递,它改变了ARM程序集/二进制的输出格式(例如,在每个基本块的末尾添加一个跳转以消除失败)。通过调用:

llc -march=arm somefile.bc

它生成在 arm gnu linux 上正常运行的预期 arm 程序集/二进制文件(我使用 qemu-arm 和 gem5 来模拟它)。现在我想在标准 c 库上做同样的事情,但这里有问题。

问题:

根据:

http://article.gmane.org/gmane.comp.compilers.llvm.devel/77025 
https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_14/docs/OpenProjects.html#glibc   

使用 llvm 编译 glibc 可能不是一个合适的选择。另一方面,根据:

http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-January/047088.html

llvm 可以编译 newlib,因此人们认为 newlib 作为替代方案。但是,根据:

http://www.embecosm.com/appnotes/ean9/ean9-howto-newlib-1.0.html#id2711887

newlib 打算支持裸机(无操作系统)软件的二进制文件。它只实现与硬件无关的部分(例如 libc 和 libm),并为每个与硬件相关的系统调用(例如 libgloss 中的所有内容)保留一个存根。

事实上,我尝试使用配置了“--with-newlib”选项的 arm-none-eabi-gcc 编译一个简单的“hello world”c 程序,程序执行最终在 qemu-arm 和 gem5 上出现分段错误.

问题:

我不确定 newlib 是否与 glibc 兼容。我想知道我是否可以使用 llvm 从 newlib 交叉编译与机器无关的部分(同时更改 arm 输出格式)并使用 arm-none-linux-gnueabi-gcc 从交叉编译机器相关部分glibc 并将这两个部分放在一起生成我自己的标准 c 库?

我的工作中可能存在错误/误解。是否有任何其他可能的方法可以将我的更改添加到至少部分标准 c 库中,并使程序在 qemu-arm 或 gem5 上运行?

4

1 回答 1

2

你为什么不尝试使用musl 库?我将它用作基于ELLCC clang 的交叉编译环境的标准库。

于 2015-03-11T18:20:19.720 回答