подпрограммы сборки вызываются дважды, даже не будучи вызванными из main

Я пытаюсь определить некоторые подпрограммы, в которых есть вызовы printf. Очень тривиальный пример:

extern printf
LINUX        equ     80H
EXIT         equ     60

section .data
    intfmt: db "%ld", 10, 0

segment .text
    global  main

main:
    call os_return      ; return to operating system

os_return:
    mov  rax, EXIT      ; Linux system call 60 i.e. exit ()
    mov  rdi, 0     ; Error code 0 i.e. no errors
    int  LINUX      ; Interrupt Linux kernel

test:
    push rdi
    push rsi
    mov rsi, 10
    mov rdi, intfmt
    xor rax, rax
    call printf
    pop rdi
    pop rsi
    ret

Здесь test просто имеет вызов printf, который выводит на экран число 10. Я не ожидал, что он будет вызван, поскольку у меня нет к нему обращения.

Однако при компиляции и запуске:

nasm -f elf64 test.asm
gcc -m64 -o test test.o

я получаю вывод:

10
10

Я совершенно озадачен и хотел бы узнать, может ли кто-нибудь объяснить, почему это происходит?

5
задан Hasturkun 11 December 2011 в 14:22
поделиться