社区首页 >问答首页 >编译后可执行段故障的LLVM IR

编译后可执行段故障的LLVM IR
EN

Stack Overflow用户
提问于 2020-10-22 13:37:34
回答 1查看 92关注 0票数 0

我目前正在为一种玩具语言编写一个编译器;这对我来说是一个新的领域。我使用 LLVM C++ API来生成LLVM IR,并从那里生成一个对象。

问题在于(我认为)链接对象并能够执行它。

我有main.ll,由我能想出的绝对最小的IR组成:

代码语言:javascript
代码运行次数:0
复制
define void @main() {
  ret void
}

这在lli main.ll中运行得很好,也就是说,它什么也不做。

我用:llc --filetype=obj -o main.{o,ll}将其编译成对象格式。

并链接到没有使用:ld.lld -o main{,.o}的现有库

然而,产生的二进制立即分段错误。我采纳了一些教程的建议,这些教程引导我尝试通过GCC链接,我被告知,“在制作饼对象时不能使用Relocations”,维基百科告诉我,它指的是所产生的二进制文件中的位置独立性。

因此,我重新编译为object with:llc --filetype=obj --relocation-model=pic main.{o,ll},并与GCC一起重新编译,运行输出并没有像预期的那样工作。

但是,再次运行ld.lld命令并尝试运行该二进制文件,再次,立即执行分段错误。

所以,我的第一个问题是:对于这个简单的例子,在链接对象(假设我链接正确)和二进制之间,我遗漏了什么步骤?。

是否有我缺少的ld标志,一些必需的库,即使我没有特别使用其中的任何一个?

当我试图链接到libc来使用IR中的printf时,即使GCC方法也有更多的问题,但是我认为在攻击它之前,我需要更好地理解这个简单的例子。

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-24 13:55:31

对于任何发现这一点并试图将.ll文件变成可执行文件的人,我已经发现C运行时库是缺少的。在默认情况下,gccclang都包括了这些选项,但是-v选项并没有给我带来太多遗憾.

使用PIC_的LLVM下的PIC_并将结果对象动态地链接到C运行时库中,我设法使.ll文件定期运行。

一个示例命令(显然是OS特定的)将是:

代码语言:javascript
代码运行次数:0
复制
ld --verbose -L/usr/lib -lc \
  -dynamic-linker \
  /lib64/ld-linux-x86-64.so.2 \
  /usr/lib/Scrt1.o \
  /usr/lib/crti.o \
  /usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/crtbeginS.o \
  /usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/crtendS.o  \
  <object file> \
  -o <binary> \
  /usr/lib/crtn.o

除了猜测之外,我还不能百分之百地确定这件事的“原因”,但这是可行的,而且您的标准ld -L... -lc <object file>没有。

如果有人能作出澄清,我很乐意接受他们的答覆。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64490897

