D.C*_*.C. 15 macos x86 assembly linker
我试图在我的Mac上深入研究一些x86汇编程序,但是在生成可执行文件时遇到了麻烦.这个问题似乎处于联系阶段.
helloWorld.s:
.data
HelloWorldString:
.ascii "Hello World\n"
.text
.globl _start
_start:
# load all the arguments for write()
movl $4, %eax
movl $1, %ebx
movl $HelloWorldString, %ecx
movl $12, %edx
# raises software interrupt to call write()
int $0x80
# call exit()
movl $1, %eax
movl $0, %ebx
int $0x80
Run Code Online (Sandbox Code Playgroud)
组装程序:
as -o helloWorld.o helloWorld.s
Run Code Online (Sandbox Code Playgroud)
链接目标文件:
ld -o helloWorld helloWorld.o
Run Code Online (Sandbox Code Playgroud)
我在这一点上得到的错误是:
ld: could not find entry point "start" (perhaps missing crt1.o) for inferred architecture x86_64
Run Code Online (Sandbox Code Playgroud)
关于我做错了/遗失的任何建议都会非常有帮助.谢谢
Pau*_*l R 20
您可能会发现使用gcc构建更容易,而不是尝试对汇编器和链接器进行微管理,例如
$ gcc helloWorld.s -o helloWorld
Run Code Online (Sandbox Code Playgroud)
(您可能会想换_start到_main,如果你走这条路线.)
顺便说一句,从一个有效的C程序开始,并从中研究生成的asm可能是有益的.例如
#include <stdio.h>
int main(void)
{
puts("Hello world!\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用gcc -Wall -O3 -m32 -fno-PIC hello.c -S -o hello.Sgenerate 编译时:
.cstring
LC0:
.ascii "Hello world!\12\0"
.text
.align 4,0x90
.globl _main
_main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl $LC0, (%esp)
call _puts
xorl %eax, %eax
leave
ret
.subsections_via_symbols
Run Code Online (Sandbox Code Playgroud)
您可能需要考虑将此作为您自己的"Hello world"或其他实验性asm程序的模板,特别是考虑到它已经构建并运行:
$ gcc -m32 hello.S -o hello
$ ./hello
Hello world!
Run Code Online (Sandbox Code Playgroud)
最后一条评论:谨防从面向Linux的asm书籍或教程中获取示例并尝试在OS X下应用它们 - 存在重要的差异!