【发布时间】:2023-03-19 08:33:01
【问题描述】:
我有两个 .asm 文件,一个在另一个内部调用函数。我的文件如下所示:
mainProg.asm:
global main
extern factorial
section .text
main:
;---snip---
push rcx
call factorial
pop rcx
;---snip---
ret
阶乘.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设为全局符号。
标签: gcc assembly linker 64-bit nasm