Assembly 从另一个文件调用程序集函数
我有下面的代码来计算一个数字的平方,它工作得很好:Assembly 从另一个文件调用程序集函数,assembly,x86,Assembly,X86,我有下面的代码来计算一个数字的平方,它工作得很好: .section .data .section .text .globl _start .globl square _start: pushl $10 call square addl $4, %esp movl %eax, %ebx movl $1, %eax int $0x
.section .data
.section .text
.globl _start
.globl square
_start:
pushl $10
call square
addl $4, %esp
movl %eax, %ebx
movl $1, %eax
int $0x80
.type square,@function
square:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
imull %eax, %eax
end_square:
movl %ebp, %esp
popl %ebp
ret
我想从另一个名为square\u test.s
的文件调用函数square
。这是我的尝试:
.section .data
.section .text
.globl _start
_start:
pushl $12
call square
addl $4, %esp
movl %eax, %ebx
movl $1, %eax
int $0x80
但当链接时,它会给我带来以下错误:
$ as --32 square_test.s -o square_test.o
$ as --32 square.s -o square.o
$ ld -m elf_i386 square.o square_test.o -o square_test
square_test.o: In function `_start':
(.text+0x0): multiple definition of `_start'
square.o:(.text+0x0): first defined here
如何修复此问题?您有两个名为“\u start”的全局符号(每个文件中一个)。如果要将文件链接在一起,必须将其中一个文件重命名为“_start”以外的名称,或使其中一个文件成为非全局文件(删除.globl指令) 多亏了上面的评论,我终于成功了。以下是两个文件:
# file name: isolated_square.s
.section .data
.section .text
.globl square
.type square,@function
square:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
imull %eax, %eax
end_square:
movl %ebp, %esp
popl %ebp
ret
这是另一个文件:
# file name: square_test.s
.section .data
.section .text
.globl _start
_start:
pushl $12
call square
addl $4, %esp
movl %eax, %ebx
movl $1, %eax
int $0x80
这就是您需要执行它的方式:
$ as --32 isolated_square.s -o isolated_square.o
$ as --32 square_test.s -o square_test.o
$ ld -m elf_i386 isolated_square.o square_test.o -o square_test
$ ./square_test
$ echo $?
144
上面写着“开始的多重定义”,不是吗?很明显你有两个。那么解决办法是什么呢?保留你想要的一个,删除另一个。你可以通过
gcc-m32-static-nostlib-no pie*.s-o square\u test
一步完成这一切。(过去,您只需要gcc-nostlib
就可以了,但现在可以使用默认的派了。)