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
就可以了,但现在可以使用默认的派了。)