<!-- 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-&gt;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 &amp; 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-&gt;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-&gt;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-&gt;kind == TARGET_WAITKIND_EXITED</font>
<font color="#009900">+     || ourstatus-&gt;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-&gt;kind == TARGET_WAITKIND_STOPPED &amp;&amp; !have_threads ())</font>
<font color="#009900">++    thread_db_find_new_threads ();</font>
<font color="#009900">++</font>
<font color="#009900">+   if (ourstatus-&gt;kind == TARGET_WAITKIND_STOPPED</font>
<font color="#009900">+       &amp;&amp; ourstatus-&gt;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-&gt;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-&gt;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 (&amp;thread_db_ops);</font>
<font color="#009900">+-  using_thread_db = 0;</font>
<font color="#009900">+-  target_beneath-&gt;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, &amp;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-&gt;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) &amp;&amp; !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, &amp;ptid);</font>
<font color="#009900">++      if (thread != NULL)</font>
<font color="#009900">++        ptid = thread-&gt;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-&gt;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-&gt;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-&gt;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-&gt;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-&gt;lwpid != ti_p-&gt;ti_lid)</font>
<font color="#009900">++            fatal ("PID mismatch!  Expected %ld, got %ld",</font>
<font color="#009900">++                   (long) process-&gt;lwpid, (long) ti_p-&gt;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 (&amp;all_threads, ti_p-&gt;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-&gt;thread_known)</font>
<font color="#009900">++    thread_db_find_new_threads ();</font>
<font color="#009900">++  if (!process-&gt;thread_known)</font>
<font color="#009900">+     return TD_NOTHR;</font>
<font color="#009900">+ </font>
<font color="#009900">+   err = td_thr_tls_get_addr (&amp;process-&gt;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>