我在LLVM后端实现了一个传递,它改变了 ARM 程序集/二进制文件的输出格式(例如,在每个基本块的末尾添加一个跳转以消除掉落)。致电:
llc -march=arm somefile.bc
它生成预期的arm程序集/二进制文件,它可以在arm gnu linux上正常运行(我使用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
编译glibc 使用llvm可能不是一个合适的选择。另一方面,根据:
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中的所有内容)。
实际上我尝试使用arm-none-eabi-gcc编译一个简单的“hello world”c程序,该程序配置了“--with-newlib”选项,程序执行最终会导致qemu-上的分段错误手臂和宝石5。
我不确定newlib是否与glibc兼容。我想知道我是否可以使用llvm从newlib交叉编译机器独立部分(同时更改arm输出格式)并使用arm-none-linux-gnueabi-gcc交叉编译机器相关部件glibc并将这两个部分放在一起以生成我自己的标准c库?
我的作品可能存在错误/误解。是否有任何其他可能的方法可以将我的更改添加到至少部分标准c库中,并使程序在qemu-arm或gem5上运行?