1

如何在 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

4

2 回答 2

2

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

gcc -e mystart mycode.c -o mycode

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

于 2010-12-04T15:19:30.897 回答
2

您可以控制 gcc 赋予函数的符号,方法是单独声明asm

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"
    );
}
于 2020-02-20T01:00:05.693 回答