我正在学习汇编语言,并阅读“从头开始编程”一书。 在第一个编程示例中
movl $1, %eax #
movl $0, %ebx #
int $0x80 #
我可以成功将其组装到目标文件中。但是当我运行ld exit.o exit
时,会出现以下错误:
ld: warning: -macosx_version_min not specified, assuming 10.8
Undefined symbols for architecture x86_64:
"start", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for inferred architecture x86_64
我该如何解决这个问题?运行环境是MacOS 10.9
答案 0 :(得分:2)
您正在阅读的书是关于Linux系统的汇编编程,而不是Mac OS X.虽然它们相似,但它们并不相同,特别是在低级编程时像这样 - 如果你想按照本书中的说明,设置一个Linux虚拟机并使用它。
答案 1 :(得分:0)
构建目标文件后,链接器通常会生成可执行文件(此命令非常具体)。看起来编译器是为32位系统构建的,并且无法识别x86_64。我最近用Dos-Box模拟器学习了8086。您是否模仿原生环境以使其顺利运行? 32位程序可能无法在64位操作系统上运行,只需要一点兼容性修补/思考。
您使用的是-macosx 10.8吗?
答案 2 :(得分:0)
osx上的程序集和linux上的程序集之间存在一些区别。
在linux中:
test.s
.section .text
.globl _start
_start:
movl $1, %eax
movl $0, %ebx
int $0x80
组装&链接&运行
# as -o test.o test.s
# ld -o test test.o
# ./test
# echo $?
0
在OS X中:
test.s
.data
.text
.globl start
start:
nop
movl $1, %eax
movl $0, %ebx
int $0x80
组装&链接&运行
#as -arch i386 -o test.o test.s
#ld -arch i386 -macosx_version_min 10.7 -o test test.o
#./test
#echo $?