复制
相关文章
LLVM(2)IR入门
例如上面的%6 = call noundef i32 @_Z9factoriali(i32 noundef 2)函数调用语法,如何找到call的全部使用方法?
mingjie
2023/10/13
3130
LLVM(2)IR入门
使用 Inkwell 生成 LLVM IR
本文中的例子拷贝自:https://pku-minic.github.io/online-doc
谛听
2023/06/13
1K0
clang -O3 for循环的LLVM IR
这里删去了用处不大的内容,只保留了关键的LLVM IR。通过分析可以看到,如果循环小于8 LLVM IR会使用vector,vector使用SIMD指令高效进行计算,如果大于8则是普通的for形式。
racaljk
2018/08/31
1.3K0
通过 LLVM IR 看语言特性(1)
本系列文章会展示一些系列源码到 LLVM IR 语言的转换。目标是让我们更好的理解编译器是怎么运作的。
酷酷的哀殿
2020/10/26
1.5K0
通过 LLVM IR 看语言特性(1)
LLVM编译过程
编译器的作用便是把我们的高级编程语言(Objective-C)通过一系列的操作转化成可被计算机执行的机器语言(MachineCode)。
Helloted
2022/06/08
2K0
LLVM编译过程
iOS编译简析
早期 iOS 选用的是当时一家独大的 GCC 编译器作为 OC 语言的前端,但是随着时间的推移,Apple 为 OC 增加了很多特性,想要 GCC 给与实现,但是 GCC 却并没有支持,并且 GCC 本身代码耦合度较高,模块独立性比较差,并且《GCC运行环境豁免条款》限制了LLVM-GCC。这种背景下,Apple 就想找到一个高效、模块化的且开源的替换品,LLVM 进入了苹果的视线。
CoderStar
2022/08/24
1.4K0
iOS编译简析
llvm编译器编译小结
传统编译器工作原理是三段式的可以分为: 前端(Frontend) 优化器(Optimizer) 后端(Backend)
tea9
2022/07/16
8510
llvm初探——源码编译
源码编译llvm时遇到编译中断问题,查了一下时内存不足,swap分区也不够用的问题,解决方法是手动创建swap分区文件,扩展swap分区。
hunterzju
2021/12/09
9870
LLVM(一)——编译流程
我们程序员编写的源代码是人类语言,我们可以很轻松得理解;但是对于计算机硬件(CPU)而言,这些源代码就好比是天书,它根本无法理解,更无法直接执行。计算机只能够识别某些特定的二进制指令,所以在程序真正运行之前,必须要把源代码转换成计算机可以识别的二进制指令。
拉维
2021/04/16
2.4K0
MLIR-Toy-实践-4-转换到LLVM IR运行
之前的文章基于MLIR中的Toy教程添加了操作OrOp,并从Toy Dialect降级到了Standard Op。本文主要记录了最终降级到LLVM Dialect并调用LLVM JIT执行的过程。
hunterzju
2022/04/28
1K0
MLIR-Toy-实践-4-转换到LLVM IR运行
iOS底层原理之LLVM & Clang
今天开始,我们对编译器架构系统LLVM进行一个简单的了解和分析,了解完LLVM的编译流程之后,简单实现一个Clang插件玩玩。下面就开始今天的内容。
CC老师
2022/01/14
1.5K0
iOS底层原理之LLVM & Clang
【从零开始学深度学习编译器】十五,MLIR Toy Tutorials学习笔记之Lowering到LLVM IR
在上一节中,我们将Toy Dialect的部分Operation Lowering到Affine Dialect,MemRef Dialect和Standard Dialect,而toy.print操作保持不变,所以又被叫作部分Lowering。通过这个Lowering可以将Toy Dialect的Operation更底层的实现逻辑表达出来,以寻求更多的优化机会,得到更好的MLIR表达式。这一节,我们将在上一节得到的混合型MLIR表达式完全Lowering到LLVM Dialect上,然后生成LLVM IR,并且我们可以使用MLIR的JIT编译引擎来运行最终的MLIR表达式并输出计算结果。
BBuf
2021/11/19
1.2K0
LLVM-插桩
1.4 在llvm同级目录下新建llvm_build和llvm_release两个文件夹,llvm是编译起始文件夹,llvm_release则是编译结果文件夹
Helloted
2022/06/08
2.1K0
LLVM-插桩
教程 | 编译器入门:没有siri的那些年,我们如何实现人机对话?
选自nicoleorchard 作者:Nicole Orchard 机器之心编译 参与:朱乾树、路雪 编译器可将源代码转换成计算机理解的可执行的机器代码,或将源代码转换成另一种编程语言。本文从 LLV
机器之心
2018/05/09
1.2K0
编译器|LLVM Compiler System
LLVM makes it easier to not only create new languages, but to enhance the development of existing ones. It provides tools for automating many of the most thankless parts of the task of language creation: creating a compiler, porting the outputted code to multiple platforms and architectures, generating architecture-specific optimizations such as vectorization, and writing code to handle common language metaphors like exceptions. Its liberal licensing means it can be freely reused as a software component or deployed as a service.
heidsoft
2022/04/18
8700
编译器|LLVM Compiler System
iOS 代码染色原理及技术实践
随着业务的迅速发展,业务代码逻辑的复杂度增加。QA 测试的质量对于产品上线后的稳定性更加重要。一般 QA 测试的工作流程分为两大项:自动化测试和人工测试。这两种测试后都需要得到代码覆盖率。自动化测试的覆盖率,在双端都有比较成熟的方案。
ios-lan
2020/09/18
1.7K0
iOS 编译过程
iOS 编译采用 Clang 作为编译器前端,LLVM 作为编译器后端,编译器前端负责语法分析,语义分析,生成生成中间码 (LLVM IR),在这个过程中,会进行类型检查,如果发现错误或者警告会标注出来在哪一行;编译器后端会进行机器无关的代码优化,生成机器语言,并且进行机器相关的代码优化。
s_在路上
2018/09/30
1.5K0
必撸系列!Go另外几个黑魔法技巧汇总
导语 |  最近一段时间,笔者重新梳理了一下go知识点,并深入地看看了它的源码,在实践中又有了新的沉淀,于是写下这篇文章和大家分享一下。 在上一篇文章《来了!Go的2个黑魔法技巧》中,笔者分享了go中两个有意思的技巧。 而最近一段时间,笔者重新梳理了一下go知识点,并深入地看看了它的源码,在实践中又有了新的沉淀,于是写下这篇文章和大家分享一下。 一、魔法:最小化运行时(minimal runtime) 我们知道,go有一层很重的运行时(runtime),包括内存管理、goroutine 调度等重要组件;这些
腾讯云开发者
2022/05/25
5430
必撸系列!Go另外几个黑魔法技巧汇总
ARM Linux ELF加壳方案
随着移动应用和IoT设备的普及,大量的硬件抛弃了传统的x86架构,选择使用能耗低、性价比高的ARM芯片,ARM指令级渐渐成为主流,但随之而来的,是愈发严峻的安全问题。
全栈程序员站长
2022/11/07
5.6K0
ARM Linux ELF加壳方案
深入剖析 iOS 编译 Clang / LLVM
2000年,伊利诺伊大学厄巴纳-香槟分校(University of Illinois at Urbana-Champaign 简称UIUC)这所享有世界声望的一流公立研究型大学的 Chris Lattner(他的 twitter @clattner_llvm ) 开发了一个叫作 Low Level Virtual Machine 的编译器开发工具套件,后来涉及范围越来越大,可以用于常规编译器,JIT编译器,汇编器,调试器,静态分析工具等一系列跟编程语言相关的工作,于是就把简称 LLVM 这个简称作为了正式的名字。Chris Lattner 后来又开发了 Clang,使得 LLVM 直接挑战 GCC 的地位。2012年,LLVM 获得美国计算机学会 ACM 的软件系统大奖,和 UNIX,WWW,TCP/IP,Tex,JAVA 等齐名。
用户7451029
2020/06/16
8K0
深入剖析 iOS 编译 Clang / LLVM

相似问题

LLVM无法从IR编译

20

编译LLVM IR时使用LLVM标头

140

llvm MemDepPrinter段故障

10

编译Haskell程序到LLVM IR

10

CUDA:使用NVPTX编译LLVM IR

19
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文