使用 clang++ 生成的可执行文件发疯了
#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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
通过添加“-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.