<!-- Generator: GNU source-highlight 2.4
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt>#
#
# add_dir "packages/gdb/gdb-6.8"
#
# add_file "packages/gdb/gdb-6.8/early_debug_in_nptl.patch"
# content [6e027b2499da589384a40847de046842934ba44e]
#
# add_file "packages/gdb/gdb-cross-sdk_6.8.bb"
# content [9444a910f04467593c5c669381d5ed60212c8324]
#
# add_file "packages/gdb/gdb-cross_6.8.bb"
# content [0ea423cc4dde24b7f31c9c213c5c9016bcee6ed5]
#
# add_file "packages/gdb/gdb_6.8.bb"
# content [46a7734cc95c48722b3546e977c35ed0591233c9]
#
============================================================
<font color="#FF6600">--- packages/gdb/gdb-6.8/early_debug_in_nptl.patch        6e027b2499da589384a40847de046842934ba44e</font>
<font color="#009900">+++ packages/gdb/gdb-6.8/early_debug_in_nptl.patch        6e027b2499da589384a40847de046842934ba44e</font>
<font color="#0000FF">@@ -0,0 +1,306 @@</font>
<font color="#009900">+http://sourceware.org/ml/gdb-patches/2007-06/msg00479.html</font>
<font color="#009900">+</font>
<font color="#009900">+Index: gdb/linux-thread-db.c</font>
<font color="#009900">+===================================================================</font>
<font color="#009900">+--- gdb/linux-thread-db.c.orig        2006-10-20 03:08:14.000000000 +0200</font>
<font color="#009900">++++ gdb/linux-thread-db.c        2008-03-01 14:45:52.000000000 +0100</font>
<font color="#009900">+@@ -213,6 +213,21 @@</font>
<font color="#009900">+ }</font>
<font color="#009900">+ }</font>
<font color="#009900">+ </font>
<font color="#009900">++/* Return 1 if any threads have been registered. There may be none if</font>
<font color="#009900">++ the threading library is not fully initialized yet. */</font>
<font color="#009900">++</font>
<font color="#009900">++static int</font>
<font color="#009900">++have_threads_callback (struct thread_info *thread, void *dummy)</font>
<font color="#009900">++{</font>
<font color="#009900">++ return 1;</font>
<font color="#009900">++}</font>
<font color="#009900">++</font>
<font color="#009900">++static int</font>
<font color="#009900">++have_threads (void)</font>
<font color="#009900">++{</font>
<font color="#009900">++ return iterate_over_threads (have_threads_callback, NULL) != NULL;</font>
<font color="#009900">++}</font>
<font color="#009900">++</font>
<font color="#009900">+ /* A callback function for td_ta_thr_iter, which we use to map all</font>
<font color="#009900">+ threads to LWPs.</font>
<font color="#009900">+ </font>
<font color="#009900">+@@ -700,23 +715,6 @@</font>
<font color="#009900">+ }</font>
<font color="#009900">+ </font>
<font color="#009900">+ static void</font>
<font color="#009900">+-thread_db_attach (char *args, int from_tty)</font>
<font color="#009900">+-{</font>
<font color="#009900">+- target_beneath->to_attach (args, from_tty);</font>
<font color="#009900">+-</font>
<font color="#009900">+- /* Destroy thread info; it's no longer valid. */</font>
<font color="#009900">+- init_thread_list ();</font>
<font color="#009900">+-</font>
<font color="#009900">+- /* The child process is now the actual multi-threaded</font>
<font color="#009900">+- program. Snatch its process ID... */</font>
<font color="#009900">+- proc_handle.pid = GET_PID (inferior_ptid);</font>
<font color="#009900">+-</font>
<font color="#009900">+- /* ...and perform the remaining initialization steps. */</font>
<font color="#009900">+- enable_thread_event_reporting ();</font>
<font color="#009900">+- thread_db_find_new_threads ();</font>
<font color="#009900">+-}</font>
<font color="#009900">+-</font>
<font color="#009900">+-static void</font>
<font color="#009900">+ detach_thread (ptid_t ptid, int verbose)</font>
<font color="#009900">+ {</font>
<font color="#009900">+ struct thread_info *thread_info;</font>
<font color="#009900">+@@ -742,14 +740,13 @@</font>
<font color="#009900">+ disable_thread_event_reporting ();</font>
<font color="#009900">+ </font>
<font color="#009900">+ /* There's no need to save & restore inferior_ptid here, since the</font>
<font color="#009900">+- inferior is supposed to be survive this function call. */</font>
<font color="#009900">++ inferior is not supposed to survive this function call. */</font>
<font color="#009900">+ inferior_ptid = lwp_from_thread (inferior_ptid);</font>
<font color="#009900">+ </font>
<font color="#009900">+- /* Forget about the child's process ID. We shouldn't need it</font>
<font color="#009900">+- anymore. */</font>
<font color="#009900">+- proc_handle.pid = 0;</font>
<font color="#009900">+-</font>
<font color="#009900">+ target_beneath->to_detach (args, from_tty);</font>
<font color="#009900">++</font>
<font color="#009900">++ /* Should this be done by detach_command? */</font>
<font color="#009900">++ target_mourn_inferior ();</font>
<font color="#009900">+ }</font>
<font color="#009900">+ </font>
<font color="#009900">+ static int</font>
<font color="#009900">+@@ -870,12 +867,6 @@</font>
<font color="#009900">+ </font>
<font color="#009900">+ ptid = target_beneath->to_wait (ptid, ourstatus);</font>
<font color="#009900">+ </font>
<font color="#009900">+- if (proc_handle.pid == 0)</font>
<font color="#009900">+- /* The current child process isn't the actual multi-threaded</font>
<font color="#009900">+- program yet, so don't try to do any special thread-specific</font>
<font color="#009900">+- post-processing and bail out early. */</font>
<font color="#009900">+- return ptid;</font>
<font color="#009900">+-</font>
<font color="#009900">+ if (ourstatus->kind == TARGET_WAITKIND_EXITED</font>
<font color="#009900">+ || ourstatus->kind == TARGET_WAITKIND_SIGNALLED)</font>
<font color="#009900">+ return pid_to_ptid (-1);</font>
<font color="#009900">+@@ -889,23 +880,32 @@</font>
<font color="#009900">+ return pid_to_ptid (GET_PID (ptid));</font>
<font color="#009900">+ }</font>
<font color="#009900">+ </font>
<font color="#009900">++ /* If we do not know about the main thread yet, this would be a good time to</font>
<font color="#009900">++ find it. */</font>
<font color="#009900">++ if (ourstatus->kind == TARGET_WAITKIND_STOPPED && !have_threads ())</font>
<font color="#009900">++ thread_db_find_new_threads ();</font>
<font color="#009900">++</font>
<font color="#009900">+ if (ourstatus->kind == TARGET_WAITKIND_STOPPED</font>
<font color="#009900">+ && ourstatus->value.sig == TARGET_SIGNAL_TRAP)</font>
<font color="#009900">+ /* Check for a thread event. */</font>
<font color="#009900">+ check_event (ptid);</font>
<font color="#009900">+ </font>
<font color="#009900">+- if (!ptid_equal (trap_ptid, null_ptid))</font>
<font color="#009900">+- trap_ptid = thread_from_lwp (trap_ptid);</font>
<font color="#009900">++ if (have_threads ())</font>
<font color="#009900">++ {</font>
<font color="#009900">++ /* Change ptids back into the higher level PID + TID format. If</font>
<font color="#009900">++         the thread is dead and no longer on the thread list, we will</font>
<font color="#009900">++         get back a dead ptid. This can occur if the thread death</font>
<font color="#009900">++         event gets postponed by other simultaneous events. In such a</font>
<font color="#009900">++         case, we want to just ignore the event and continue on. */</font>
<font color="#009900">++</font>
<font color="#009900">++ if (!ptid_equal (trap_ptid, null_ptid))</font>
<font color="#009900">++        trap_ptid = thread_from_lwp (trap_ptid);</font>
<font color="#009900">++</font>
<font color="#009900">++ ptid = thread_from_lwp (ptid);</font>
<font color="#009900">++ if (GET_PID (ptid) == -1)</font>
<font color="#009900">++        ourstatus->kind = TARGET_WAITKIND_SPURIOUS;</font>
<font color="#009900">++ }</font>
<font color="#009900">+ </font>
<font color="#009900">+- /* Change the ptid back into the higher level PID + TID format.</font>
<font color="#009900">+- If the thread is dead and no longer on the thread list, we will </font>
<font color="#009900">+- get back a dead ptid. This can occur if the thread death event</font>
<font color="#009900">+- gets postponed by other simultaneous events. In such a case, </font>
<font color="#009900">+- we want to just ignore the event and continue on. */</font>
<font color="#009900">+- ptid = thread_from_lwp (ptid);</font>
<font color="#009900">+- if (GET_PID (ptid) == -1)</font>
<font color="#009900">+- ourstatus->kind = TARGET_WAITKIND_SPURIOUS;</font>
<font color="#009900">+- </font>
<font color="#009900">+ return ptid;</font>
<font color="#009900">+ }</font>
<font color="#009900">+ </font>
<font color="#009900">+@@ -944,30 +944,6 @@</font>
<font color="#009900">+ }</font>
<font color="#009900">+ </font>
<font color="#009900">+ static void</font>
<font color="#009900">+-thread_db_create_inferior (char *exec_file, char *allargs, char **env,</font>
<font color="#009900">+-                         int from_tty)</font>
<font color="#009900">+-{</font>
<font color="#009900">+- unpush_target (&thread_db_ops);</font>
<font color="#009900">+- using_thread_db = 0;</font>
<font color="#009900">+- target_beneath->to_create_inferior (exec_file, allargs, env, from_tty);</font>
<font color="#009900">+-}</font>
<font color="#009900">+-</font>
<font color="#009900">+-static void</font>
<font color="#009900">+-thread_db_post_startup_inferior (ptid_t ptid)</font>
<font color="#009900">+-{</font>
<font color="#009900">+- if (proc_handle.pid == 0)</font>
<font color="#009900">+- {</font>
<font color="#009900">+- /* The child process is now the actual multi-threaded</font>
<font color="#009900">+- program. Snatch its process ID... */</font>
<font color="#009900">+- proc_handle.pid = GET_PID (ptid);</font>
<font color="#009900">+-</font>
<font color="#009900">+- /* ...and perform the remaining initialization steps. */</font>
<font color="#009900">+- enable_thread_event_reporting ();</font>
<font color="#009900">+- thread_db_find_new_threads ();</font>
<font color="#009900">+- }</font>
<font color="#009900">+-}</font>
<font color="#009900">+-</font>
<font color="#009900">+-static void</font>
<font color="#009900">+ thread_db_mourn_inferior (void)</font>
<font color="#009900">+ {</font>
<font color="#009900">+ /* Forget about the child's process ID. We shouldn't need it</font>
<font color="#009900">+@@ -1002,6 +978,22 @@</font>
<font color="#009900">+ </font>
<font color="#009900">+ ptid = ptid_build (GET_PID (inferior_ptid), ti.ti_lid, ti.ti_tid);</font>
<font color="#009900">+ </font>
<font color="#009900">++ if (ti.ti_tid == 0)</font>
<font color="#009900">++ {</font>
<font color="#009900">++ /* A thread ID of zero means that this is the main thread, but</font>
<font color="#009900">++         glibc has not yet initialized thread-local storage and the</font>
<font color="#009900">++         pthread library. We do not know what the thread's TID will</font>
<font color="#009900">++         be yet. Just enable event reporting and otherwise ignore</font>
<font color="#009900">++         it. */</font>
<font color="#009900">++</font>
<font color="#009900">++ err = td_thr_event_enable_p (th_p, 1);</font>
<font color="#009900">++ if (err != TD_OK)</font>
<font color="#009900">++        error (_("Cannot enable thread event reporting for %s: %s"),</font>
<font color="#009900">++         target_pid_to_str (ptid), thread_db_err_str (err));</font>
<font color="#009900">++</font>
<font color="#009900">++ return 0;</font>
<font color="#009900">++ }</font>
<font color="#009900">++</font>
<font color="#009900">+ if (!in_thread_list (ptid))</font>
<font color="#009900">+ attach_thread (ptid, th_p, &ti, 1);</font>
<font color="#009900">+ </font>
<font color="#009900">+@@ -1058,6 +1050,16 @@</font>
<font color="#009900">+ return NULL;</font>
<font color="#009900">+ }</font>
<font color="#009900">+ </font>
<font color="#009900">++/* Return 1 if this thread has the same LWP as the passed PTID. */</font>
<font color="#009900">++</font>
<font color="#009900">++static int</font>
<font color="#009900">++same_ptid_callback (struct thread_info *thread, void *arg)</font>
<font color="#009900">++{</font>
<font color="#009900">++ ptid_t *ptid_p = arg;</font>
<font color="#009900">++</font>
<font color="#009900">++ return GET_LWP (thread->ptid) == GET_LWP (*ptid_p);</font>
<font color="#009900">++}</font>
<font color="#009900">++</font>
<font color="#009900">+ /* Get the address of the thread local variable in load module LM which</font>
<font color="#009900">+ is stored at OFFSET within the thread local storage for thread PTID. */</font>
<font color="#009900">+ </font>
<font color="#009900">+@@ -1066,6 +1068,21 @@</font>
<font color="#009900">+                                  CORE_ADDR lm,</font>
<font color="#009900">+                                  CORE_ADDR offset)</font>
<font color="#009900">+ {</font>
<font color="#009900">++ /* If we have not discovered any threads yet, check now. */</font>
<font color="#009900">++ if (!is_thread (ptid) && !have_threads ())</font>
<font color="#009900">++ thread_db_find_new_threads ();</font>
<font color="#009900">++</font>
<font color="#009900">++ /* Try to find a matching thread if we still have the LWP ID instead</font>
<font color="#009900">++ of the thread ID. */</font>
<font color="#009900">++ if (!is_thread (ptid))</font>
<font color="#009900">++ {</font>
<font color="#009900">++ struct thread_info *thread;</font>
<font color="#009900">++</font>
<font color="#009900">++ thread = iterate_over_threads (same_ptid_callback, &ptid);</font>
<font color="#009900">++ if (thread != NULL)</font>
<font color="#009900">++        ptid = thread->ptid;</font>
<font color="#009900">++ }</font>
<font color="#009900">++</font>
<font color="#009900">+ if (is_thread (ptid))</font>
<font color="#009900">+ {</font>
<font color="#009900">+ td_err_e err;</font>
<font color="#009900">+@@ -1125,14 +1142,11 @@</font>
<font color="#009900">+ thread_db_ops.to_shortname = "multi-thread";</font>
<font color="#009900">+ thread_db_ops.to_longname = "multi-threaded child process.";</font>
<font color="#009900">+ thread_db_ops.to_doc = "Threads and pthreads support.";</font>
<font color="#009900">+- thread_db_ops.to_attach = thread_db_attach;</font>
<font color="#009900">+ thread_db_ops.to_detach = thread_db_detach;</font>
<font color="#009900">+ thread_db_ops.to_resume = thread_db_resume;</font>
<font color="#009900">+ thread_db_ops.to_wait = thread_db_wait;</font>
<font color="#009900">+ thread_db_ops.to_xfer_partial = thread_db_xfer_partial;</font>
<font color="#009900">+ thread_db_ops.to_kill = thread_db_kill;</font>
<font color="#009900">+- thread_db_ops.to_create_inferior = thread_db_create_inferior;</font>
<font color="#009900">+- thread_db_ops.to_post_startup_inferior = thread_db_post_startup_inferior;</font>
<font color="#009900">+ thread_db_ops.to_mourn_inferior = thread_db_mourn_inferior;</font>
<font color="#009900">+ thread_db_ops.to_find_new_threads = thread_db_find_new_threads;</font>
<font color="#009900">+ thread_db_ops.to_pid_to_str = thread_db_pid_to_str;</font>
<font color="#009900">+Index: gdb/gdbserver/thread-db.c</font>
<font color="#009900">+===================================================================</font>
<font color="#009900">+--- gdb/gdbserver/thread-db.c.orig        2006-10-17 18:02:27.000000000 +0200</font>
<font color="#009900">++++ gdb/gdbserver/thread-db.c        2008-03-01 14:44:41.000000000 +0100</font>
<font color="#009900">+@@ -40,6 +40,7 @@</font>
<font color="#009900">+ /* Connection to the libthread_db library. */</font>
<font color="#009900">+ static td_thragent_t *thread_agent;</font>
<font color="#009900">+ </font>
<font color="#009900">++static void thread_db_find_new_threads (void);</font>
<font color="#009900">+ static int find_new_threads_callback (const td_thrhandle_t *th_p, void *data);</font>
<font color="#009900">+ </font>
<font color="#009900">+ static char *</font>
<font color="#009900">+@@ -134,6 +135,8 @@</font>
<font color="#009900">+ td_event_msg_t msg;</font>
<font color="#009900">+ td_err_e err;</font>
<font color="#009900">+ struct inferior_linux_data *tdata;</font>
<font color="#009900">++ struct thread_info *inferior;</font>
<font color="#009900">++ struct process_info *process;</font>
<font color="#009900">+ </font>
<font color="#009900">+ if (debug_threads)</font>
<font color="#009900">+ fprintf (stderr, "Thread creation event.\n");</font>
<font color="#009900">+@@ -149,6 +152,14 @@</font>
<font color="#009900">+ fprintf (stderr, "thread getmsg err: %s\n",</font>
<font color="#009900">+          thread_db_err_str (err));</font>
<font color="#009900">+ </font>
<font color="#009900">++ /* If we do not know about the main thread yet, this would be a good time to</font>
<font color="#009900">++ find it. We need to do this to pick up the main thread before any newly</font>
<font color="#009900">++ created threads. */</font>
<font color="#009900">++ inferior = (struct thread_info *) all_threads.head;</font>
<font color="#009900">++ process = get_thread_process (inferior);</font>
<font color="#009900">++ if (process->thread_known == 0)</font>
<font color="#009900">++ thread_db_find_new_threads ();</font>
<font color="#009900">++</font>
<font color="#009900">+ /* msg.event == TD_EVENT_CREATE */</font>
<font color="#009900">+ </font>
<font color="#009900">+ find_new_threads_callback (msg.th_p, NULL);</font>
<font color="#009900">+@@ -231,8 +242,24 @@</font>
<font color="#009900">+ {</font>
<font color="#009900">+ inferior = (struct thread_info *) all_threads.head;</font>
<font color="#009900">+ process = get_thread_process (inferior);</font>
<font color="#009900">++</font>
<font color="#009900">+ if (process->thread_known == 0)</font>
<font color="#009900">+         {</font>
<font color="#009900">++         /* If the new thread ID is zero, a final thread ID will be</font>
<font color="#009900">++         available later. Do not enable thread debugging yet. */</font>
<font color="#009900">++         if (ti_p->ti_tid == 0)</font>
<font color="#009900">++         {</font>
<font color="#009900">++         err = td_thr_event_enable (th_p, 1);</font>
<font color="#009900">++         if (err != TD_OK)</font>
<font color="#009900">++                error ("Cannot enable thread event reporting for %d: %s",</font>
<font color="#009900">++                 ti_p->ti_lid, thread_db_err_str (err));</font>
<font color="#009900">++         return;</font>
<font color="#009900">++         }</font>
<font color="#009900">++</font>
<font color="#009900">++         if (process->lwpid != ti_p->ti_lid)</font>
<font color="#009900">++         fatal ("PID mismatch! Expected %ld, got %ld",</font>
<font color="#009900">++                 (long) process->lwpid, (long) ti_p->ti_lid);</font>
<font color="#009900">++</font>
<font color="#009900">+          /* Switch to indexing the threads list by TID. */</font>
<font color="#009900">+          change_inferior_id (&all_threads, ti_p->ti_tid);</font>
<font color="#009900">+          goto found;</font>
<font color="#009900">+@@ -331,6 +358,8 @@</font>
<font color="#009900">+ </font>
<font color="#009900">+ process = get_thread_process (thread);</font>
<font color="#009900">+ if (!process->thread_known)</font>
<font color="#009900">++ thread_db_find_new_threads ();</font>
<font color="#009900">++ if (!process->thread_known)</font>
<font color="#009900">+ return TD_NOTHR;</font>
<font color="#009900">+ </font>
<font color="#009900">+ err = td_thr_tls_get_addr (&process->th, (psaddr_t) load_module, offset,</font>
============================================================
<font color="#FF6600">--- packages/gdb/gdb-cross-sdk_6.8.bb        9444a910f04467593c5c669381d5ed60212c8324</font>
<font color="#009900">+++ packages/gdb/gdb-cross-sdk_6.8.bb        9444a910f04467593c5c669381d5ed60212c8324</font>
<font color="#0000FF">@@ -0,0 +1,7 @@</font>
<font color="#009900">+require gdb-cross.inc</font>
<font color="#009900">+</font>
<font color="#009900">+inherit sdk</font>
<font color="#009900">+</font>
<font color="#009900">+do_stage() {</font>
<font color="#009900">+        :</font>
<font color="#009900">+}</font>
============================================================
<font color="#FF6600">--- packages/gdb/gdb-cross_6.8.bb        0ea423cc4dde24b7f31c9c213c5c9016bcee6ed5</font>
<font color="#009900">+++ packages/gdb/gdb-cross_6.8.bb        0ea423cc4dde24b7f31c9c213c5c9016bcee6ed5</font>
<font color="#0000FF">@@ -0,0 +1,8 @@</font>
<font color="#009900">+require gdb-cross.inc</font>
<font color="#009900">+</font>
<font color="#009900">+SRC_URI += "file://sim-install-6.6.patch;patch=1"</font>
<font color="#009900">+SRC_URI += "file://early_debug_in_nptl.patch;patch=1;pnum=0"</font>
<font color="#009900">+</font>
<font color="#009900">+inherit cross</font>
<font color="#009900">+</font>
<font color="#009900">+PR = "r1"</font>
============================================================
<font color="#FF6600">--- packages/gdb/gdb_6.8.bb        46a7734cc95c48722b3546e977c35ed0591233c9</font>
<font color="#009900">+++ packages/gdb/gdb_6.8.bb        46a7734cc95c48722b3546e977c35ed0591233c9</font>
<font color="#0000FF">@@ -0,0 +1,3 @@</font>
<font color="#009900">+require gdb.inc</font>
<font color="#009900">+</font>
<font color="#009900">+PR = "r1"</font>
</tt></pre>