【发布时间】:2011-05-20 05:30:41
【问题描述】:
如何在 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
【问题讨论】:
-
_start 可能是一个错误的名称。在创建开始之前,请注意必须进行大量预处理,否则各种问题都会中断。要了解符号,您必须定义 try nm crt1.o。 gcc -e main 使“main”成为入口点而不是 start。您可以通过这种方式定义您想要的任何功能。我不知道如何为 Xcode 设置该选项。其他人可能会。
-
IIRC,MacOS call numbers 与 Linux 不同,所以 eax=1 / int 0x80 可能不是 sys_exit。并且 32 位系统 MacOS 调用采用 FreeBSD 风格的堆栈参数,而不是 EBX、ECX、EDX,...。当然,如果制作 64 位可执行文件,您需要使用
syscall进行适当的调用数字/ arg-passing regs。
标签: c macos assembly entry-point