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::PassPluginLibraryInfo
    LLVM_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_LIBS
    LLVMCore
    LLVMSupport
    LLVMBinaryFormat
    LLVMRemarks
    LLVMBitstreamReader
    LLVMTarget
    LLVMDemangle
    LLVMTargetParser
)

# 查找并链接库
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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

adb 不是内部或外部命令,也不是可运行的程序或批处理文件。

1、问题概述&#xff1f; 本文讲述的是在window系统中安装了Android SDK之后&#xff0c;adb无法使用的情况。 在cmd中执行adb devices提示如下问题&#xff1a; adb 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 问题&#xff1a;没有配置android sdk环…

Leetcode 第426场周赛分析总结

3370. 仅含置位位的最小整数 AC代码 class Solution { public:int smallestNumber(int n) {int x 1;while (x - 1 < n) {x << 1;}return x - 1;} };分析总结 也可以先直接获取n的长度&#xff0c;然后计算得到&#xff0c;这样时间复杂度由O(logn)优化为O(1) 在C…

【从零开始入门unity游戏开发之——unity篇05】unity6基础入门——运行游戏按钮、Game游戏窗口和Project项目窗口介绍

文章目录 运行游戏按钮、Game游戏窗口和Project项目窗口一、运行游戏按钮二、Game游戏窗口1、右上角设置1.1 如果没有相机渲染则发出警告1.2 在”编程模式”下清除每一帧1.3 窗口最大化 2、上方工具&#xff08;1&#xff09;切换手机模拟器&#xff08;2&#xff09;切换不同显…

九、Vue 事件处理器

文章目录 前言一、基础事件绑定:v-on 指令二、方法调用:组织有序的交互逻辑三、事件修饰符阻止冒泡与默认事件捕获与自身触发单次触发与鼠标按键区分四、按键修饰符前言 在 Vue.js 的交互世界里,事件处理器起着举足轻重的作用,它让页面从静态展示迈向动态交互,精准捕捉用户…

【项目】基于趋动云平台的Stable Diffusion开发

【项目】基于趋动云平台的Stable Diffusion开发 &#xff08;一&#xff09;登录趋动云&#xff08;二&#xff09;创建项目&#xff1a;&#xff08;三&#xff09;初始化开发环境&#xff1a;&#xff08;四&#xff09;运行代码&#xff08;五&#xff09;运行模型 &#xf…

VSCode下配置Blazor环境 断点调试Blazor项目

VSCode下使用Blazor的环境配置和插件推荐 Blazor是一种用于构建交互式Web UI的.NET框架&#xff0c;它可以让你使用C#、Razor和HTML进行Web开发&#xff0c;而不需要JavaScript。在这篇文章中&#xff0c;我们将介绍如何在VSCode中配置Blazor环境&#xff0c;并推荐一些有用的…

word文档中的文档网格——解决相同行间距当显示出不同行间距的情况

1 问题 被一个行间距调疯了&#xff0c;就是样式改了没用&#xff0c;格式刷刷了没用。就是肉眼可以看出行间距完全不一样。 2 解决方法 1&#xff09;修改论文正文(即出现问题文本的样式)样式&#xff1a;样式>修改>格式>段落>缩进和间距>取消"如果定义了…

ubuntu如何禁用 Snap 更新

.禁用 Snap 更新&#xff08;通过修改 snapd 配置&#xff09; 打开并编辑 /etc/apt/apt.conf.d/50unattended-upgrades文件。 这个文件控制自动更新的行为。 sudo vim /etc/apt/apt.conf.d/50unattended-upgrades 里面有一行将里面的auto改为false即可禁用更新&#xff1a;…

UniApp 原生插件开发指南

一、UniApp 原生插件开发引言 在当今的移动应用开发领域&#xff0c;跨平台开发已成为主流趋势&#xff0c;而 UniApp 作为一款强大的跨平台开发框架&#xff0c;备受开发者青睐。它凭借 “一套代码&#xff0c;多端运行” 的特性&#xff0c;极大地提高了开发效率&#xff0c…

