1、define预处理指令
这种方式很简单,只是简单地将main字符串用宏来代替,或者使用##拼接字符串。示例程序如下:
#include <stdio.h>
#define begin main
int begin(void)
{
printf( "Hello, World!\n");
return 0;
}
#define begin main
int begin(void)
{
printf( "Hello, World!\n");
return 0;
}
#include <stdio.h>
#define begin m##a##i##n
int begin(void)
{
printf( "Hello, World!\n");
return 0;
}
严格来说,这种方式只算是一种技巧......
2、_start函数
_start函数是C程序的入口函数,会调用main函数。在调用main函数之前,会先执行_start函数分配必要的资源,然后再调用main函数。但是在用gcc编译程序时可以使用-nostartfiles选项来重写_start函数。示例程序如下:
#include <stdio.h>
#include <stdlib.h>
_start(void) {
printf( "Hello, World!\n");
exit( 0);
}
#include <stdlib.h>
_start(void) {
printf( "Hello, World!\n");
exit( 0);
}
编译上面的程序的命令为:
gcc
-nostartfiles _start.c
-o a.out
反汇编生成的可执行程序,如下所示:
a.out
: file format elf64
-x86
-
64
Disassembly of section .plt :
0000000000400320 <puts@plt -0x10 > :
400320 : ff 35 ea 01 20 00 pushq 0x2001ea( %rip) # 600510 <_GLOBAL_OFFSET_TABLE_+0x8>
400326 :
Disassembly of section .plt :
0000000000400320 <puts@plt -0x10 > :
400320 : ff 35 ea 01 20 00 pushq 0x2001ea( %rip) # 600510 <_GLOBAL_OFFSET_TABLE_+0x8>
400326 :