У меня есть простой отладчик (с помощью ptrace: http://pastebin.com/D0um3bUi), чтобы подсчитать количество инструкций, выполненных для данной исполняемой программы ввода. Он использует режим однократного выполнения ptrace для подсчета инструкций.
Для этого, когда программа 1) исполняемый файл (a.out из gcc main.c) указан как входной сигнал для моего тестового отладчика, он печатает около 100 тыс. по мере выполнения инструкций. Когда я использую параметр -static
, он дает 10681 инструкцию.
Теперь в 2) я создаю программу сборки и использую NASM для компиляции и компоновки, а затем, когда этот исполняемый файл передается в качестве ввода отладчиков, он отображает 8 инструкций как счетчик, а apt.
Число инструкций, выполняемых в программе 1), является высоким из-за того, что программа связана с системной библиотекой во время выполнения? используется -статический и который уменьшает счетчик в 1/10 раз. Как я могу обеспечить, чтобы количество команд было указано только для основной функции в программе 1) и как программа 2) сообщает об отладчике?
1)
#include <stdio.h>
int main()
{
printf("Hello, world!\n");
return 0;
}
Я использую gcc для создания исполняемого файла.
2)
; 64-bit "Hello World!" in Linux NASM
global _start ; global entry point export for ld
section .text
_start:
; sys_write(stdout, message, length)
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
mov rsi, message ; message address
mov rdx, length ; message string length
syscall
; sys_exit(return_code)
mov rax, 60 ; sys_exit
mov rdi, 0 ; return 0 (success)
syscall
section .data
message: db 'Hello, world!',0x0A ; message and newline
length: equ $-message ; NASM definition pseudo-
nasm -f elf64 -o main.o -s main.asm
ld -o main main.o