我有一个简单的调试器(使用ptrace:http://pastebin.com/D0um3bUi),用于计算给定输入可执行程序的指令执行次数。它使用ptrace单步执行模式来计算指令。
因此,当将程序1)的可执行文件(gcc main.c生成的a.out)作为测试调试器的输入时,它打印出大约十万条指令执行结果。当我使用
现在,在2)中,我创建了一个汇编程序并使用NASM进行编译和链接,然后将此可执行文件作为测试调试器的输入,它显示8条指令计数,这是正确的。
程序1)中执行的指令数量很高,是因为运行时将程序与系统库链接起来了吗?使用了-static,将其计数减少了1/10。如何确保指令计数仅限于程序1)中的主要功能,并且这就是程序2)为调试器报告的方式?
2)
我使用gcc创建可执行文件。
2)
因此,当将程序1)的可执行文件(gcc main.c生成的a.out)作为测试调试器的输入时,它打印出大约十万条指令执行结果。当我使用
-static
选项时,它会输出10681个指令。现在,在2)中,我创建了一个汇编程序并使用NASM进行编译和链接,然后将此可执行文件作为测试调试器的输入,它显示8条指令计数,这是正确的。
程序1)中执行的指令数量很高,是因为运行时将程序与系统库链接起来了吗?使用了-static,将其计数减少了1/10。如何确保指令计数仅限于程序1)中的主要功能,并且这就是程序2)为调试器报告的方式?
2)
#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
write()
而不是printf()
。此外,如果您反汇编可执行文件(例如objdump -d [executable]
),您实际上可以看到在main()
之前运行的一些代码。 - EOF