从另一个文件

时间:2018-06-15 22:21:17

标签: 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 $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

我该如何解决这个问题?

2 个答案:

答案 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