rpms/gdb/devel gdb-6.8-bz254229-gcore-prpsinfo.patch, NONE, 1.1 gdb-6.8-bz436037-reg-no-longer-active.patch, NONE, 1.1 gdb-6.8-upstream.patch, 1.6, 1.7 gdb.spec, 1.298, 1.299
Jan Kratochvil (jkratoch)
fedora-extras-commits at redhat.com
Fri Aug 1 06:37:13 UTC 2008
- Previous message (by thread): rpms/kernel/devel drm-modesetting-radeon.patch, NONE, 1.1 kernel.spec, 1.828, 1.829
- Next message (by thread): rpms/gdb/F-9 gdb-6.8-bz436037-reg-no-longer-active.patch, NONE, 1.1 gdb-6.8-upstream.patch, 1.5, 1.6 gdb.spec, 1.289, 1.290
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Author: jkratoch
Update of /cvs/pkgs/rpms/gdb/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv24239
Modified Files:
gdb-6.8-upstream.patch gdb.spec
Added Files:
gdb-6.8-bz254229-gcore-prpsinfo.patch
gdb-6.8-bz436037-reg-no-longer-active.patch
Log Message:
* Fri Aug 1 2008 Jan Kratochvil <jan.kratochvil at redhat.com> - 6.8-18
- Fix powerpc recent secure PLTs handling (shared library calls) (BZ 452960).
- Fix the testsuite .spec runner to run biarch also on ppc.
- Reenable testcases threadcrash.exp, chng-syms.exp, checkpoint.exp (BZ 207002).
- Fix PRPSINFO in the core files dumped by gcore (BZ 254229), reformatted patch
from Denys Vlasenko.
- Fix register assignments with no GDB stack frames, Denys Vlasenko (BZ 436037).
gdb-6.8-bz254229-gcore-prpsinfo.patch:
--- NEW FILE gdb-6.8-bz254229-gcore-prpsinfo.patch ---
diff -d -urpN gdb-6.8.4/bfd/elf-bfd.h gdb-6.8.7/bfd/elf-bfd.h
--- gdb-6.8.4/bfd/elf-bfd.h 2008-07-25 16:16:15.000000000 +0200
+++ gdb-6.8.7/bfd/elf-bfd.h 2008-07-29 12:29:20.000000000 +0200
@@ -2125,7 +2125,7 @@ extern Elf_Internal_Phdr * _bfd_elf_find
extern char *elfcore_write_note
(bfd *, char *, int *, const char *, int, const void *, int);
extern char *elfcore_write_prpsinfo
- (bfd *, char *, int *, const char *, const char *);
+ (bfd *, char *, int *, void *, const char *, const char *);
extern char *elfcore_write_prstatus
(bfd *, char *, int *, long, int, const void *);
extern char * elfcore_write_pstatus
diff -d -urpN gdb-6.8.4/bfd/elf.c gdb-6.8.7/bfd/elf.c
--- gdb-6.8.4/bfd/elf.c 2008-07-25 16:16:15.000000000 +0200
+++ gdb-6.8.7/bfd/elf.c 2008-07-29 12:45:52.000000000 +0200
@@ -8256,6 +8256,7 @@ char *
elfcore_write_prpsinfo (bfd *abfd,
char *buf,
int *bufsiz,
+ void *info,
const char *fname,
const char *psargs)
{
@@ -8282,9 +8283,15 @@ elfcore_write_prpsinfo (bfd *abfd,
int note_type = NT_PRPSINFO;
#endif
- memset (&data, 0, sizeof (data));
- strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
- strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
+ if (info)
+ memcpy (&data, info, sizeof (data));
+ else
+ {
+ memset (&data, 0, sizeof (data));
+ strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
+ strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
+ }
+
return elfcore_write_note (abfd, buf, bufsiz,
note_name, note_type, &data, sizeof (data));
}
@@ -8299,9 +8306,15 @@ elfcore_write_prpsinfo (bfd *abfd,
int note_type = NT_PRPSINFO;
#endif
- memset (&data, 0, sizeof (data));
- strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
- strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
+ if (info)
+ memcpy (&data, info, sizeof (data));
+ else
+ {
+ memset (&data, 0, sizeof (data));
+ strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
+ strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
+ }
+
return elfcore_write_note (abfd, buf, bufsiz,
note_name, note_type, &data, sizeof (data));
}
diff -d -urpN gdb-6.8.4/gdb/amd64-linux-nat.c gdb-6.8.7/gdb/amd64-linux-nat.c
--- gdb-6.8.4/gdb/amd64-linux-nat.c 2008-07-25 16:16:15.000000000 +0200
+++ gdb-6.8.7/gdb/amd64-linux-nat.c 2008-07-29 12:46:02.000000000 +0200
@@ -139,6 +139,7 @@ static int amd64_linux_gregset32_reg_off
static char *
amd64_linux_elfcore_write_prpsinfo (bfd *abfd, char *buf, int *bufsiz,
+ void *info,
const char *fname, const char *psargs)
{
if (gdbarch_ptr_bit(current_gdbarch) == 32)
@@ -148,14 +149,20 @@ amd64_linux_elfcore_write_prpsinfo (bfd
struct elf_prpsinfo32 data;
note_type = NT_PRPSINFO;
- memset (&data, 0, sizeof (data));
- strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
- strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
+ if (info)
+ memcpy (&data, info, sizeof (data));
+ else
+ {
+ memset (&data, 0, sizeof (data));
+ strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
+ strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
+ }
+
return elfcore_write_note (abfd, buf, bufsiz,
note_name, note_type, &data, sizeof (data));
}
else
- return elfcore_write_prpsinfo (abfd, buf, bufsiz, fname, psargs);
+ return elfcore_write_prpsinfo (abfd, buf, bufsiz, info, fname, psargs);
}
static void
diff -d -urpN gdb-6.8.4/gdb/fbsd-nat.c gdb-6.8.7/gdb/fbsd-nat.c
--- gdb-6.8.4/gdb/fbsd-nat.c 2008-07-25 16:16:15.000000000 +0200
+++ gdb-6.8.7/gdb/fbsd-nat.c 2008-07-29 12:29:20.000000000 +0200
@@ -184,6 +184,7 @@ fbsd_make_corefile_notes (bfd *obfd, int
psargs = reconcat (psargs, psargs, " ", get_inferior_args (), NULL);
note_data = elfcore_write_prpsinfo (obfd, note_data, note_size,
+ NULL,
fname, psargs);
}
diff -d -urpN gdb-6.8.4/gdb/linux-nat.c gdb-6.8.7/gdb/linux-nat.c
--- gdb-6.8.4/gdb/linux-nat.c 2008-07-25 16:16:15.000000000 +0200
+++ gdb-6.8.7/gdb/linux-nat.c 2008-07-29 13:50:52.000000000 +0200
@@ -47,6 +47,7 @@
#include "gdbthread.h" /* for struct thread_info etc. */
#include "gdb_stat.h" /* for struct stat */
#include <fcntl.h> /* for O_RDONLY */
+#include "gdb_procfs32.h" /* for struct elf_prpsinfo32 */
#ifndef O_LARGEFILE
#define O_LARGEFILE 0
@@ -108,7 +109,7 @@ static LONGEST (*super_xfer_partial) (st
/* This functions make elfcore note sections.
They may get overriden by code adjusting data for multi-target builds. */
char *(*linux_elfcore_write_prpsinfo)
- (bfd *, char *, int *, const char *, const char *) = elfcore_write_prpsinfo;
+ (bfd *, char *, int *, void *, const char *, const char *) = elfcore_write_prpsinfo;
char *(*linux_elfcore_write_prstatus)
(bfd *, char *, int *, long, int, const void *) = elfcore_write_prstatus;
static char *
@@ -2812,6 +2813,159 @@ linux_nat_do_registers (bfd *obfd, ptid_
note_data, note_size);
}
+/* Should be always true for Linux */
+#define HAVE_PRPSINFO_T 1
+
+#if defined (HAVE_PRPSINFO_T)
+
+/* Fills struct elf_prpsinfo{32,64} as much as possible, imitate Linux kernel
+ binfmt_elf.c. Unknown values are filled with zeroes. The structure is
+ malloced. */
+
+static void*
+fill_prpsinfo (void)
+{
+ struct stat sb;
+ char filename[sizeof ("/proc//cmdline") + sizeof (int) * 3 + 2];
+ char buf[1024];
+ char proc_state[5];
+ char proc_cmdline[sizeof (((struct elf_prpsinfo*)0)->pr_psargs) + 1];
+ unsigned flags;
+ long proc_nice;
+ unsigned proc_ppid;
+ unsigned proc_pgid;
+ unsigned proc_sid;
+ pid_t pid;
+ int fd, n;
+ char *cp, *proc_comm, *state_s;
+ /* String comes from Linux kernel binfmt_elf.c FILL_PSINFO but it is already
+ obsolete there to <linux/sched.h> TASK_* constants. */
+ const char state_string[] = "RSDTZW";
+ int state_num;
+
+ /* Get /proc/$PID/stat. */
+ pid = ptid_get_pid (inferior_ptid);
+ sprintf (filename, "/proc/%u/stat", (unsigned)pid);
+ fd = open (filename, O_RDONLY);
+ if (fd < 0)
+ return NULL;
+ fstat (fd, &sb); /* No error checking (can it ever happen?). */
+ n = read (fd, buf, sizeof (buf) - 1);
+ close (fd);
+ if (n < 0)
+ return NULL;
+ buf[n] = 0;
+
+ cp = strrchr (buf, ')'); /* Split into "PID (COMM" and "<rest>". */
+ if (!cp)
+ return NULL;
+ *cp = 0;
+
+ /* Grab COMM. */
+ proc_comm = strchr (buf, '(');
+ if (!proc_comm)
+ return NULL;
+ proc_comm++;
+
+ /* Read /proc/$PID/cmdline. */
+ proc_cmdline[0] = 0;
+ strcpy (strrchr (filename, '/'), "/cmdline");
+ fd = open (filename, O_RDONLY);
+ if (fd >= 0)
+ {
+ int n;
+
+ n = read (fd, proc_cmdline, sizeof (proc_cmdline) - 1);
+ if (n < 0)
+ n = 0;
+ proc_cmdline[n] = 0;
+ while (n--) /* Replace NULs with spaces. */
+ if (proc_cmdline[n] == 0)
+ proc_cmdline[n] = ' ';
+ close (fd);
+ }
+
+ /* Parse /proc/$PID/stat. */
+ n = sscanf (cp + 2, /* skip ") " */
+ "%4s %u " /* state, ppid */
+ "%u %u %*s %*s " /* pgid, sid, tty, tpgid */
+ "%u %*s %*s %*s " /* flags, min_flt, cmin_flt, maj_flt */
+ "%*s " /* cmaj_flt */
+ "%*s %*s " /* utime, stime */
+ "%*s %*s %*s " /* cutime, cstime, priority */
+ "%ld " /* nice */
+ /*"%*s %*s " timeout, it_real_value */
+ /*"%lu " start_time */
+ /*"%lu " vsize */
+ /*"%lu " rss */
+ /*"%lu %lu %lu " rss_rlim, start_code, end_code */
+ /*"%lu %lu %lu " start_stack, kstk_esp, kstk_eip */
+ /*"%u %u %u %u " signal, blocked, sigignore, sigcatch */
+ /*"%lu %lu %lu" wchan, nswap, cnswap */
+ , proc_state, &proc_ppid,
+ &proc_pgid, &proc_sid,
+ &flags,
+ &proc_nice);
+ if (n != 6)
+ return NULL;
+
+ state_s = strchr (state_string, proc_state[0]);
+ if (state_s != NULL)
+ state_num = state_s - state_string;
+ else
+ {
+ /* 0 means Running, some more unusal state would be better. */
+ state_num = 0;
+ }
+
+#if ULONG_MAX > 0xffffffffU
+ /* We skip this code on 32-bit gdb. */
+ if (gdbarch_ptr_bit (current_gdbarch) == 64)
+ {
+ struct elf_prpsinfo *info = xzalloc (sizeof (*info));
+
+ info->pr_state = state_num;
+ info->pr_sname = proc_state[0];
+ info->pr_zomb = (proc_state[0] == 'Z');
+ info->pr_nice = proc_nice;
+ info->pr_flag = flags;
+ info->pr_uid = sb.st_uid;
+ info->pr_gid = sb.st_gid;
+ info->pr_pid = pid;
+ info->pr_ppid = proc_ppid;
+ info->pr_pgrp = proc_pgid;
+ info->pr_sid = proc_sid;
+ strncpy (info->pr_fname, proc_comm, sizeof (info->pr_fname));
+ strncpy (info->pr_psargs, proc_cmdline, sizeof (info->pr_psargs));
+
+ return info;
+ }
+#endif
+ if (gdbarch_ptr_bit (current_gdbarch) == 32)
+ {
+ struct elf_prpsinfo32 *info = xzalloc (sizeof (*info));
+
+ info->pr_state = state_num;
+ info->pr_sname = proc_state[0];
+ info->pr_zomb = (proc_state[0] == 'Z');
+ info->pr_nice = proc_nice;
+ info->pr_flag = flags;
+ info->pr_uid = sb.st_uid;
+ info->pr_gid = sb.st_gid;
+ info->pr_pid = pid;
+ info->pr_ppid = proc_ppid;
+ info->pr_pgrp = proc_pgid;
+ info->pr_sid = proc_sid;
+ strncpy (info->pr_fname, proc_comm, sizeof (info->pr_fname));
+ strncpy (info->pr_psargs, proc_cmdline, sizeof (info->pr_psargs));
+
+ return info;
+ }
+
+ return NULL;
+}
+#endif
+
/* Fills the "to_make_corefile_note" target vector. Builds the note
section for a corefile, and returns it in a malloc buffer. */
@@ -2831,8 +2985,14 @@ linux_nat_make_corefile_notes (bfd *obfd
if (get_exec_file (0))
{
+#if defined (HAVE_PRPSINFO_T)
+ void *data = fill_prpsinfo ();
+#define DATAPTR data
+#else
+#define DATAPTR NULL
strncpy (fname, strrchr (get_exec_file (0), '/') + 1, sizeof (fname));
strncpy (psargs, get_exec_file (0), sizeof (psargs));
+#endif
if (get_inferior_args ())
{
char *string_end;
@@ -2848,9 +3008,15 @@ linux_nat_make_corefile_notes (bfd *obfd
psargs_end - string_end);
}
}
- note_data = (char *) linux_elfcore_write_prpsinfo (obfd, note_data,
- note_size, fname,
+ note_data = (char *) linux_elfcore_write_prpsinfo (obfd,
+ note_data, note_size,
+ DATAPTR,
+ fname,
psargs);
+#if defined (HAVE_PRPSINFO_T)
+ xfree (DATAPTR);
+#endif
+#undef DATAPTR
}
/* Dump information for threads. */
diff -d -urpN gdb-6.8.4/gdb/linux-nat.h gdb-6.8.7/gdb/linux-nat.h
--- gdb-6.8.4/gdb/linux-nat.h 2008-07-25 16:16:15.000000000 +0200
+++ gdb-6.8.7/gdb/linux-nat.h 2008-07-29 12:29:20.000000000 +0200
@@ -133,7 +133,7 @@ struct siginfo *linux_nat_get_siginfo (p
/* These functions make elfcore note sections.
They may get overriden by code adjusting data for multi-target builds. */
extern char *(*linux_elfcore_write_prpsinfo)
- (bfd *, char *, int *, const char *, const char *);
+ (bfd *, char *, int *, void *, const char *, const char *);
extern char *(*linux_elfcore_write_prstatus)
(bfd *, char *, int *, long, int, const void *);
extern char *(*linux_elfcore_write_prfpreg)
diff -d -urpN gdb-6.8.4/gdb/procfs.c gdb-6.8.7/gdb/procfs.c
--- gdb-6.8.4/gdb/procfs.c 2008-07-25 16:16:15.000000000 +0200
+++ gdb-6.8.7/gdb/procfs.c 2008-07-29 12:29:20.000000000 +0200
@@ -6118,6 +6118,7 @@ procfs_make_note_section (bfd *obfd, int
note_data = (char *) elfcore_write_prpsinfo (obfd,
note_data,
note_size,
+ NULL,
fname,
psargs);
gdb-6.8-bz436037-reg-no-longer-active.patch:
--- NEW FILE gdb-6.8-bz436037-reg-no-longer-active.patch ---
diff -d -urpN src.0/gdb/valops.c src.1/gdb/valops.c
--- src.0/gdb/valops.c 2008-07-27 04:00:03.000000000 +0200
+++ src.1/gdb/valops.c 2008-07-31 15:17:42.000000000 +0200
@@ -813,10 +813,18 @@ value_assign (struct value *toval, struc
struct frame_info *frame;
int value_reg;
- /* Figure out which frame this is in currently. */
- frame = frame_find_by_id (VALUE_FRAME_ID (toval));
value_reg = VALUE_REGNUM (toval);
+ /* Figure out which frame this is in currently. */
+ frame = frame_find_by_id (VALUE_FRAME_ID (toval));
+ /* "set $reg+=1" should work on programs with no debug info,
+ but frame_find_by_id returns NULL here (RH bug 436037).
+ Use current frame, it represents CPU state in this case.
+ If frame_find_by_id is changed to do it internally
+ (it is contemplated there), remove this. */
+ if (!frame)
+ frame = get_current_frame ();
+ /* Probably never happens. */
if (!frame)
error (_("Value being assigned to is no longer active."));
gdb-6.8-upstream.patch:
Index: gdb-6.8-upstream.patch
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/devel/gdb-6.8-upstream.patch,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- gdb-6.8-upstream.patch 14 Jul 2008 09:09:04 -0000 1.6
+++ gdb-6.8-upstream.patch 1 Aug 2008 06:36:43 -0000 1.7
@@ -971,3 +971,710 @@
# Start with a fresh gdb
+
+
+
+https://bugzilla.redhat.com/show_bug.cgi?id=452960
+
+bfd/
+2008-05-14 Ulrich Weigand <uweigand at de.ibm.com>
+
+ * elf32-ppc.c (ppc_elf_get_synthetic_symtab): Fix memset calls.
+ * elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Likewise.
+
+bfd/
+2008-05-14 Ulrich Weigand <uweigand at de.ibm.com>
+ Alan Modra <amodra at bigpond.net.au>
+
+ * elf32-ppc.c (section_covers_vma): New function.
+ (ppc_elf_get_synthetic_symtab): New function.
+ (bfd_elf32_get_synthetic_symtab): Define.
+ * elf64-ppc.c (section_covers_vma): New function.
+ (ppc64_elf_get_synthetic_symtab): Generate sym at plt on glink branch
+ table entries, and __glink_PLTresolve on resolver stub.
+ (ppc64_elf_build_stubs): Rename __glink sym to __glink_PLTresolve.
+
+gdb/
+2008-05-14 Ulrich Weigand <uweigand at de.ibm.com>
+
+ * ppc-linux-tdep.c (ppc_linux_convert_from_func_ptr_addr): Rename ...
+ (ppc64_linux_convert_from_func_ptr_addr): ... to this. No longer try
+ to handle ppc32 PLT entries.
+ (ppc_linux_init_abi): Install ppc64_linux_convert_from_func_ptr_addr
+ only on ppc64.
+
+gdb/
+2008-05-14 Daniel Jacobowitz <dan at codesourcery.com>
+
+ * elfread.c (elf_symtab_read): Create trampolines for @plt symbols.
+ * minsyms.c (lookup_minimal_symbol_by_pc_section_1): Renamed from
+ lookup_minimal_symbol_by_pc_section. Prefer trampolines if requested.
+ (lookup_minimal_symbol_by_pc_section): Use
+ lookup_minimal_symbol_by_pc_section_1.
+ (lookup_solib_trampoline_symbol_by_pc): Likewise.
+
+[ Backported for GDB-6.8f. ]
+
+--- ./bfd/elf32-ppc.c 2008-02-26 09:36:03.000000000 +0100
++++ ./bfd/elf32-ppc.c 2008-07-24 15:42:47.000000000 +0200
+@@ -2291,6 +2291,208 @@ ppc_elf_final_write_processing (bfd *abf
+ apuinfo_list_finish ();
+ }
+
++static bfd_boolean
++section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
++{
++ bfd_vma vma = *(bfd_vma *) ptr;
++ return ((section->flags & SEC_ALLOC) != 0
++ && section->vma <= vma
++ && vma < section->vma + section->size);
++}
++
++static long
++ppc_elf_get_synthetic_symtab (bfd *abfd, long symcount, asymbol **syms,
++ long dynsymcount, asymbol **dynsyms,
++ asymbol **ret)
++{
++ bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
++ asection *plt, *relplt, *dynamic, *glink;
++ bfd_vma glink_vma = 0;
++ bfd_vma resolv_vma = 0;
++ bfd_vma stub_vma;
++ asymbol *s;
++ arelent *p;
++ long count, i;
++ size_t size;
++ char *names;
++ bfd_byte buf[4];
++
++ *ret = NULL;
++
++ if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
++ return 0;
++
++ if (dynsymcount <= 0)
++ return 0;
++
++ relplt = bfd_get_section_by_name (abfd, ".rela.plt");
++ if (relplt == NULL)
++ return 0;
++
++ plt = bfd_get_section_by_name (abfd, ".plt");
++ if (plt == NULL)
++ return 0;
++
++ /* Call common code to handle old-style executable PLTs. */
++ if (elf_section_flags (plt) & SHF_EXECINSTR)
++ return _bfd_elf_get_synthetic_symtab (abfd, symcount, syms,
++ dynsymcount, dynsyms, ret);
++
++ /* If this object was prelinked, the prelinker stored the address
++ of .glink at got[1]. If it wasn't prelinked, got[1] will be zero. */
++ dynamic = bfd_get_section_by_name (abfd, ".dynamic");
++ if (dynamic != NULL)
++ {
++ bfd_byte *dynbuf, *extdyn, *extdynend;
++ size_t extdynsize;
++ void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
++
++ if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
++ return -1;
++
++ extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
++ swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
++
++ extdyn = dynbuf;
++ extdynend = extdyn + dynamic->size;
++ for (; extdyn < extdynend; extdyn += extdynsize)
++ {
++ Elf_Internal_Dyn dyn;
++ (*swap_dyn_in) (abfd, extdyn, &dyn);
++
++ if (dyn.d_tag == DT_NULL)
++ break;
++
++ if (dyn.d_tag == DT_PPC_GOT)
++ {
++ unsigned int g_o_t = dyn.d_un.d_val;
++ asection *got = bfd_get_section_by_name (abfd, ".got");
++ if (got != NULL
++ && bfd_get_section_contents (abfd, got, buf,
++ g_o_t - got->vma + 4, 4))
++ glink_vma = bfd_get_32 (abfd, buf);
++ break;
++ }
++ }
++ free (dynbuf);
++ }
++
++ /* Otherwise we read the first plt entry. */
++ if (glink_vma == 0)
++ {
++ if (bfd_get_section_contents (abfd, plt, buf, 0, 4))
++ glink_vma = bfd_get_32 (abfd, buf);
++ }
++
++ if (glink_vma == 0)
++ return 0;
++
++ /* The .glink section usually does not survive the final
++ link; search for the section (usually .text) where the
++ glink stubs now reside. */
++ glink = bfd_sections_find_if (abfd, section_covers_vma, &glink_vma);
++ if (glink == NULL)
++ return 0;
++
++ /* Determine glink PLT resolver by reading the relative branch
++ from the first glink stub. */
++ if (bfd_get_section_contents (abfd, glink, buf,
++ glink_vma - glink->vma, 4))
++ {
++ unsigned int insn = bfd_get_32 (abfd, buf);
++
++ /* The first glink stub may either branch to the resolver ... */
++ insn ^= B;
++ if ((insn & ~0x3fffffc) == 0)
++ resolv_vma = glink_vma + (insn ^ 0x2000000) - 0x2000000;
++
++ /* ... or fall through a bunch of NOPs. */
++ else if ((insn ^ B ^ NOP) == 0)
++ for (i = 4;
++ bfd_get_section_contents (abfd, glink, buf,
++ glink_vma - glink->vma + i, 4);
++ i += 4)
++ if (bfd_get_32 (abfd, buf) != NOP)
++ {
++ resolv_vma = glink_vma + i;
++ break;
++ }
++ }
++
++ slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
++ if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
++ return -1;
++
++ count = relplt->size / sizeof (Elf32_External_Rela);
++ stub_vma = glink_vma - (bfd_vma) count * 16;
++ size = count * sizeof (asymbol);
++ p = relplt->relocation;
++ for (i = 0; i < count; i++, p++)
++ size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
++
++ size += sizeof (asymbol) + sizeof ("__glink");
++
++ if (resolv_vma)
++ size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
++
++ s = *ret = bfd_malloc (size);
++ if (s == NULL)
++ return -1;
++
++ names = (char *) (s + count + 1 + (resolv_vma != 0));
++ p = relplt->relocation;
++ for (i = 0; i < count; i++, p++)
++ {
++ size_t len;
++
++ *s = **p->sym_ptr_ptr;
++ /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
++ we are defining a symbol, ensure one of them is set. */
++ if ((s->flags & BSF_LOCAL) == 0)
++ s->flags |= BSF_GLOBAL;
++ s->section = glink;
++ s->value = stub_vma - glink->vma;
++ s->name = names;
++ s->udata.p = NULL;
++ len = strlen ((*p->sym_ptr_ptr)->name);
++ memcpy (names, (*p->sym_ptr_ptr)->name, len);
++ names += len;
++ memcpy (names, "@plt", sizeof ("@plt"));
++ names += sizeof ("@plt");
++ ++s;
++ stub_vma += 16;
++ }
++
++ /* Add a symbol at the start of the glink branch table. */
++ memset (s, 0, sizeof *s);
++ s->the_bfd = abfd;
++ s->flags = BSF_GLOBAL;
++ s->section = glink;
++ s->value = glink_vma - glink->vma;
++ s->name = names;
++ memcpy (names, "__glink", sizeof ("__glink"));
++ names += sizeof ("__glink");
++ s++;
++ count++;
++
++ if (resolv_vma)
++ {
++ /* Add a symbol for the glink PLT resolver. */
++ memset (s, 0, sizeof *s);
++ s->the_bfd = abfd;
++ s->flags = BSF_GLOBAL;
++ s->section = glink;
++ s->value = resolv_vma - glink->vma;
++ s->name = names;
++ memcpy (names, "__glink_PLTresolve", sizeof ("__glink_PLTresolve"));
++ names += sizeof ("__glink_PLTresolve");
++ s++;
++ count++;
++ }
++
++ return count;
++}
++
+ /* The following functions are specific to the ELF linker, while
+ functions above are used generally. They appear in this file more
+ or less in the order in which they are called. eg.
+@@ -7733,6 +7935,7 @@ ppc_elf_finish_dynamic_sections (bfd *ou
+ #define bfd_elf32_bfd_reloc_name_lookup ppc_elf_reloc_name_lookup
+ #define bfd_elf32_bfd_set_private_flags ppc_elf_set_private_flags
+ #define bfd_elf32_bfd_link_hash_table_create ppc_elf_link_hash_table_create
++#define bfd_elf32_get_synthetic_symtab ppc_elf_get_synthetic_symtab
+
+ #define elf_backend_object_p ppc_elf_object_p
+ #define elf_backend_gc_mark_hook ppc_elf_gc_mark_hook
+@@ -7847,6 +8050,8 @@ ppc_elf_vxworks_final_write_processing (
+ #undef elf_backend_got_header_size
+ #define elf_backend_got_header_size 12
+
++#undef bfd_elf32_get_synthetic_symtab
++
+ #undef bfd_elf32_bfd_link_hash_table_create
+ #define bfd_elf32_bfd_link_hash_table_create \
+ ppc_elf_vxworks_link_hash_table_create
+--- ./bfd/elf64-ppc.c 2008-02-15 09:27:19.000000000 +0100
++++ ./bfd/elf64-ppc.c 2008-07-24 15:42:47.000000000 +0200
+@@ -2771,8 +2771,17 @@ sym_exists_at (asymbol **syms, long lo,
+ return NULL;
+ }
+
++static bfd_boolean
++section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
++{
++ bfd_vma vma = *(bfd_vma *) ptr;
++ return ((section->flags & SEC_ALLOC) != 0
++ && section->vma <= vma
++ && vma < section->vma + section->size);
++}
++
+ /* Create synthetic symbols, effectively restoring "dot-symbol" function
+- entry syms. */
++ entry syms. Also generate @plt symbols for the glink branch table. */
+
+ static long
+ ppc64_elf_get_synthetic_symtab (bfd *abfd,
+@@ -2862,8 +2871,6 @@ ppc64_elf_get_synthetic_symtab (bfd *abf
+ symcount = i;
+
+ count = 0;
+- if (opdsymend == secsymend)
+- goto done;
+
+ if (relocatable)
+ {
+@@ -2872,6 +2879,9 @@ ppc64_elf_get_synthetic_symtab (bfd *abf
+ size_t size;
+ long relcount;
+
++ if (opdsymend == secsymend)
++ goto done;
++
+ slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
+ relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
+ if (relcount == 0)
+@@ -2960,8 +2970,13 @@ ppc64_elf_get_synthetic_symtab (bfd *abf
+ }
+ else
+ {
++ bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
+ bfd_byte *contents;
+ size_t size;
++ long plt_count = 0;
++ bfd_vma glink_vma = 0, resolv_vma = 0;
++ asection *dynamic, *glink = NULL, *relplt = NULL;
++ arelent *p;
+
+ if (!bfd_malloc_and_get_section (abfd, opd, &contents))
+ {
+@@ -2988,11 +3003,85 @@ ppc64_elf_get_synthetic_symtab (bfd *abf
+ }
+ }
+
++ /* Get start of .glink stubs from DT_PPC64_GLINK. */
++ dynamic = bfd_get_section_by_name (abfd, ".dynamic");
++ if (dynamic != NULL)
++ {
++ bfd_byte *dynbuf, *extdyn, *extdynend;
++ size_t extdynsize;
++ void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
++
++ if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
++ goto free_contents_and_exit;
++
++ extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
++ swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
++
++ extdyn = dynbuf;
++ extdynend = extdyn + dynamic->size;
++ for (; extdyn < extdynend; extdyn += extdynsize)
++ {
++ Elf_Internal_Dyn dyn;
++ (*swap_dyn_in) (abfd, extdyn, &dyn);
++
++ if (dyn.d_tag == DT_NULL)
++ break;
++
++ if (dyn.d_tag == DT_PPC64_GLINK)
++ {
++ /* The first glink stub starts at offset 32; see comment in
++ ppc64_elf_finish_dynamic_sections. */
++ glink_vma = dyn.d_un.d_val + 32;
++ /* The .glink section usually does not survive the final
++ link; search for the section (usually .text) where the
++ glink stubs now reside. */
++ glink = bfd_sections_find_if (abfd, section_covers_vma,
++ &glink_vma);
++ break;
++ }
++ }
++
++ free (dynbuf);
++ }
++
++ if (glink != NULL)
++ {
++ /* Determine __glink trampoline by reading the relative branch
++ from the first glink stub. */
++ bfd_byte buf[4];
++ if (bfd_get_section_contents (abfd, glink, buf,
++ glink_vma + 4 - glink->vma, 4))
++ {
++ unsigned int insn = bfd_get_32 (abfd, buf);
++ insn ^= B_DOT;
++ if ((insn & ~0x3fffffc) == 0)
++ resolv_vma = glink_vma + 4 + (insn ^ 0x2000000) - 0x2000000;
++ }
++
++ if (resolv_vma)
++ size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
++ }
++
++ relplt = bfd_get_section_by_name (abfd, ".rela.plt");
++ if (glink != NULL && relplt != NULL)
++ {
++ slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
++ if (! (*slurp_relocs) (abfd, relplt, dyn_syms, TRUE))
++ goto free_contents_and_exit;
++
++ plt_count = relplt->size / sizeof (Elf64_External_Rela);
++ size += plt_count * sizeof (asymbol);
++
++ p = relplt->relocation;
++ for (i = 0; i < plt_count; i++, p++)
++ size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
++ }
++
+ s = *ret = bfd_malloc (size);
+ if (s == NULL)
+ goto free_contents_and_exit;
+
+- names = (char *) (s + count);
++ names = (char *) (s + count + plt_count + (resolv_vma != 0));
+
+ for (i = secsymend; i < opdsymend; ++i)
+ {
+@@ -3048,6 +3137,66 @@ ppc64_elf_get_synthetic_symtab (bfd *abf
+ }
+ }
+ free (contents);
++
++ if (glink != NULL && relplt != NULL)
++ {
++ if (resolv_vma)
++ {
++ /* Add a symbol for the main glink trampoline. */
++ memset (s, 0, sizeof *s);
++ s->the_bfd = abfd;
++ s->flags = BSF_GLOBAL;
++ s->section = glink;
++ s->value = resolv_vma - glink->vma;
++ s->name = names;
++ memcpy (names, "__glink_PLTresolve", sizeof ("__glink_PLTresolve"));
++ names += sizeof ("__glink_PLTresolve");
++ s++;
++ count++;
++ }
++
++ /* FIXME: It would be very much nicer to put sym at plt on the
++ stub rather than on the glink branch table entry. The
++ objdump disassembler would then use a sensible symbol
++ name on plt calls. The difficulty in doing so is
++ a) finding the stubs, and,
++ b) matching stubs against plt entries, and,
++ c) there can be multiple stubs for a given plt entry.
++
++ Solving (a) could be done by code scanning, but older
++ ppc64 binaries used different stubs to current code.
++ (b) is the tricky one since you need to known the toc
++ pointer for at least one function that uses a pic stub to
++ be able to calculate the plt address referenced.
++ (c) means gdb would need to set multiple breakpoints (or
++ find the glink branch itself) when setting breakpoints
++ for pending shared library loads. */
++ p = relplt->relocation;
++ for (i = 0; i < plt_count; i++, p++)
++ {
++ size_t len;
++
++ *s = **p->sym_ptr_ptr;
++ /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
++ we are defining a symbol, ensure one of them is set. */
++ if ((s->flags & BSF_LOCAL) == 0)
++ s->flags |= BSF_GLOBAL;
++ s->section = glink;
++ s->value = glink_vma - glink->vma;
++ s->name = names;
++ s->udata.p = NULL;
++ len = strlen ((*p->sym_ptr_ptr)->name);
++ memcpy (names, (*p->sym_ptr_ptr)->name, len);
++ names += len;
++ memcpy (names, "@plt", sizeof ("@plt"));
++ names += sizeof ("@plt");
++ s++;
++ glink_vma += 8;
++ if (i >= 0x8000)
++ glink_vma += 4;
++ }
++ count += plt_count;
++ }
+ }
+
+ done:
+@@ -9705,7 +9854,8 @@ ppc64_elf_build_stubs (bfd_boolean emit_
+ if (htab->emit_stub_syms)
+ {
+ struct elf_link_hash_entry *h;
+- h = elf_link_hash_lookup (&htab->elf, "__glink", TRUE, FALSE, FALSE);
++ h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
++ TRUE, FALSE, FALSE);
+ if (h == NULL)
+ return FALSE;
+ if (h->root.type == bfd_link_hash_new)
+--- ./gdb/elfread.c 2008-07-24 15:41:07.000000000 +0200
++++ ./gdb/elfread.c 2008-07-24 15:42:48.000000000 +0200
+@@ -514,6 +514,34 @@ elf_symtab_read (struct objfile *objfile
+ if (msym != NULL)
+ msym->filename = filesymname;
+ gdbarch_elf_make_msymbol_special (current_gdbarch, sym, msym);
++
++ /* For @plt symbols, also record a trampoline to the
++ destination symbol. The @plt symbol will be used in
++ disassembly, and the trampoline will be used when we are
++ trying to find the target. */
++ if (msym && ms_type == mst_text && type == ST_SYNTHETIC)
++ {
++ int len = strlen (sym->name);
++
++ if (len > 4 && strcmp (sym->name + len - 4, "@plt") == 0)
++ {
++ char *base_name = alloca (len - 4 + 1);
++ struct minimal_symbol *mtramp;
++
++ memcpy (base_name, sym->name, len - 4);
++ base_name[len - 4] = '\0';
++ mtramp = record_minimal_symbol (base_name, symaddr,
++ mst_solib_trampoline,
++ sym->section, objfile);
++ if (mtramp)
++ {
++ MSYMBOL_SIZE (mtramp) = MSYMBOL_SIZE (msym);
++ mtramp->filename = filesymname;
++ gdbarch_elf_make_msymbol_special (current_gdbarch, sym,
++ mtramp);
++ }
++ }
++ }
+ }
+ }
+ }
+--- ./gdb/minsyms.c 2008-07-24 15:41:07.000000000 +0200
++++ ./gdb/minsyms.c 2008-07-24 15:42:48.000000000 +0200
+@@ -357,10 +357,15 @@ lookup_minimal_symbol_solib_trampoline (
+ ALL the minimal symbol tables before deciding on the symbol that
+ comes closest to the specified PC. This is because objfiles can
+ overlap, for example objfile A has .text at 0x100 and .data at
+- 0x40000 and objfile B has .text at 0x234 and .data at 0x40048. */
++ 0x40000 and objfile B has .text at 0x234 and .data at 0x40048.
+
+-struct minimal_symbol *
+-lookup_minimal_symbol_by_pc_section (CORE_ADDR pc, asection *section)
++ If WANT_TRAMPOLINE is set, prefer mst_solib_trampoline symbols when
++ there are text and trampoline symbols at the same address.
++ Otherwise prefer mst_text symbols. */
++
++static struct minimal_symbol *
++lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc, asection *section,
++ int want_trampoline)
+ {
+ int lo;
+ int hi;
+@@ -369,7 +374,11 @@ lookup_minimal_symbol_by_pc_section (COR
+ struct minimal_symbol *msymbol;
+ struct minimal_symbol *best_symbol = NULL;
+ struct obj_section *pc_section;
++ enum minimal_symbol_type want_type, other_type;
+
++ want_type = want_trampoline ? mst_solib_trampoline : mst_text;
++ other_type = want_trampoline ? mst_text : mst_solib_trampoline;
++
+ /* PC has to be in a known section. This ensures that anything
+ beyond the end of the last segment doesn't appear to be part of
+ the last function in the last segment. */
+@@ -491,6 +500,24 @@ lookup_minimal_symbol_by_pc_section (COR
+ continue;
+ }
+
++ /* If we are looking for a trampoline and this is a
++ text symbol, or the other way around, check the
++ preceeding symbol too. If they are otherwise
++ identical prefer that one. */
++ if (hi > 0
++ && MSYMBOL_TYPE (&msymbol[hi]) == other_type
++ && MSYMBOL_TYPE (&msymbol[hi - 1]) == want_type
++ && (MSYMBOL_SIZE (&msymbol[hi])
++ == MSYMBOL_SIZE (&msymbol[hi - 1]))
++ && (SYMBOL_VALUE_ADDRESS (&msymbol[hi])
++ == SYMBOL_VALUE_ADDRESS (&msymbol[hi - 1]))
++ && (SYMBOL_BFD_SECTION (&msymbol[hi])
++ == SYMBOL_BFD_SECTION (&msymbol[hi - 1])))
++ {
++ hi--;
++ continue;
++ }
++
+ /* If the minimal symbol has a zero size, save it
+ but keep scanning backwards looking for one with
+ a non-zero size. A zero size may mean that the
+@@ -571,6 +598,12 @@ lookup_minimal_symbol_by_pc_section (COR
+ return (best_symbol);
+ }
+
++struct minimal_symbol *
++lookup_minimal_symbol_by_pc_section (CORE_ADDR pc, asection *section)
++{
++ return lookup_minimal_symbol_by_pc_section_1 (pc, section, 0);
++}
++
+ /* Backward compatibility: search through the minimal symbol table
+ for a matching PC (no section given) */
+
+@@ -1024,7 +1057,13 @@ msymbols_sort (struct objfile *objfile)
+ struct minimal_symbol *
+ lookup_solib_trampoline_symbol_by_pc (CORE_ADDR pc)
+ {
+- struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (pc);
++ struct obj_section *section = find_pc_section (pc);
++ struct minimal_symbol *msymbol;
++
++ if (section == NULL)
++ return NULL;
++ msymbol = lookup_minimal_symbol_by_pc_section_1 (pc, section->the_bfd_section,
++ 1);
+
+ if (msymbol != NULL && MSYMBOL_TYPE (msymbol) == mst_solib_trampoline)
+ return msymbol;
+--- ./gdb/ppc-linux-tdep.c 2008-02-20 15:31:40.000000000 +0100
++++ ./gdb/ppc-linux-tdep.c 2008-07-24 15:43:24.000000000 +0200
+@@ -545,7 +545,7 @@ ppc64_skip_trampoline_code (struct frame
+ }
+
+
+-/* Support for convert_from_func_ptr_addr (ARCH, ADDR, TARG) on PPC
++/* Support for convert_from_func_ptr_addr (ARCH, ADDR, TARG) on PPC64
+ GNU/Linux.
+
+ Usually a function pointer's representation is simply the address
+@@ -557,12 +557,6 @@ ppc64_skip_trampoline_code (struct frame
+ function, the second word is the TOC pointer (r2), and the third word
+ is the static chain value.
+
+- For PPC32, there are two kinds of function pointers: non-secure and
+- secure. Non-secure function pointers point directly to the
+- function in a code section and thus need no translation. Secure
+- ones (from GCC's -msecure-plt option) are in a data section and
+- contain one word: the address of the function.
+-
+ Throughout GDB it is currently assumed that a function pointer contains
+ the address of the function, which is not easy to fix. In addition, the
+ conversion of a function address to a function pointer would
+@@ -578,40 +572,15 @@ ppc64_skip_trampoline_code (struct frame
+ random addresses such as occur when there is no symbol table. */
+
+ static CORE_ADDR
+-ppc_linux_convert_from_func_ptr_addr (struct gdbarch *gdbarch,
+- CORE_ADDR addr,
+- struct target_ops *targ)
++ppc64_linux_convert_from_func_ptr_addr (struct gdbarch *gdbarch,
++ CORE_ADDR addr,
++ struct target_ops *targ)
+ {
+- struct gdbarch_tdep *tdep;
+ struct section_table *s = target_section_by_addr (targ, addr);
+- char *sect_name = NULL;
+-
+- if (!s)
+- return addr;
+-
+- tdep = gdbarch_tdep (gdbarch);
+-
+- switch (tdep->wordsize)
+- {
+- case 4:
+- sect_name = ".plt";
+- break;
+- case 8:
+- sect_name = ".opd";
+- break;
+- default:
+- internal_error (__FILE__, __LINE__,
+- _("failed internal consistency check"));
+- }
+
+ /* Check if ADDR points to a function descriptor. */
+-
+- /* NOTE: this depends on the coincidence that the address of a functions
+- entry point is contained in the first word of its function descriptor
+- for both PPC-64 and for PPC-32 with secure PLTs. */
+- if ((strcmp (s->the_bfd_section->name, sect_name) == 0)
+- && s->the_bfd_section->flags & SEC_DATA)
+- return get_target_memory_unsigned (targ, addr, tdep->wordsize);
++ if (s && strcmp (s->the_bfd_section->name, ".opd") == 0)
++ return get_target_memory_unsigned (targ, addr, 8);
+
+ return addr;
+ }
+@@ -905,11 +874,6 @@ ppc_linux_init_abi (struct gdbarch_info
+ set_gdbarch_long_double_bit (gdbarch, 16 * TARGET_CHAR_BIT);
+ set_gdbarch_long_double_format (gdbarch, floatformats_ibm_long_double);
+
+- /* Handle PPC GNU/Linux 64-bit function pointers (which are really
+- function descriptors) and 32-bit secure PLT entries. */
+- set_gdbarch_convert_from_func_ptr_addr
+- (gdbarch, ppc_linux_convert_from_func_ptr_addr);
+-
+ if (tdep->wordsize == 4)
+ {
+ /* Until November 2001, gcc did not comply with the 32 bit SysV
+@@ -937,6 +901,11 @@ ppc_linux_init_abi (struct gdbarch_info
+
+ if (tdep->wordsize == 8)
+ {
++ /* Handle PPC GNU/Linux 64-bit function pointers (which are really
++ function descriptors). */
++ set_gdbarch_convert_from_func_ptr_addr
++ (gdbarch, ppc64_linux_convert_from_func_ptr_addr);
++
+ /* Shared library handling. */
+ set_gdbarch_skip_trampoline_code (gdbarch, ppc64_skip_trampoline_code);
+ set_solib_svr4_fetch_link_map_offsets
Index: gdb.spec
===================================================================
RCS file: /cvs/pkgs/rpms/gdb/devel/gdb.spec,v
retrieving revision 1.298
retrieving revision 1.299
diff -u -r1.298 -r1.299
--- gdb.spec 14 Jul 2008 09:09:04 -0000 1.298
+++ gdb.spec 1 Aug 2008 06:36:43 -0000 1.299
@@ -13,7 +13,7 @@
# The release always contains a leading reserved number, start it at 1.
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
-Release: 17%{?_with_upstream:.upstream}%{?dist}
+Release: 18%{?_with_upstream:.upstream}%{?dist}
License: GPLv3+
Group: Development/Debuggers
@@ -382,6 +382,12 @@
Patch327: gdb-6.8-inlining.patch
Patch328: gdb-6.8-inlining-by-name.patch
+# Fix PRPSINFO in the core files dumped by gcore (BZ 254229).
+Patch329: gdb-6.8-bz254229-gcore-prpsinfo.patch
+
+# Fix register assignments with no GDB stack frames (BZ 436037).
+Patch330: gdb-6.8-bz436037-reg-no-longer-active.patch
+
BuildRequires: ncurses-devel glibc-devel gcc make gzip texinfo dejagnu gettext
BuildRequires: flex bison sharutils expat-devel
Requires: readline
@@ -569,6 +575,8 @@
%patch326 -p1
%patch327 -p1
%patch328 -p1
+%patch329 -p1
+%patch330 -p1
%patch124 -p1
find -name "*.orig" | xargs rm -f
@@ -669,8 +677,6 @@
cd gdb
gcc -o ./orphanripper %{SOURCE2} -Wall -lutil
# Need to use a single --ignore option, second use overrides first.
-# "chng-syms.exp" for possibly avoiding Linux kernel crash - Bug 207002.
-# "threadcrash.exp" is incompatible on ia64 with old kernels.
# No `%{?_smp_mflags}' here as it may race.
# WARNING: can't generate a core file - core tests suppressed - check ulimit
# "readline-overflow.exp" - Testcase is broken, functionality is OK.
@@ -680,26 +686,34 @@
ulimit -c unlimited || :
# Setup $CHECK as `check//unix/' or `check//unix/-m64' for explicit bitsize.
- # Simple `check' is not used for $CHECK as different escaping rules apply
- # for the --ignore list delimiting spaces.
+ # Never use two different bitsizes as it fails on ppc64.
echo 'int main (void) { return 0; }' >biarch.c
- gcc $RPM_OPT_FLAGS -o biarch biarch.c
- mv -f biarch biarch-native
- # Do not try -m64 for biarch as GDB cannot handle inferior larger than itself.
- for BI in -m32 -m31 ""
+ CHECK=""
+ for BI in -m64 -m32 -m31 ""
do
- if gcc 2>/dev/null $RPM_OPT_FLAGS $BI -o biarch biarch.c
+ # Do not use size-less options if any of the sizes works.
+ # On ia64 there is no -m64 flag while we must not leave a bare `check' here
+ # as it would switch over some testing scripts to the backward compatibility
+ # mode: when `make check' was executed from inside the testsuite/ directory.
+ if [ -z "$BI" -a -n "$CHECK" ];then
+ continue
+ fi
+ # Do not use $RPM_OPT_FLAGS as the other non-size options will not be used
+ # in the real run of the testsuite.
+ if ! gcc $BI -o biarch biarch.c
then
- break
+ continue
fi
+ CHECK="$CHECK check//unix/$BI"
done
- # On ia64 there is no -m64 flag while we must not leave a bare `check' here
- # as it would switch over some testing scripts to the backward compatibility
- # mode - when `make check' was executed from inside the testsuite/ directory.
- CHECK="check//unix$(echo " $RPM_OPT_FLAGS "|sed -n 's#^.* \(-m[36][241]\) .*$#/\1#p')"
- if ! cmp -s biarch-native biarch
+ # Do not try -m64 inferiors for -m32 GDB as it cannot handle inferiors larger
+ # than itself.
+ # s390 -m31 still uses the standard ELF32 binary format.
+ gcc $RPM_OPT_FLAGS -o biarch biarch.c
+ RPM_SIZE="$(file ./biarch|sed -n 's/^.*: ELF \(32\|64\)-bit .*$/\1/p')"
+ if [ "$RPM_SIZE" != "64" ]
then
- CHECK="$CHECK check//unix/$BI"
+ CHECK="$(echo " $CHECK "|sed 's# check//unix/-m64 # #')"
fi
# Disable some problematic testcases.
@@ -707,10 +721,7 @@
# `check//...' target spawn and too much escaping there would be dense.
for test in \
gdb.base/readline-overflow.exp \
- gdb.base/chng-syms.exp \
- gdb.base/checkpoint.exp \
gdb.base/bigcore.exp \
- gdb.threads/threadcrash.exp \
; do
mv -f ../../gdb/testsuite/$test ../gdb/testsuite/$test-DISABLED || :
done
@@ -718,7 +729,7 @@
%if 0%{!?_with_upstream:1}
# Run all the scheduled testsuite runs also in the PIE mode.
# Upstream GDB would lock up the testsuite run for too long on its failures.
- CHECK="$(echo $CHECK|sed 's#check//unix[^ ]*#& &/-fPIE/-pie#g')"
+ CHECK="$(echo $CHECK|sed 's#check//unix/[^ ]*#& &/-fPIE/-pie#g')"
%endif # 0%{!?_with_upstream:1}
for CURRENT in $CHECK
@@ -832,6 +843,14 @@
%endif
%changelog
+* Fri Aug 1 2008 Jan Kratochvil <jan.kratochvil at redhat.com> - 6.8-18
+- Fix powerpc recent secure PLTs handling (shared library calls) (BZ 452960).
+- Fix the testsuite .spec runner to run biarch also on ppc.
+- Reenable testcases threadcrash.exp, chng-syms.exp, checkpoint.exp (BZ 207002).
+- Fix PRPSINFO in the core files dumped by gcore (BZ 254229), reformatted patch
+ from Denys Vlasenko.
+- Fix register assignments with no GDB stack frames, Denys Vlasenko (BZ 436037).
+
* Mon Jul 14 2008 Jan Kratochvil <jan.kratochvil at redhat.com> - 6.8-17
- Refresh the patchset with fuzz 0 (for new rpmbuild).
- Previous message (by thread): rpms/kernel/devel drm-modesetting-radeon.patch, NONE, 1.1 kernel.spec, 1.828, 1.829
- Next message (by thread): rpms/gdb/F-9 gdb-6.8-bz436037-reg-no-longer-active.patch, NONE, 1.1 gdb-6.8-upstream.patch, 1.5, 1.6 gdb.spec, 1.289, 1.290
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the fedora-extras-commits
mailing list