草庐IT

linux - 从 LLVM 位代码创建与位置无关的目标文件

我有一个llvm模块,我用llvm::WriteBitcodeToFile转储为位码文件。我想将此位码文件转换为包含模块中函数的native动态可加载库。我该怎么做?我尝试为此使用llc,但这会产生显然不可重定位的代码,因为在执行了以下步骤之后:llc-enable-pie-cppgen=functions-filetype=asmexecutableModule-oem.s然后,用gnuas汇编成目标文件:as-omylib.oem.s最后,尝试生成一个共享库:gcc-shared-olibmyfile.so-fPICmylib.o因错误而失败:/usr/bin/ld:error:m

c - 黑白 llvm-ld 和 llvm-link 的区别

llvm-ld和llvm-link有什么区别?我想llvm-ld会执行链接时间优化,而llvm-link不会。我说得对吗? 最佳答案 llvm-ld是支持LLVM位码和native代码的系统链接器的直接替代品。它默认生成位码可执行文件(即生成的可执行文件调用位码解释器),但也可用于生成native可执行文件。我不直接使用llvm-ld因为使用llvmc和clang前端会更方便,它们会调用适当的程序根据需要添加LLVM工具链(注意:llvmc被标记为实验性的,似乎已在3.0版本中删除)。llvm-link是一个更底层的工具,它将多个位

linux - 编写由 LLVM 后端编译的代码时,体系结构重要吗?

我的问题实际上比标题更笼统:在编写最终将编译为LLVM中间代码,然后从那里编译为机器语言的代码时,体系结构在什么时候重要?假设我正在编写Rust(它使用LLVM作为后端)。我是否能够自动将我的Rust代码编译到LLVM可以定位的每个架构(假设该机器上有一个可以运行它的操作系统)?或者可能是Rust标准库尚未“与ARM兼容”,所以即使LLVM以它为目标我也无法编译到ARM?如果我不使用任何标准库怎么办,我的整个程序只是一个立即返回的程序?难道即使没有任何库,即使LLVM以Rust(或你拥有的)为目标,Rust(或你拥有的)也无法编译成ARM(或你拥有的)?如果以上所有示例都可以正常编译,

linux - 如何卸载LLVM?

我从源代码安装了LLVM(使用CMake和makeinstall)但我无法卸载它,因为没有可用的makeuninstall。这是LLVM版本3.5.2。我使用ArchLinux。如何自动卸载LLVM? 最佳答案 来自CMakeFAQ/CanIdo"makeuninstall"withCMake:...Unixuserscouldenterthiscommandintheshell:xargsrm(在您cd到LLVM构建目录之后)。 关于linux-如何卸载LLVM?,我们在StackOv

linux - LLVM 上的系统调用/sysenter

如何编写发出特定于体系结构的系统调用指令所需的LLVM位码?更具体地说,clang支持内联汇编,并且明确支持发出系统调用(否则无法编译libc和vdso)。翻译是如何为此工作的,我怎样才能让它重现这种行为?我理解LLVM本身可能无法理解各种体系结构使用的调用接口(interface)和寄存器调度,这些调用接口(interface)和寄存器调度以足够高的方式在LLVM字节码中表达(例如,可能在其他地方填写)。但是,显然有一个可以添加此信息的阶段。我该怎么做,从“带有内联汇编的C源代码”之后的任何阶段开始?一个令人满意的答案将包括一个如何调用五参数int0x80系统调用的示例。我选择了五个

android - 是否可以在 Android 应用程序中捕获/接收 IR 信号?

有没有办法在android中接收IR信号?在搜索过程中,我找到了从Android设备传输数据的方法。发现这个非常有用:https://github.com/rngtng/IrDude那么,是否也可以接收Remote等其他红外发射设备产生的红外信号?如果是,我想在我的应用程序UI中打印这些信号(十六进制值)。任何人都可以对这个问题有所了解,请...:)我正在使用GalaxyS4进行开发。 最佳答案 我的想法是>>摄像头检测IRLED闪烁。通过安卓相机捕捉信号。如果您知道红外发射器的编码信号,您可以对其进行解码。你提出的非常有趣的问题。

c++ - 使用 LLVM 的可执行文件的动态符号解析

我目前正在使用LLVM'sObjectFile(记录为here)来表示可执行文件。我已成功读取ObjectFile的可执行文件,并想确定我的可执行文件中的哪些调用目标地址对应于通过调用begin_dynamic_symbols()函数。遍历symbol_iterator中的每个符号会得到每个符号的名称及其地址,但由于符号是动态的,因此每个符号的地址为-1;这表明ObjectFile没有将符号名称直接与其对应的调用目标地址相关联。有什么方法可以确定ObjectFile中哪些调用目标地址映射到哪些动态符号?如果可以避免这样做,我宁愿不手动计算通过PLT和GOT的所有跳转。

c++ - 从 C++ 中的嵌入式 LLVM 生成二进制代码(共享库)

我正在开发一个用C++编写的高性能系统。该过程需要能够在运行时理解一些复杂的逻辑(规则),这些逻辑(规则)是用为此应用程序开发的简单语言编写的。我们有两种选择:解释逻辑-运行嵌入式解释器并生成动态函数调用,当接收到数据时,根据解释的逻辑对数据进行处理将逻辑编译成plugin.so动态共享文件,使用dlopen、dlsym加载插件并在运行时调用逻辑函数选项2看起来非常有吸引力,因为它将优化机器代码,在此过程中运行速度比嵌入式解释器快得多。我正在探索的选项是:编写一个编译方法stringcompile(stringlogic,list&errors,list&warnings)这里的输入逻

c++ - 与 LLVM 的动态链接

我想在一个模块中执行函数,这个模块将在其他模块中解决依赖关系。模块可能会改变(动态编译环境),所以我不希望在单个单体模块中链接所有依赖项,也就是说,如果可以避免的话我希望使用Linker::linkModules但这总是对源模块具有破坏性。这对于一个依赖于一个模块的模块来说是可以的,因为如果那个模块发生了变化,这没什么大不了的,但是重建和重新链接N-1个模块不是因为一个模块发生了变化而没有变化的过度吗?我想知道是否有可以用于JIT执行的非破坏性版本的linkModules。 最佳答案 试试这个:Linker::LinkModules

c++ - llvm::make_unique 的目的是什么?

在llvm的编译器实现教程(例如here)中使用了llvm::make_unique。他们不使用std::make_unique的原因是什么?我找不到任何明确的文档。 最佳答案 TL;DR;LLVM是使用符合C++11的代码编写的,而std::make_unique是一个C++14特性。所以如果他们想要make_unique他们需要实现它。详情如果我们转到LLVMCodingStandardsC++StandardVersionssection说:LLVM,Clang,andLLDarecurrentlywrittenusingC+