我試圖編寫一個(gè)函數(shù)來(lái)復(fù)制一個(gè)函數(shù)(并最終修改其程序集)并返回它。對(duì)于一個(gè)間接級(jí)別來(lái)說,這很好用,但在兩個(gè)級(jí)別上,我都遇到了段錯(cuò)誤。這是一個(gè)最小的(不)工作示例:#include <stdio.h>#include <string.h>#include <sys/mman.h>#define BODY_SIZE 100int f(void) { return 42; }int (*G(void))(void) { return f; }int (*(*H(void))(void))(void) { return G; }int (*g(void))(void) { void *r = mmap(0, BODY_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); memcpy(r, f, BODY_SIZE); return r;}int (*(*h(void))(void))(void) { void *r = mmap(0, BODY_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); memcpy(r, g, BODY_SIZE); return r;}int main() { printf("%d\n", f()); printf("%d\n", G()()); printf("%d\n", g()()); printf("%d\n", H()()()); printf("%d\n", h()()()); // This one fails - why? return 0;}我可以一次將內(nèi)存轉(zhuǎn)移到mmap'ed區(qū)域中,以創(chuàng)建一個(gè)可以稱為(g()())的有效函數(shù)。但是,如果我嘗試再次應(yīng)用(h()()()),則會(huì)出現(xiàn)段錯(cuò)誤。我已經(jīng)確認(rèn)它可以正確創(chuàng)建的復(fù)制版本g,但是當(dāng)我執(zhí)行該版本時(shí),就會(huì)出現(xiàn)段錯(cuò)誤。我為什么不能在一個(gè)mmap'ed區(qū)域中執(zhí)行代碼而又不能在另一個(gè)mmap'ed區(qū)域中執(zhí)行代碼呢?從帶有x/i檢查的探索性gdb-ing看來(lái),我可以成功調(diào)用,但是當(dāng)我返回該函數(shù)時(shí),我所來(lái)自的函數(shù)已被擦除并替換為0。如何使這種行為起作用?可能嗎?
添加回答
舉報(bào)
0/150
提交
取消