我有以下代码来计算一个完美运行的数字的平方:
.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
的文件中调用函数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 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
我该如何解决这个问题?
答案 0 :(得分:2)
您有两个名为“_start”的全局符号(每个文件中有一个)。如果要将文件链接在一起,则必须将其中一个重命名为“_start”之外的其他内容,或者将其中一个重命名为非全局(删除.globl指令)。
答案 1 :(得分:0)
感谢上述评论,最后我做到了。这是两个文件:
# 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