This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: go32-nat, always a thread
On Fri, 8 Aug 2008 04:39:17 +0100, Pedro Alves wrote:
> Anyone able to test this? Eli?
So, I took a few hours today to build a GDB on DJGPP.
After some hacks and patches, I succeeded.
This is what is looks like with the attached patches installed:
bash-2.04$ ./gdb ./gdb
GNU gdb (GDB) 6.8.50.20080808-cvs
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i586-pc-msdosdjgpp --target=djgpp".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
(gdb) start
Temporary breakpoint 1 at 0x1f8c: file ../../gdb/gdb.c, line 28.
Starting program: c:/djgdb/src/djgpp/gdb/./gdb.exe
Temporary breakpoint 1, main (argc=1, argv=0x36da0c) at ../../gdb/gdb.c:28
28 memset (&args, 0, sizeof args);
(gdb) info threads
* 1 Thread <main> main (argc=1, argv=0x36da0c) at ../../gdb/gdb.c:28
(gdb) kill
Kill the program being debugged? (y or n) y
(gdb) info threads
(gdb) n
The program is not being run.
(gdb)
Here is a description of what I've done to build gdb on DJGPP:
I used a Windows XP machine.
Downloaded DJGPP 2.03, bash 2.04, and all the needed dependencies to
build GDB from djgpp's ftp archive. These are all the zips I downloaded
and installed. Most likelly a couple aren't needed, though.
bnu217b.zip djlsr203.zip fil41d.zip gwk316b.zip rhid15ab.zip
bnu217s.zip djtst203.zip find41b.zip gwk316d.zip rhid15as.zip
bsh204br2.zip em2005b.zip find41d.zip m4-149b.zip sed415b.zip
bsh204d.zip em2005li.zip flx254b.zip m4-149d.zip sed415d.zip
bsn23b.zip em2005s1.zip gcc423b.zip mak3791b.zip shl2011b.zip
bsn23s.zip em2005s2.zip gdb611b.zip objc423b.zip shl2011d.zip
dif287b.zip faq230b.zip gpp423b.zip pakk023b.zip txi412b.zip
dif287d.zip faq230s.zip grep253b.zip pakk023s.zip txt20b.zip
djdev203.zip fil41b.zip grep253d.zip pdcur33b.zip txt20d.zip
I didn't need to use the special djunpack to rename gdb's sources to
8.3 format, since I was under bash + winxp, which sees long filenames.
bash-2.04$ gcc -v
Using built-in specs.
Target: djgpp
Configured with: /v203/gcc-4.23/configure djgpp --prefix=/dev/env/DJDIR --disable-nls --disable-werror --enable-languages=c,c++,fortran,objc,obj-c++,ada
Thread model: single
gcc version 4.2.3
I configured gdb out of tree with:
../src/configure \
--target=i586-pc-msdosdjgpp \
--host=i586-pc-msdosdjgpp \
--build=i586-pc-msdosdjgpp
I to pass target,host to force a native build. The default of not passing
any argument to configure, ended up building with target=i586-pc-msdosdjgpp
host=i386-pc-msdosdjgpp, which, being different, triggeres a cross build,
which excludes go32-nat.c.
About the first patch:
- The readline bits, the patch explains what's needed.
Here's the error log
gcc -DHAVE_CONFIG_H -I. -I../../readline -DRL_LIBRARY_VERSION='"5.1"' -O0 -g3
-c ../../readline/support/wcwidth.c
In file included from ../../readline/support/wcwidth.c:9:
c:/djgpp/include/wchar.h:24: error: expected '=', ',', ';', 'asm' or '__attribut
e__' before 'typedef'
../../readline/support/wcwidth.c: In function 'wcwidth':
../../readline/support/wcwidth.c:130: warning: comparison is always false due to
limited range of data type
../../readline/support/wcwidth.c:130: warning: comparison is always true due to
limited range of data type
make.exe: *** [wcwidth.o] Error 1
- libbfd
cc1.exe: warnings being treated as errors
../../bfd/archive.c: In function '_bfd_archive_bsd_update_armap_timestamp':
../../bfd/archive.c:2314: warning: comparison between signed and unsigned
time_t in djgpp is unsigned int, armap_timestamp is long.
There's a comment at the definition of armap_timestamp, claiming that it
isn't time_t until more compilers support it.
- libiberty:
I get this error when building libiberty:
rm -f needed-list; touch needed-list; \
for f in atexit calloc memchr memcmp memcpy memmove memset rename strchr strerro
r strncmp strrchr strstr strtol strtoul tmpnam vfprintf vprintf vfork waitpid bc
mp bcopy bzero; do \
for g in ; do \
case "$g" in \
*$f*) echo $g >> needed-list ;; \
esac; \
done; \
done
c:\djgpp\tmp/dj750000: line 1: syntax error near unexpected token `;'
c:\djgpp\tmp/dj750000: line 1: `rm -f needed-list; touch needed-list; for f in
atexit calloc memchr memcmp memcpy memmove memset rename strchr strerror strncmp
strrchr strstr strtol strtoul tmpnam vfprintf vprintf vfork waitpid bcmp bcopy
bzero; do for g in ; do case "$g" in *$f*) echo $g >> needed-list ;; esac;
done; done'
make.exe[2]: *** [needed-list] Error 2
I can't tell what's going on here. Maybe it's related to using make
3.79.1.
I just hacked the Makefile to just touch the needed-list file and do
nothing else with it. There's a comment in the makefile claining
this is needed for libstdc++.
For some reason, maybe related to the above, a few libiberty objects
are not being built and archived:
I manually added snprintf.o, vasprintf.o, asprintf.o and vsnprintf.o
to REQUIRED_OFILES to libiberty's generated Makefile. I don't plan to
persue to proper fix for these issues.
GDB changes:
- DJGPP 2.03 doesn't come bundled with stdint.h, but I
downloaded it djgpp's cvs (from the web frontend to CVS actually),
and install it manually. Seems to work fine.
The build complains about not finding stdint.h. DJGPP 2.03 doesn't
come bundled with stdint.h, but we should be picking up
stdint.h from gdb/gnulib. There seems to be a build order
dependency going wrong. We configure gdb/gnulib before starting
to build gdb/, but we build gdb/ before gdb/gnulib.
I had to cd to build/gdb/gnulib, and "make" it. This
creates a gdb/gnulib/stdint.h, and also gdb/gnulib/string.h
with memmem declared in it, which is needed to compile target.c, due
Then I can come back to build/gdb, and continue building.
This is using GNU Make 3.79.1, which is what prebuilt at djgpp's
download site. It seems to be that even if we don't
support auto-dependencies with this make version, it should
still build gnulib before gdb. Actually, I just tried with
GNU Make 3.81 on linux, and I see the same issue.
- "missing sentinel in function calls" warnings:
NULL is not a pointer in djgpp. GCC was barking on a few concat calls.
- cp-name-parse.y
Needed to include config.h, so HAVE_DECL_SNPRINTF was defined,
so libiberty.h declares snprintf.
- go32-nat.c:
There was a bit of bit rot around.
GCC complains about attribute packed like so:
cc1.exe: warnings being treated as errors
../../gdb/go32-nat.c:1292: warning: 'packed' attribute ignored for field of type 'unsigned char'
../../gdb/go32-nat.c:1301: warning: 'packed' attribute ignored for field of type 'unsigned char'
make.exe: *** [go32-nat.o] Error 1
Just removed the attribute from the offending fields.
Are the GDB parts of patches OK? I checked that
x86_64-unknown-linux-gnu still builds OK.
--
Pedro Alves
bfd/
2008-08-09 Pedro Alves <pedro@codesourcery.com>
* archive.c (_bfd_archive_bsd_update_armap_timestamp): Cast stat
st_mtime to long before comparison.
gdb/
2008-08-09 Pedro Alves <pedro@codesourcery.com>
* buildsym.c (start_subfile): Cast sentinel NULL to void*.
* cp-name-parser.y: Include "config.h".
* posix-hdep.c [__GO32__]: Include time.h.
* xml-tdesc.c (fetch_xml_from_file): Cast sentinel NULL to void*.
* gdb_select.h: Include sys/types.h if available.
* go32-nat.c (fetch_register, store_register): Pass the regcache
gdbarch to i386_fp_regnum_p and i386_fpc_regnum_p.
(go32_xfer_memory): Change type of myaddr parameter to gdb_byte.
(struct seg_descr, struct seg_descr): Don't pack byte sized
members.
readline/
2008-08-09 Pedro Alves <pedro@codesourcery.com>
* signals.c (rl_set_sighandler): Guard access to SIGWINCH.
* wcwidth.c [__GO32__]: Include wctype.h before wchar.h.
---
bfd/archive.c | 2 +-
gdb/buildsym.c | 2 +-
gdb/cp-name-parser.y | 1 +
gdb/gdb_select.h | 4 ++++
gdb/go32-nat.c | 18 ++++++++++--------
gdb/posix-hdep.c | 6 ++++++
gdb/xml-tdesc.c | 2 +-
readline/signals.c | 4 ++++
readline/support/wcwidth.c | 5 +++++
9 files changed, 33 insertions(+), 11 deletions(-)
Index: src/gdb/buildsym.c
===================================================================
--- src.orig/gdb/buildsym.c
+++ src/gdb/buildsym.c
@@ -547,7 +547,7 @@ start_subfile (char *name, char *dirname
&& !IS_ABSOLUTE_PATH (subfile->name)
&& subfile->dirname != NULL)
subfile_name = concat (subfile->dirname, SLASH_STRING,
- subfile->name, NULL);
+ subfile->name, (void*) NULL);
else
subfile_name = subfile->name;
Index: src/gdb/cp-name-parser.y
===================================================================
--- src.orig/gdb/cp-name-parser.y
+++ src/gdb/cp-name-parser.y
@@ -36,6 +36,7 @@ Boston, MA 02110-1301, USA. */
#include <unistd.h>
#include <string.h>
+#include "config.h"
#include "safe-ctype.h"
#include "libiberty.h"
#include "demangle.h"
Index: src/gdb/posix-hdep.c
===================================================================
--- src.orig/gdb/posix-hdep.c
+++ src/gdb/posix-hdep.c
@@ -24,6 +24,12 @@
#include "gdb_select.h"
+#ifdef __GO32__
+/* DJGPP defines the fd_set type in sys/types.h, but `select' goes
+ here. */
+# include <time.h>
+#endif
+
/* The strerror() function can return NULL for errno values that are
out of range. Provide a "safe" version that always returns a
printable string. */
Index: src/gdb/xml-tdesc.c
===================================================================
--- src.orig/gdb/xml-tdesc.c
+++ src/gdb/xml-tdesc.c
@@ -443,7 +443,7 @@ fetch_xml_from_file (const char *filenam
if (dirname && *dirname)
{
- char *fullname = concat (dirname, "/", filename, NULL);
+ char *fullname = concat (dirname, "/", filename, (void*) NULL);
if (fullname == NULL)
nomem (0);
file = fopen (fullname, FOPEN_RT);
Index: src/readline/signals.c
===================================================================
--- src.orig/readline/signals.c
+++ src/readline/signals.c
@@ -251,7 +251,11 @@ rl_set_sighandler (sig, handler, ohandle
struct sigaction act;
act.sa_handler = handler;
+#if defined (SIGWINCH)
act.sa_flags = (sig == SIGWINCH) ? SA_RESTART : 0;
+#else
+ act.sa_flags = 0;
+#endif
sigemptyset (&act.sa_mask);
sigemptyset (&ohandler->sa_mask);
sigaction (sig, &act, &old_handler);
Index: src/readline/support/wcwidth.c
===================================================================
--- src.orig/readline/support/wcwidth.c
+++ src/readline/support/wcwidth.c
@@ -6,6 +6,11 @@
* Markus Kuhn -- 2001-09-08 -- public domain
*/
+#ifdef __GO32__
+/* DJGPP needs to include this before including wchar.h. */
+# include <wctype.h>
+#endif
+
#include <wchar.h>
struct interval {
Index: src/bfd/archive.c
===================================================================
--- src.orig/bfd/archive.c
+++ src/bfd/archive.c
@@ -2311,7 +2311,7 @@ _bfd_archive_bsd_update_armap_timestamp
/* Can't read mod time for some reason. */
return TRUE;
}
- if (archstat.st_mtime <= bfd_ardata (arch)->armap_timestamp)
+ if (((long) archstat.st_mtime) <= bfd_ardata (arch)->armap_timestamp)
/* OK by the linker's rules. */
return TRUE;
Index: src/gdb/gdb_select.h
===================================================================
--- src.orig/gdb/gdb_select.h
+++ src/gdb/gdb_select.h
@@ -24,6 +24,10 @@
#include <sys/select.h>
#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
#ifdef USE_WIN32API
#include <winsock2.h>
#endif
Index: src/gdb/go32-nat.c
===================================================================
--- src.orig/gdb/go32-nat.c
+++ src/gdb/go32-nat.c
@@ -176,7 +176,7 @@ static void go32_fetch_registers (struct
static void store_register (const struct regcache *, int regno);
static void go32_store_registers (struct regcache *, int regno);
static void go32_prepare_to_store (struct regcache *);
-static int go32_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len,
+static int go32_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len,
int write,
struct mem_attrib *attrib,
struct target_ops *target);
@@ -465,10 +465,11 @@ go32_wait (ptid_t ptid, struct target_wa
static void
fetch_register (struct regcache *regcache, int regno)
{
- if (regno < gdbarch_fp0_regnum (get_regcache_arch (regcache)))
+ struct gdbarch *gdbarch = get_regcache_arch (regcache);
+ if (regno < gdbarch_fp0_regnum (gdbarch))
regcache_raw_supply (regcache, regno,
(char *) &a_tss + regno_mapping[regno].tss_ofs);
- else if (i386_fp_regnum_p (regno) || i386_fpc_regnum_p (regno))
+ else if (i386_fp_regnum_p (gdbarch, regno) || i386_fpc_regnum_p (gdbarch, regno))
i387_supply_fsave (regcache, regno, &npx);
else
internal_error (__FILE__, __LINE__,
@@ -493,10 +494,11 @@ go32_fetch_registers (struct regcache *r
static void
store_register (const struct regcache *regcache, int regno)
{
- if (regno < gdbarch_fp0_regnum (get_regcache_arch (regcache)))
+ struct gdbarch *gdbarch = get_regcache_arch (regcache);
+ if (regno < gdbarch_fp0_regnum (gdbarch))
regcache_raw_collect (regcache, regno,
(char *) &a_tss + regno_mapping[regno].tss_ofs);
- else if (i386_fp_regnum_p (regno) || i386_fpc_regnum_p (regno))
+ else if (i386_fp_regnum_p (gdbarch, regno) || i386_fpc_regnum_p (gdbarch, regno))
i387_collect_fsave (regcache, regno, &npx);
else
internal_error (__FILE__, __LINE__,
@@ -524,7 +526,7 @@ go32_prepare_to_store (struct regcache *
}
static int
-go32_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
+go32_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
struct mem_attrib *attrib, struct target_ops *target)
{
if (write)
@@ -1263,7 +1265,7 @@ go32_sysinfo (char *arg, int from_tty)
struct seg_descr {
unsigned short limit0 __attribute__((packed));
unsigned short base0 __attribute__((packed));
- unsigned char base1 __attribute__((packed));
+ unsigned char base1;
unsigned stype:5 __attribute__((packed));
unsigned dpl:2 __attribute__((packed));
unsigned present:1 __attribute__((packed));
@@ -1272,7 +1274,7 @@ struct seg_descr {
unsigned dummy:1 __attribute__((packed));
unsigned bit32:1 __attribute__((packed));
unsigned page_granular:1 __attribute__((packed));
- unsigned char base2 __attribute__((packed));
+ unsigned char base2;
};
struct gate_descr {
2008-08-09 Pedro Alves <pedro@codesourcery.com>
* go32-nat.c: Include "gdbthread.h".
(go32_stop, go32_kill_inferior): Delete the main thread.
(go32_create_inferior): Add it.
(go32_thread_alive, go32_pid_to_str): New.
(init_go32_ops): Register go32_thread_alive and go32_pid_to_str.
---
gdb/go32-nat.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
Index: src/gdb/go32-nat.c
===================================================================
--- src.orig/gdb/go32-nat.c
+++ src/gdb/go32-nat.c
@@ -22,6 +22,7 @@
#include "defs.h"
#include "inferior.h"
+#include "gdbthread.h"
#include "gdb_wait.h"
#include "gdbcore.h"
#include "command.h"
@@ -566,7 +567,9 @@ go32_stop (ptid_t ptid)
{
normal_stop ();
cleanup_client ();
+ ptid = inferior_ptid;
inferior_ptid = null_ptid;
+ delete_thread_silent (ptid);
prog_has_started = 0;
}
@@ -576,6 +579,8 @@ go32_kill_inferior (void)
redir_cmdline_delete (&child_cmd);
resume_signal = -1;
resume_is_step = 0;
+ if (!ptid_equal (inferior_ptid, null_ptid))
+ delete_thread_silent (inferior_ptid);
unpush_target (&go32_ops);
}
@@ -658,6 +663,9 @@ go32_create_inferior (char *exec_file, c
inferior_ptid = pid_to_ptid (SOME_PID);
push_target (&go32_ops);
+
+ add_thread_silent (inferior_ptid);
+
clear_proceed_status ();
insert_breakpoints ();
prog_has_started = 1;
@@ -848,6 +856,20 @@ go32_terminal_ours (void)
}
}
+static int
+go32_thread_alive (ptid_t ptid)
+{
+ return 1;
+}
+
+static char *
+go32_pid_to_str (ptid_t ptid)
+{
+ static char buf[64];
+ xsnprintf (buf, sizeof buf, "Thread <main>");
+ return buf;
+}
+
static void
init_go32_ops (void)
{
@@ -878,6 +900,8 @@ init_go32_ops (void)
go32_ops.to_mourn_inferior = go32_mourn_inferior;
go32_ops.to_can_run = go32_can_run;
go32_ops.to_stop = go32_stop;
+ go32_ops.to_thread_alive = go32_thread_alive;
+ go32_ops.to_pid_to_str = go32_pid_to_str;
go32_ops.to_stratum = process_stratum;
go32_ops.to_has_all_memory = 1;
go32_ops.to_has_memory = 1;