当前位置: 首页 > news >正文

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.mrgr.cn/news/82505.html

相关文章:

  • 数据仓库中的指标体系模型介绍
  • 区块链方向学习路线
  • Java.函数-acwing
  • GRAPE——RLAIF微调VLA模型:通过偏好对齐提升机器人策略的泛化能力(含24年具身模型汇总)
  • Elasticsearch DSL版
  • 【蓝桥杯研究生组】第14届Java试题答案整理
  • 上升沿下降沿递增
  • VSCode下配置Blazor环境 断点调试Blazor项目
  • 今日复盘103周五(189)
  • ROS2软件架构全面解析-学习如何设计通信中间件框架
  • Java实现UDP与TCP应用程序
  • 《Spring Framework实战》1:Spring简介
  • NetCore开发的文件下载器,国外文件地址可下载
  • xxljob
  • CPU缓存架构详解高性能内存队列Disruptor实战
  • 黑马Java面试教程_P10_设计模式
  • 无刷直流电机偏移角度
  • Python基础语法(上)
  • CDP集成Hudi实战-spark shell
  • halcon三维点云数据处理(五)创建代表工具和机器人底座的3D模型
  • STM32-笔记34-4G遥控灯
  • C++ hashtable
  • node.js之---EventEmitter 类
  • 计算机网络——期末复习(5)期末考试样例1(含答案)
  • GPU加速计算的专业云服务平台:蓝耘GPU算力平台的概述、具体应用与教学
  • 【51项目】51单片机自制小霸王游戏机