Here is a patch for Bug#550170, "emacs23: does not start, stops after printing Wrong type argument: keymapp, ("DEAD" . 17614028)", against the Emacs 23.1 source tree. It's already in the Emacs upstream repository.
diff -c /home/cyd/pretest/emacs-23.1/src/xterm.c\~ /home/cyd/pretest/emacs-23.1/src/xterm.c *** /home/cyd/pretest/emacs-23.1/src/xterm.c~ 2010-01-13 15:55:10.000000000 -0500 --- /home/cyd/pretest/emacs-23.1/src/xterm.c 2010-01-13 15:55:22.000000000 -0500 *************** *** 10233,10245 **** if (!EQ (XSYMBOL (Qvendor_specific_keysyms)->function, Qunbound)) { char *vendor = ServerVendor (dpy); ! /* Temporarily hide the partially initialized terminal */ terminal_list = terminal->next_terminal; UNBLOCK_INPUT; terminal->kboard->Vsystem_key_alist = call1 (Qvendor_specific_keysyms, vendor ? build_string (vendor) : empty_unibyte_string); BLOCK_INPUT; terminal->next_terminal = terminal_list; terminal_list = terminal; } --- 10233,10248 ---- if (!EQ (XSYMBOL (Qvendor_specific_keysyms)->function, Qunbound)) { char *vendor = ServerVendor (dpy); ! /* Temporarily hide the partially initialized terminal, ! but make sure it doesn't get garbage collected. */ ! int count = inhibit_garbage_collection (); terminal_list = terminal->next_terminal; UNBLOCK_INPUT; terminal->kboard->Vsystem_key_alist = call1 (Qvendor_specific_keysyms, vendor ? build_string (vendor) : empty_unibyte_string); BLOCK_INPUT; + unbind_to (count, Qnil); terminal->next_terminal = terminal_list; terminal_list = terminal; } Diff finished. Wed Jan 13 15:55:25 2010