爲了模擬包含靜態變量初始化的應用程序(GNU C版本4.1.2(arm-linux-gnueabi))的完全重新啓動,我嘗試根據請求將setjmp/longjmp設置爲gcc pre_init掛鉤函數。 longjmp實際上可以達到.preinit_array函數,但是隨後通過SIGSEGV執行崩潰。是否可以在靜態變量初始化之前對gcc pre_init函數執行longjmp?
任何想法,爲什麼這可能出錯?這通常應該可能嗎?在gdbserver的控制下,是否有其他方法將Linux應用程序恢復到初始狀態?
新增來源:
static jmp_buf reset_simulation_jumpbuf __attribute__ ((section (".noinit")));
int preinit(int argc, char **argv, char **envp)
{
// at this point no static variables shall be initialized
setjmp(reset_simulation_jumpbuf);
}
// gcc standard linker scripts are calling this function before initialization
__attribute__((section(".preinit_array"))) typeof(preinit) *__preinit = preinit;
int main(void)
{
// at this point all static variables are initialized
do_something();
if (reset)
longjmp(reset_simulation_jumpbuf,1);
}
我寧願建議你'執行'的程序。這將與從「scratch」重新啓動程序相同。破壞機會的可能性較小,並且它仍然是一個相同的過程,因此希望可以在gdbserver上正常工作。 –
你怎麼把'setjmp'放在那裏? –
我添加了一段代碼來顯示我的方法。 – Marcel