我有两个.asm文件,一个在另一个中调用函数。我的文件看起来像:将两个.o文件链接在一起
mainProg.asm:
global main
extern factorial
section .text
main:
;---snip---
push rcx
call factorial
pop rcx
;---snip---
ret
factorial.asm:
section .text
factorial:
cmp rdi, 0
je l2
mov rax, 1
l1:
mul rdi
dec rdi
jnz l1
ret
l2:
mov rax, 1
ret
(是的,有一些东西我可以实施提高)
我试图按照以下步骤编译它们:How to link two nasm source files:
$ nasm -felf64 -o factorial.o factorial.asm
$ nasm -felf64 -o mainProg.o mainProg.asm
$ gcc -o mainProg mainProg.o factorial.o
前两个命令的工作没有问题,但最后失败,并
mainProg.o: In function `main':
mainProg.asm:(.text+0x22): undefined reference to `factorial'
collect2: error: ld returned 1 exit status
更改目标文件的顺序不会改变错误。 我试图寻找解决方案来链接两个.o文件,并且我发现问题C Makefile given two .o files。由于没有提到,我跑objdump -S factorial.o
并得到
factorial.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <factorial>:
0: 48 83 ff 00 cmp $0x0,%rdi
4: 74 0e je 14 <l2>
6: b8 01 00 00 00 mov $0x1,%eax
000000000000000b <l1>:
b: 48 f7 e7 mul %rdi
e: 48 ff cf dec %rdi
11: 75 f8 jne b <l1>
13: c3 retq
0000000000000014 <l2>:
14: b8 01 00 00 00 mov $0x1,%eax
19: c3 retq
这是几乎相同的源文件。它清楚地包含了factorial
函数,那么为什么不ld
检测到它?有没有其他方法来链接两个.o文件?
您需要使'factorial'成为全局符号。 –