libXXX.so能否传输到本机代码文件中?ls LLVM本机代码是什么样子的?

libXXX.so能否传输到本机代码文件中?ls LLVM本机代码是什么样子的?,llvm,Llvm,我很困惑LLVM本机代码是什么样子的?例如,有两种main.s,哪一种是本机代码? 这个: .file "main.bc" .text .globl main .align 16, 0x90 .type main,@function main: # @main # BB#0: subl $12, %esp movl $.L.str, (%esp) calll puts calll foo xorl

我很困惑LLVM本机代码是什么样子的?例如,有两种main.s,哪一种是本机代码? 这个:

.file   "main.bc"
.text
.globl  main
.align  16, 0x90
.type   main,@function
main:                                   # @main
# BB#0:
subl    $12, %esp
movl    $.L.str, (%esp)
calll   puts
calll   foo
xorl    %eax, %eax
addl    $12, %esp
ret
.Ltmp0:
.size   main, .Ltmp0-main

.type   .L.str,@object          # @.str
.section    .rodata.str1.1,"aMS",@progbits,1
.L.str:
.asciz   "This is a shared library test..."
.size   .L.str, 33


.section    ".note.GNU-stack","",@progbits
或:

@.str = private unnamed_addr constant [33 x i8] c"This is a shared library test...\00", align 1

define i32 @main() nounwind {
%1 = alloca i32, align 4
store i32 0, i32* %1
%2 = call i32 @puts(i8* getelementptr inbounds ([33 x i8]* @.str, i32 0, i32 0))
call void @foo()
ret i32 0
}

declare i32 @puts(i8*)

declare void @foo()
第一个由llvm llc生成,第二个由-emit llvm-S生成

如果我想使用LLVM将静态库或共享库转换为本机代码,我该如何使用LLVM

没有所谓的“LLVM本机代码”

第一个代码段位于(看起来是)x86程序集中。这些文件通常具有“.s”扩展名,汇编程序可以将它们转换为目标文件。默认情况下,LLVM的“llc”工具生成这些文件,但这些文件没有任何LLVM特定的内容—每个x86编译器都可以生成它们。这有时也称为x86本机代码

第二个代码部分位于“LLVM位代码”或“LLVM中间表示”(IR)中。这是一种特定于LLVM的中间语言,通常具有“.ll”扩展名。但是,运行“clang-emit llvm-S”默认情况下会生成扩展名为“.S”下的那些,这可能解释了您在这里的困惑


你问:

如果我想使用LLVM将静态库或共享库转换为本机代码,我该如何使用LLVM


如果您谈论的是已经构建的静态库和共享库(例如“.so”或“.lib”文件),那么它们已经在“本机代码”中了,不过如果您想获得它们的人性化表示,您可能需要使用反汇编程序。如果这些库尚未构建,您可以像其他编译器一样使用Clang来构建它们。如果这些库是在LLVM位代码中提供的,那么您可以使用LLVM的“llc”将它们转换为程序集文件(尽管“llc”不进行优化,您也需要手动运行LLVM的“opt”。

谢谢您的详细回答。我的项目是由Emscripten编写的。共享库是位码格式吗?@Gwinel对不起,我对Emscripten了解不够,无法回答。我建议就此单独提出一个新问题。那么如何使用LLVM构建静态库或共享库?@Gwinel您可以使用Clang来实现这一点-请查看。如果您熟悉GCC,那么命令行应该是相同的。