JVM实战—9.线上FGC的几种案例

大纲 1.如何优化每秒十万QPS的社交APP的JVM性能(增加S区大小 优化内存碎片) 2.如何对垂直电商APP后台系统的FGC进行深度优化(定制JVM参数模版) 3.不合理设置JVM参数可能导致频繁FGC(优化反射的软引用被每次YGC回收) 4.线上系统每天数十次FGC导致频繁卡顿的优化(大对象问题…

电脑找不到mfc110.dll文件要如何解决?Windows缺失mfc110.dll文件快速解决方法

一、mfc110.dll文件的重要性 mfc110.dll&#xff0c;全称Microsoft Foundation Class Library 110&#xff0c;是Microsoft Visual C Redistributable for Visual Studio 2012的一部分。这个动态链接库&#xff08;DLL&#xff09;文件对于支持基于MFC&#xff08;Microsoft F…

《机器学习》——数据标准化(0~1标准化,z标准化)

文章目录 数据标准化一、什么是标准化二、常用标准化0~1标准化z标准化 三、注意事项 数据标准化 一、什么是标准化 数据标准化是一种数据预处理技术&#xff0c;用于将数据按照一定的规则进行变换&#xff0c;使得不同特征或变量具有可比性和一致性。作用 消除量纲影响 在实际…

【Vim Masterclass 笔记02】第3章:Vim 核心知识 + L08:Vim 核心浏览命令 + L09:Vim 核心浏览命令同步练习

文章目录 Section 3&#xff1a;Vim Essentials&#xff08;Vim 核心知识&#xff09;S03L08 Essential Navigation Commands1 光标的上下左右移动2 上 / 下翻页3 基于单词前移4 基于单词后移5 重新定位视图中的文本&#xff08;页面重绘&#xff09;6 定位到所在行的行首7 光标…

2025工作管理综合指南:Jira、Confluence等Atlassian工具套件在工作管理中的应用

在高效的工作场所中&#xff0c;沟通、协作与协调是驱动团队效能与生产力提升的核心要素。企业需构建无缝信息流、顺畅的交接与标准化的流程&#xff0c;以确保无论团队采用何种工作模式——面对面、远程或混合——都能实现高效运作。一套强大的工作管理解决方案&#xff0c;作…

MyBatis-plus sql拦截器

因为业务需求&#xff0c;重新写了一套数据权限。项目中用的是mybtis-plus&#xff0c;正好MyBatis-Plus提供了插件数据权限插件 | MyBatis-Plus&#xff0c;那就根据文档来实现这个需求。 实现&#xff1a; 实现MultiDataPermissionHandler 首先创建MultiDataPermissionHan…

vue导入导出excel、设置单元格文字颜色、背景色、合并单元格(使用xlsx-js-style库)

npm i xlsx-js-style <template><button click"download">下载 Excel 表格</button><el-table :data"tableData" style"width: 100%"><el-table-column prop"date" label"日期" width"180…

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

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

Android布局layout的draw简洁clipPath实现圆角矩形布局,Kotlin

Android布局layout的draw简洁clipPath实现圆角矩形布局&#xff0c;Kotlin 通常&#xff0c;如果要把一个相对布局&#xff0c;FrameLayout&#xff0c;或者线性布局等这样的布局变成具有圆角或者圆形的布局&#xff0c;需要增加一个style&#xff0c;给它设置圆角&#xff0c;…

【中间件】docker+kafka单节点部署---zookeeper模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言消息中间件介绍1. KRaft模式2. zookeeper模式2.1. 单节点部署安装验证 前言 最近生产环境上准备部署ELFK日志监控&#xff0c;先在测试环境部署单节点kafka验证…

38 Opencv HOG特征检测

文章目录 HOGDescriptor 构造函数setSVMDetector 设置支持向量机&#xff08;SVM&#xff09;检测器&#xff0c;用于目标检测。compute 用于计算图像区域的HOG描述符。detectMultiScale 多尺度检测目标。示例 HOGDescriptor 构造函数 HOGDescriptor(); HOGDescriptor(const S…