如何在OS X上成功链接汇编程序?

时间:2014-08-18 03:03:30

标签: macos assembly x86

我正在学习汇编语言,并阅读“从头开始编程”一书。 在第一个编程示例中

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

3 个答案:

答案 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 $?