事の発端はuskzさんのtwitterでの発言
g++は変数であってもmainはマングリングされなくて、VCはされるみたい。
でも、VCだってextern “C”ならマングリングされない。だから、こんなことをしてみたら実行時エラーにもならなかった。
#include <iostream>
struct Hello {
unsigned char code;
explicit Hello(unsigned char c) : code(c) {
std::cout << "Hello World!" << std::endl;
}
};
extern "C" {
Hello main(0xc3);
};
※VC9にてコンパイル&実行。
VCの環境において、struct Helloはunsigned char=1byteのcodeメンバを持つのみ
Hello型変数mainのコンストラクタに0xc3を渡してcodeを0xc3(x86のRET命令)にしてやれば、スタートアップコードが_mainを呼び出してもそのまま帰るかな?と思ったら、予想通り正常に終了した。
Ubuntu 10.04とg++だと実行時にSegmentation Fault起こした。データ領域にコードを置いたからかな?