LLVM防忘录

目录

  • Windows中源码编译LLVM
  • Windows下编译LLVM Pass DLL

Windows中源码编译LLVM

直接从llvm-project下载源码, 然后解压后用VS2022打开该目录, 然后利用VS的开发终端执行:

cmake -S llvm -B build -G "Visual Studio 17 2022" -DLLVM_ENABLE_PROJECTS=clang -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_ENABLE_PLUGINS=On -DCMAKE_CXX_FLAGS=/utf-8

然后关闭VS进入build目录, 打开.sln文件直接利用VS进行编译, 期间可能会遇到一些报错, 大概率都是utf-8等编码的问题, 小小的修理一下就可以…
参考:

  1. http://www.qfrost.com/posts/llvm/llvm%E7%BC%96%E8%AF%91%E4%B8%8Efirst_pass
  2. https://bbs.kanxue.com/thread-279734.htm
  3. https://blog.csdn.net/hfcaoguilin/article/details/128095147

Windows下编译LLVM Pass DLL

HelloWorld.cpp:

#include <iostream>
#include "llvm/IR/Module.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/PassManager.h"
#include "llvm/Passes/PassBuilder.h"
#include "llvm/Passes/PassPlugin.h"
#include "llvm/Support/raw_ostream.h"#pragma comment(lib,"ntdll.lib")using namespace llvm;
namespace llvm{struct NewPassHelloWorld : public PassInfoMixin<NewPassHelloWorld> {PreservedAnalyses run(Module &F, ModuleAnalysisManager &AM) {std::cout << "NewPassHelloWorld Loaded" << std::endl;errs() << "Pass:" << F.getName() << "\n";return PreservedAnalyses::all();}bool isRequird(){ return true; }};}
// This part is the new way of registering your pass
extern "C" ::llvm::PassPluginLibraryInfoLLVM_ATTRIBUTE_WEAK llvmGetPassPluginInfo() {return { LLVM_PLUGIN_API_VERSION, "HelloWorld", LLVM_VERSION_STRING,[](llvm::PassBuilder& PB) {PB.registerPipelineStartEPCallback([&](llvm::ModulePassManager& MPM,OptimizationLevel Level) {MPM.addPass(NewPassHelloWorld());});} };
}

export.def:

LIBRARY QVMProtect
EXPORTS
llvmGetPassPluginInfo

CMakeLists.txt

cmake_minimum_required(VERSION 3.4)project(QVMProtect)
set(CMAKE_CXX_STANDARD 17)
# 设置编译模式
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")  # /MD for release
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")    # /MDd for debug# 设置源码文件
aux_source_directory(./ src)
set(srcs ${src})# 生成动态链接库,并指定.def模块文件
add_library(QVMProtect SHARED ${srcs} export.def)# 设置LLVM的路径 (绝对路径或环境变量)
set(LLVM_BUILD_DIR "D:\\Demo\\llvm-project\\build")
set(LLVM_SOURCE_DIR "D:\\Demo\\llvm-project\\llvm")
include_directories("${LLVM_BUILD_DIR}\\include")
include_directories("${LLVM_SOURCE_DIR}\\include")# 添加LLVM的库路径
set(mylibdir "${LLVM_BUILD_DIR}\\Release\\lib")# 链接LLVM所需库 (根据你的项目需要,可能需要添加其他库)
set(LLVM_LIBSLLVMCoreLLVMSupportLLVMBinaryFormatLLVMRemarksLLVMBitstreamReaderLLVMTargetLLVMDemangleLLVMTargetParser
)# 查找并链接库
foreach(libname ${LLVM_LIBS})SET(FOUND_LIB "FOUND_LIB-NOTFOUND")find_library(FOUND_LIB NAMES ${libname} HINTS ${mylibdir} NO_DEFAULT_PATH)IF (FOUND_LIB)message("found lib: ${FOUND_LIB}")LIST(APPEND mylibs ${FOUND_LIB})ELSE()MESSAGE("not lib found: ${libname}")ENDIF ()
endforeach(libname)# 添加Windows特定库
list(APPEND mylibs ntdll.lib)# 链接库
target_link_libraries(QVMProtect PUBLIC ${mylibs})

然后在VS开发CMD中执行:

mkdir build
cd build
cmake ..

然后同样会生产VS项目, 打开.sln文件进行编译即可;
编译的时候可能会遇到找不到符号的错误, 例如:

