llvm - 使用 LLVM 自定义标准 C 库(以支持 llvm 后端优化)

标签 llvm cross-compiling gnu glibc newlib

目的:

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

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),并为每个硬件相关的系统调用留下一个 stub (例如 libgloss 中的所有内容)。

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

问题:

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

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

最佳答案

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

关于llvm - 使用 LLVM 自定义标准 C 库(以支持 llvm 后端优化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28990786/

相关文章:

Clang/LLVM OpenMP 程序不生成线程

C++ 运算符重载奇怪的类型转换

compilation - 如何在Windows上的SCons中导出具有备用扩展名的程序

windows - 使用MinGW从GNU源码包在windows中创建exe文件

c++ - 如何检测 LLVM pass 中的线程入口/生成点?

c++ - AllocaInst 的使用示例 : LLVM

c++ - arm cortex a9 交叉编译奇怪的浮点行为

c++ - 嵌入式 Linux 中链接 'libstdc++' 库已损坏

c - Libm 没有三角函数

linux - 并行运行 sed