Windows下如何为lli指定Rust生成LLVM-IR的缺失符号依赖?
在Windows下用lli运行Rust生成的LLVM-IR文件
问题背景
已将Rust代码导出为LLVM-IR(.ll)文件,可通过clang或llc+link.exe手动编译链接,但使用lli运行时,无法正确传递依赖(Rust库、系统库、临时.o文件),虽找到部分参数用法,但仍出现__rust_no_alloc_shim_is_unstable符号无法解析的错误。目标是调试Rust生成的LLVM-IR,依赖lli工具。
正确传递依赖给lli的参数用法
1. Rust标准库及相关rlib文件
使用--extra-archive参数指定完整路径,需包含所有用到的Rust核心库(不只是libstd):
--extra-archive="C:\Users\$USER_NAME\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\x86_64-pc-windows-msvc\lib\libstd-$RANDOM_STRING.rlib" --extra-archive="C:\Users\$USER_NAME\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\x86_64-pc-windows-msvc\lib\liballoc-$RANDOM_STRING.rlib"
替换$USER_NAME和$RANDOM_STRING为实际路径中的对应值
2. Rust编译生成的临时目标文件
使用--extra-object参数,必须包含所有cargo rustc --release -- -C save-temps生成的.rcgu.o文件,而不只是单个文件:
--extra-object=".\target\release\deps\$PROJECT_NAME.$RANDOM_STRING.rcgu.o" --extra-object=".\target\release\deps\$PROJECT_NAME.$RANDOM_STRING_alloc_shim.rcgu.o"
3. 系统库处理
静态系统库
用--extra-archive指定MSVC静态库路径:
--extra-archive="C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\lib\x64\msvcrt.lib"
动态系统库(如ws2_32、userenv)
直接加载系统DLL,使用--load参数:
--load="C:\Windows\System32\ws2_32.dll" --load="C:\Windows\System32\userenv.dll"
解决__rust_no_alloc_shim_is_unstable符号缺失问题
该符号属于Rust分配器垫片,需确保:
--extra-object参数包含了所有临时目标文件,尤其是带有alloc_shim关键字的.rcgu.o文件- 如果仍缺失,添加Rust toolchain目录下的
liballoc_shim_-$RANDOM_STRING.rlib库:
--extra-archive="C:\Users\$USER_NAME\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\x86_64-pc-windows-msvc\lib\liballoc_shim-$RANDOM_STRING.rlib"
完整lli命令示例
lli ^ --extra-archive="C:\Users\YourName\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\x86_64-pc-windows-msvc\lib\libstd-xxxxxx.rlib" ^ --extra-archive="C:\Users\YourName\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\x86_64-pc-windows-msvc\lib\liballoc-xxxxxx.rlib" ^ --extra-archive="C:\Users\YourName\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\x86_64-pc-windows-msvc\lib\liballoc_shim-xxxxxx.rlib" ^ --extra-archive="C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\lib\x64\msvcrt.lib" ^ --extra-object=".\target\release\deps\your_project.xxxxxx.rcgu.o" ^ --extra-object=".\target\release\deps\your_project.xxxxxx_alloc_shim.rcgu.o" ^ --load="C:\Windows\System32\ws2_32.dll" ^ --load="C:\Windows\System32\userenv.dll" ^ your_llvm_ir_file.ll
内容的提问来源于stack exchange,提问作者Remodor
相关产品推荐
相关产品推荐