严重性	代码	说明	项目	文件	行	禁止显示状态	详细信息
错误	LNK2019	无法解析的外部符号 "public: __cdecl llvm::Triple::Triple(class llvm::Twine const &)" (??0Triple@llvm@@QEAA@AEBVTwine@1@@Z),函数 "public: bool __cdecl llvm::GlobalObject::canIncreaseAlignment(void)const " (?canIncreaseAlignment@GlobalObject@llvm@@QEBA_NXZ) 中引用了该符号	QVMProtect	D:\Demo\TestPass\build\LLVMCore.lib(Globals.obj)	1	

需要在你编译好的llvm的lib目录中找找哪个lib包含相关的符号了;
编译好的Pass是一个DLL, 可以用clang直接加载:

D:\Demo\llvm-project\build\Release\bin\clang++.exe -Xclang -fpass-plugin="D:\Demo\TestPass\build\Release\QVMProtect.dll" exp.cpp -o exp.exe

pass

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/66032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解释一下:运放的输入失调电流

输入失调电流 首先看基础部分:这就是同相比例放大器 按照理论计算,输入VIN=0时,输出VOUT应为0,对吧 仿真与理论差距较大,有200多毫伏的偏差,这就是输入偏置电流IBIAS引起的,接着看它的定义 同向和反向输入电流的平均值,也就是Ib1、Ib2求平均,即(Ib1+Ib2)/2 按照下面…

【双指针】算法题(二)

【双指针】算法题&#xff08;二&#xff09; 前言&#xff1a; 这里是几道算法题&#xff0c;双指针说明在上一章。 一、有效三角形的个数 题目链接&#xff1a; 有效三角形的个数 题目叙述&#xff1a; 解法一&#xff1a;暴力循环&#xff0c;叠加三层for循环&#xff0c…

Socket编程入门

一个服务端 对应 一个客户端&#xff0c;双方可以通信。 1、服务端代码 public class EchoServerDemo { public static void main(String[] args) { // 端口号从 1024-65535 try { ServerSocket ss new ServerSocket(9007); System.out.println("Server start...&qu…

SQL 分析函数与聚合函数的组合应用

目标&#xff1a;掌握 SQL 中分析函数&#xff08;窗口函数&#xff09;与聚合函数的组合使用&#xff0c;通过实际案例实现复杂业务需求&#xff0c;如同比、环比和趋势分析。 1. 分析函数与聚合函数的区别 聚合函数&#xff08;Aggregate Functions&#xff09;&#xff1a;…

docker 安装influxdb

docker pull influxdb mkdir -p /root/influxdb/data docker run -d --name influxdb -p 8086:8086 -v /root/influxdb/data:/var/lib/influxdb influxdb:latest#浏览器登录&#xff1a;http://192.168.31.135:8086&#xff0c;首次登录设置用户名密码&#xff1a;admin/admin1…

深入剖析MySQL数据库架构:核心组件、存储引擎与优化策略(四)

慢查询日志&#xff0c;顾名思义&#xff0c;就是查询慢的日志&#xff0c;是指mysql记录所有执行超过long_query_time&#xff08;默认的时间10秒&#xff09;参数设定的时间阈值的SQL语句的日志。该日志能为SQL语句的优化带来很好的帮助。默认情况下&#xff0c;慢查询日志是…

【工具类】RedisUtil 操作相关

目标 一行代码调用 安装 redis <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>hutool 工具类 <dependency><groupId>cn.hutool</grou…

Ansys Discovery 中的网格划分方法:探索模式

本篇博客文章将介绍 Ansys Discovery 中可用于在探索模式下进行分析的网格划分方法。我们将在下一篇博客中介绍 Refine 模式下的网格划分技术。 了解 Discovery Explore 模式下的网格划分 网格划分是将几何模型划分为小单元以模拟系统在不同条件下的行为的过程。这是通过创建…

MT8788安卓核心板_MTK8788核心板参数_联发科模块定制开发

MT8788安卓核心板是一款尺寸为52.5mm x 38.5mm x 2.95mm的高集成度电路板&#xff0c;专为各种智能设备应用而设计。该板卡整合了处理器、图形处理单元(GPU)、LPDDR3内存、eMMC存储及电源管理模块&#xff0c;具备出色的性能与低功耗特性。 这款核心板搭载了联发科的MT8788处理…

