使用 clang++ 生成的可执行文件发疯了

发布于 2024-12-04 15:09:06 字数 681 浏览 1 评论 0原文

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
using namespace std;

class Book{
    public:
        int a;
        int b;
};

int main()
{
    Book b1;
    b1.a = 10;
    b1.b = 20;
    cout<< b1.a << " " <<b1.b;
}

当我们编译上面的代码

clang++ test.cc -o a.exe

并运行 a.exe 时效果很好。但是,当我们编译同一个程序时

clang++ test.cc -emit-llvm -S -o a.exe

,现在当我们运行它时,程序会通过启动 ntvdm.exe(可以在进程资源管理器中看到)而变得疯狂,并且命令提示符开始表现得很奇怪。

软件堆栈:

clang version 2.9 (tags/RELEASE_29/final)
Target: i386-pc-mingw32
Thread model: posix
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
using namespace std;

class Book{
    public:
        int a;
        int b;
};

int main()
{
    Book b1;
    b1.a = 10;
    b1.b = 20;
    cout<< b1.a << " " <<b1.b;
}

when we compile the above code with

clang++ test.cc -o a.exe

and run a.exe works perfectly. But when we compile the same program with

clang++ test.cc -emit-llvm -S -o a.exe

and now when we run it, the program goes crazy by launching ntvdm.exe (can be seen in process explorer) and command prompt starts behaving weird.

Software stack:

clang version 2.9 (tags/RELEASE_29/final)
Target: i386-pc-mingw32
Thread model: posix

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

日裸衫吸 2024-12-11 15:09:06

通过添加“-emit-llvm -S”,您不会生成机器代码,而是生成 LLVM 字节码。要运行它,您需要使用 lli

由于 ntvdm.exe 是运行实模式 DOS 程序的虚拟机,这可能意味着 Windows 将 LLVM 字节码中的可执行文件解释为 16 位 DOS 程序,并尝试将其作为一个运行。

By adding '-emit-llvm -S' you are not generating machine code, but LLVM bytecode. To run that, you need to use lli.

As ntvdm.exe is virtual machine for running real-mode DOS programs, it might mean that windows interprets executable in LLVM bytecode as 16-bit DOS program and tries to run it as one.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文