概述
----
1) 當程序接收到某些異常訊號導致退出時
, 會在程序的當前目錄下生成乙個名為
"core"
的檔案,
將程序退出時的執行狀態堆積在該檔案中.
2) elf
的堆積檔案與應用程式和共享庫的結構相同
, 包括
elf檔案頭
, 程式段描述符表和各段資料.
堆積 檔案的第乙個段為注釋段
, 它順次堆積了處理機狀態
, 程序狀態
, 任務結構映象,
浮點暫存器映象
. 其餘
的各個段為可載入段
, 依次描述了程序虛存空間中各個虛存塊的映象.
**----
; arch/i386/kernel/signal.c:
int do_signal(struct pt_regs *regs, sigset_t *oldset)
; fs/exec.c
int do_coredump(long signr, struct pt_regs * regs)
; fs/binfmt_elf.c
struct elf_prstatus
處理機狀態堆積 ;
struct elf_prpsinfo
程序資訊堆積 ;
#define dump_write(addr, nr)
if ((size += (nr)) > limit || !dump_write(file, (addr), (nr)))
goto end_coredump;
#define dump_seek(off)
if (!dump_seek(file, (off)))
goto end_coredump;
struct memelfnote ;
elf堆積檔案的生成
-----------------
static int elf_core_dump(long signr, struct pt_regs * regs, struct file * file)
else
*(struct pt_regs *)&prstatus.pr_reg = *regs;
#endif
#ifdef debug
dump_regs("passed in regs", (elf_greg_t *)regs);
dump_regs("prstatus regs", (elf_greg_t *)&prstatus.pr_reg);
#endif
notes[1].name = "core";
notes[1].type = nt_prpsinfo;
建立程序資訊段
notes[1].datasz = sizeof(psinfo);
notes[1].data = &psinfo;
i = current->state ? ffz(~current->state) + 1 : 0;
psinfo.pr_state = i;
程序狀態號
psinfo.pr_sname = (i < 0 || i > 5) ? '.' : "rsdztd"[ i ];
程序狀態名
psinfo.pr_zomb = psinfo.pr_sname == 'z';
程序是否已僵化
psinfo.pr_nice = current->nice;
程序優先數
psinfo.pr_flag = current->flags;
程序標誌
psinfo.pr_uid = new_to_old_uid(current->uid);
使用者號
psinfo.pr_gid = new_to_old_gid(current->gid);
使用者組號
strncpy(psinfo.pr_fname, current->comm, sizeof(psinfo.pr_fname));
程序名
notes[2].name = "core";
notes[2].type = nt_taskstruct;
堆積任務結構映象
notes[2].datasz = sizeof(*current);
notes[2].data = current;
/* try to dump the fpu. */
prstatus.pr_fpvalid = dump_fpu (regs, &fpu);
if (!prstatus.pr_fpvalid)
else
如果程序使用了浮點處理器
,則堆積
fpu暫存器映象
/* write notes phdr entry */
/* page-align dumped data */
dataoff = offset = roundup(offset, elf_exec_pagesize);
/* write program headers for segments dump */ ;
掃瞄虛存鏈
,寫入段描述符
for(vma = current->mm->mmap; vma != null; vma = vma->vm_next)
for(i = 0; i < numnote; i++)
if (!writenote(¬es[ i ], file))
寫入注釋段的各個片段
goto end_coredump;
set_fs(fs);
dump_seek(dataoff);
頁對齊
for(vma = current->mm->mmap; vma != null; vma = vma->vm_next) else }
} if ((off_t) file->f_pos != offset)
end_coredump:
set_fs(fs);
return has_dumped; }
static int writenote(struct memelfnote *men, struct file *file)
測試某個記憶體塊是否可以堆積
--------------------------
static inline int maydump(struct vm_area_struct *vma)
Linux核心分析 程式破解
1 掌握nop jne je jmp cmp彙編指令的機器碼 nop nop指令即 空指令 執行到nop指令時,cpu什麼也不做,僅僅當做乙個指令執行過去並繼續執行nop後面的一條指令。機器碼 90 jne 條件轉移指令,如果不相等則跳轉。機器碼 75 je 條件轉移指令,如果相等則跳轉。機器碼 7...
分析elf檔案的利器(常用命令)
1 readelf 針對elf檔案的解析器 readelf a a.out 2 objdump h objdump h a.out 將elf檔案的各個段的基本資訊列印出來 objdump x a.out可以列印更多的資訊,但是比較雜亂 3 size size命令檢視elf檔案的 段 資料段和bss段...
zTree 核心的分析
ztree的核心 結構 function 判斷是否傳遞了第乙個引數 if ztreesetting 獲取樹的容器id setting.treeobjid this.attr id 樹的容器 setting.treeobj this 繫結自定義事件 bindtreenodes setting,this...