【问题标题】:Can a libXXX.so transfer into a native code file? What ls LLVM native code looks like?libXXX.so 可以转移到本机代码文件中吗? ls LLVM 本机代码是什么样的?
【发布时间】:2013-12-15 07:41:34
【问题描述】:

LLVM 原生代码是什么样的让我很困惑?比如main.s有两种,哪一种是native code? 这个:

.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


    【解决方案1】:

    没有“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 来做这件事——查看the Clang user's manual。如果你熟悉 GCC,命令行应该是一样的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 2012-03-29
    • 2016-11-09
    相关资源
    最近更新 更多