Linux实验报告14-Linux内存管理实验

目录 一&#xff1a;实验目的 二&#xff1a;实验内容 1、编辑模块的源代码mm_viraddr.c 2、编译模块 3、编写测试程序mm_test.c 4、编译测试程序mm_test.c 5、在后台运行mm_test 6、验证mm_viraddr模块 一&#xff1a;实验目的 (1)掌握内核空间、用户空间&#xff…

SAP物料主数据界面增加客制化字段、客制化页签的方式

文章目录 前言一、不增加页签&#xff0c;只增加客制化字段二、增加物料主数据页签 前言 【SAP系统MM模块研究】 #SAP #MM #物料 #客制化 #物料主数据 项目上难免会遇到客户要在物料主数据的界面上&#xff0c;增加新字段的需求。 实现方式有&#xff1a; &#xff08;1&…

设计心得——流程图和数据流图绘制

一、流程图和数据流图 在软件开发中&#xff0c;画流程图和数据流图可以说是几乎每个人都会遇到。 1、数据流&#xff08;程&#xff09;图 Data Flow Diagram&#xff0c;DFG。它可以称为数据流图或数据流程图。其主要用来描述系统中数据流程的一种图形工具&#xff0c;可以将…

U盘数据恢复实战指南与预防策略

一、U盘数据恢复初探 U盘数据恢复&#xff0c;简而言之&#xff0c;是指当U盘中的数据因各种原因丢失、损坏或无法访问时&#xff0c;通过特定技术和工具&#xff0c;将丢失的数据重新找回的过程。U盘作为现代生活中不可或缺的便携式存储设备&#xff0c;其数据安全性和稳定性…

250103-逻辑操作符

1. 逻辑与操作符 && 2. 逻辑非操作符 &#xff01; 实例 if(!(p1.agep2.age&&p1.name.equals(p2.name))) 对象p1p2的年龄与对象p1p2的姓名不为真&#xff0c;即至少有一个为假。

持续大额亏损,销量增幅有限,北汽蓝谷依旧黯然神伤

撰稿 | 行星 来源 | 贝多财经 “起了个大早&#xff0c;赶了个晚集”&#xff0c;用在如今的北汽蓝谷身上再合适不过。 2025年的第一个工作日&#xff0c;北汽蓝谷新能源科技股份有限公司&#xff08;SH:600733&#xff0c;简称“北汽蓝谷”&#xff09;对外披露了子公司北京…

【微软,模型规模】模型参数规模泄露:理解大型语言模型的参数量级

模型参数规模泄露&#xff1a;理解大型语言模型的参数量级 关键词&#xff1a; #大型语言模型 Large Language Model #参数规模 Parameter Scale #GPT-4o #GPT-4o-mini #Claude 3.5 Sonnet 具体实例与推演 近日&#xff0c;微软在一篇医学相关论文中意外泄露了OpenAI及Claud…

Elasticsearch JavaRestClient版

文章目录 初始化RestHighLeveClient&#xff08;必要条件&#xff09;索引库操作1.创建索引库&#xff08;4步&#xff09;2.删除索引库&#xff08;3步&#xff09;3.判断索引库是否存在&#xff08;3步&#xff09;4.总结&#xff1a;四步走 文档操作1.创建文档&#xff08;4…

我用AI学Android Jetpack Compose之入门篇(1)

这篇我们先来跑通第一个Android Jetpack Compose工程&#xff0c;现在新版本的Android Studio&#xff0c;新建工程选择Empty Activity默认就会开启Jetpack Compose的支持&#xff0c;再次声明&#xff0c;答案来自 通义千问Ai 文章目录 1.用Android Jetpack Compose需要安装什…

Java-创建一个结合CompletableFuture和自定义功能的工具类

1.重试机制:当异步任务失败时自动重试。 2.超时重试:在指定时间内未完成的任务进行重试。 3.批量处理:将多个任务批量执行并收集结果。 4.日志记录:为每个异步任务添加日志记录,便于调试和监控。 5.自定义线程池:允许用户传入自定义的线程池配置。 import java.util…

HTML——66.单选框

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>单选框</title></head><body><!--input元素的type属性&#xff1a;(必须要有)--> <!--单选框:&#xff08;如所住省会&#xff0c;性别选择&…