代码之家  ›  专栏  ›  技术社区  ›  Sibi

从另一个文件调用程序集函数

  •  -2
  • Sibi  · 技术社区  · 6 年前

    我有下面的代码来计算一个数字的平方,它工作得很好:

            .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 回复  |  直到 6 年前
        1
  •  2
  •   OregonJim    6 年前

    有两个名为“_start”的全局符号(每个文件中一个)。如果要将文件链接在一起,则必须将其中一个文件重命名为“_start”以外的其他文件,或使其中一个文件成为非全局文件(删除.globl指令)。

        2
  •  0
  •   Sibi    6 年前

    多亏了上面的评论,我终于成功了。这是两个文件:

    # 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