在Mac OSX上将程序集(x86-64)中的printf和scanf与C文件链接时出现问题
我在汇编(x86-64)中编写了一个程序,并从C文件包装器中调用它以使用printf和scanf函数。但是,当我尝试链接它时,会出现以下错误:在Mac OSX上将程序集(x86-64)中的printf和scanf与C文件链接时出现问题,c,macos,assembly,printf,nasm,C,Macos,Assembly,Printf,Nasm,我在汇编(x86-64)中编写了一个程序,并从C文件包装器中调用它以使用printf和scanf函数。但是,当我尝试链接它时,会出现以下错误: $ nasm -f macho64 -l Parallelograms.lis -o assembly.o Parallelograms.asm $ gcc -c -Wall -m64 -o main.o ParallelogramDriver.c $ gcc -m64 -o main.out main.o assembly.o Undefined sy
$ nasm -f macho64 -l Parallelograms.lis -o assembly.o Parallelograms.asm
$ gcc -c -Wall -m64 -o main.o ParallelogramDriver.c
$ gcc -m64 -o main.out main.o assembly.o
Undefined symbols for architecture x86_64:
"_calcAndPrint", referenced from:
_main in main.o
"printf", referenced from:
calcAndPrint in assembly.o
"scanf", referenced from:
calcAndPrint in assembly.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
我相信这与macho64国旗有关。如果我使用elf64,它就不会捕获printf或scanf错误。然而,elf64在Mac上是一种不兼容的文件格式(据我所知)
这是我的C文件(ParallelogramDriver.C):
为混乱的代码道歉。这是我的第一个汇编代码程序,我对它很陌生。我正在开发MacOSX,据我所知,这是MacOSX特有的问题。感谢您的帮助。在OS X上,符号的前缀是下划线
call printf
及
需要
call _printf
及
分别;也
global calcAndPrint
及
应该读
global _calcAndPrint
及
相反
(但是,嘿,你可以从你的
calcAndPrint()
函数被符号化为\u calcAndPrint
)这一事实推断出这一点。你是否编写了汇编程序或CTRL+C CTRL+V'd:-PI编写了它,大量引用了我们老师提供的示例代码。我复制并粘贴在这里。这是我的第一个汇编程序,很抱歉代码看起来很粗糙。有些行为可以用-fleading下划线来控制。但在本例中,仅适用于calcAndPrint
。操作系统提供的符号将保留一个前导的\u
。将--前缀添加到Nasm的命令行应该可以解决这个问题(作为在.asm源代码中添加下划线的替代方法。此外,除非它是x64的新版本,否则C不知道tword
——试着用qword
替换它……谢谢,修复了它!而且--prefix也起了作用。非常感谢。这让我的计算机科学老师感到难堪,我还在为汇编绞尽脑汁。)。
call _printf
call _scanf
global calcAndPrint
calcAndPrint:
global _calcAndPrint
_calcAndPrint: