如何构建包含Mac OS X入口点的C程序?

时间:2010-12-04 14:19:39

标签: c macos assembly entry-point

如何构建包含Mac OS X入口点的C程序?

我想建立:

start() {
    /* exit system call */
    asm("movl $1,%eax;"
        "xorl %ebx,%ebx;"
        "int  $0x80"
    );
}

但是当我跑步时:

gcc -nostdlib min.c

我总是得到:

ld: could not find entry point "start" (perhaps missing crt1.o)
collect2: ld returned 1 exit status

我为了看到它正在做什么而做的另一个尝试是:

gcc -nostdlib -c min.c && otool -tV min.o

输出结果为:

(__TEXT,__text) section
_start:
0000000000000000    pushq   %rbp
0000000000000001    movq    %rsp,%rbp
0000000000000004    leave
0000000000000005    ret

那么,在“开始”功能之前,下划线的来源是什么?我该如何防止这种情况发生?或者更简单:

如何构建包含Mac OS X入口点的C程序?

谢谢, CrazyChenz

2 个答案:

答案 0 :(得分:2)

您可以使用asm分别声明gcc赋予函数的符号:

void start() asm ("start");

确保这是独立的声明,与函数定义分开。

您可以在此处阅读有关控制所生成符号的更多详细信息:https://stackoverflow.com/a/1035937/12928775

此外,正如Peter Cordes指出的那样,您可能应该在函数定义中包含__attribute__((naked)),以防止gcc在入口时生成堆栈框架。

完整代码为:

void start() asm ("start");

__attribute__((naked)) void start() {
    /* exit system call */
    asm("movl $1,%eax;"
        "xorl %ebx,%ebx;"
        "int  $0x80"
    );
}

答案 1 :(得分:1)

当您希望入口点不是start时,gcc -e选项定义入口点。这样,您可以在输入点创建mystart()。

gcc -e mystart mycode.c -o mycode

我不知道如何在Xcode中设置-e选项。