2012-05-19 52 views
2

我有一些由我自己的編譯器創建的asm程序,當我想運行它們時,它們最終會出現分段錯誤。所有指令都按照我想要的方式執行,但執行完成時會出現段錯誤。分段錯誤x86 <_dl_debug_state>

當我嘗試以看段錯誤使用gdb的,看來,它總是發生在該行:0x11ee90 < _dl_debug_state>推%EBP>

我甚至不知道這是什麼線,並首先如何防止它引起段錯誤。

這裏是那種PROGRAMM的一個爲例:%ebp被壓入堆棧:

file "test_appel.c" 
    .text     
.globl f 
    .type f, @function 
f:       
    pushl %ebp      
    movl %esp, %ebp    
    subl $16, %esp 
    movl 8(%ebp), %eax 
    pushl %eax       
    movl 12(%ebp), %eax 
    popl %ecx   
    imull %ecx, %eax 
    movl %eax, 16(%ebp) 
    movl 16(%ebp), %eax 
    leave 
    ret   
    .section .rodata 
.LC0: 
    .string "appel à fonction pour la multiplication\n" 
.LC1: 
    .string "resultat 2 * 3 = %d\n" 
    .text     
.globl main 
    .type main, @function 
main:       
    pushl %ebp      
    movl %esp, %ebp    
    andl $-16, %esp 
    subl $32, %esp 
    movl $2, %eax 
    movl %eax, 8(%ebp) 
    movl $3, %eax 
    movl %eax, 12(%ebp) 
    movl 12(%ebp), %eax 
    movl %eax ,4(%esp) 
    movl 8(%ebp), %eax 
    movl %eax ,0(%esp) 
    call f 
    movl %eax, 4(%ebp) 
    movl 4(%esp), %eax  
    movl (%esp), %ecx  
    pushl %eax    
    pushl %ecx    
    movl  $.LC0, %eax 
    movl %eax, (%esp) 
    call printf   
    popl %ecx    
    popl %eax    
    movl %eax, 4(%esp) 
    movl %ecx, (%esp)  
    movl 4(%esp),%eax  
    movl (%esp), %ecx  
    pushl %eax    
    pushl %ecx    
    movl 4(%ebp), %eax 
    movl %eax, %edx 
    movl %edx, 4(%esp)      
    movl $.LC1, (%esp) 
    call printf        
    popl %ecx    
    popl %eax    
    movl %eax, 4(%esp) 
    movl %ecx, (%esp)  
    leave 
    ret 

回答

0

when i try to use gdb in order to look at the segfault, it appears that it always occurs at the line : 0x11ee90 <_dl_debug_state> push %ebp>

當一個函數調用期間的基指針段故障正在發生。這看起來像是之前發生的堆棧損壞的反應。

您尚未共享來自GDB的完整堆棧跟蹤以及地址空間信息。

在gdb中,當seg故障執行disassemble以獲得更多信息時,還可以使bt獲得所有調用的函數。

2

段錯誤,看來,它總是發生在該行:0x11ee90 <_dl_debug_state> push %ebp>

這只是意味着你已經損壞或耗盡堆棧。

您的編譯器實際上看起來會發出破壞堆棧遍佈整個地方的代碼。特別是這些指令:在你主叫(這是libc中的一部分)

movl %eax, 8(%ebp) 
... 
movl %eax, 12(%ebp) 

腐敗的局部變量,因此它並不令人感到意外後main回報崩潰。

您可能意圖發出:movl %eax, -8(%ebp)movl %eax, -12(%ebp)

0

問題是你正在破壞返回指令。如您所知,ebp + 4總是包含執行被調用函數後控件跳轉的返回指令地址。你的情況,你有這樣的說法:「()F」

 movl %eax, 4(%ebp) 

你正在寫的返回值到EBP + 4從而破壞了返回指令的地址。你刪除這個陳述你不會得到分段錯誤。