* Makefile.in (ALLDEPFILES): Remove xcoffexec.c.

* Makefile.in: Remove xcoffexec.o rule.

	* exec.c (exec_file_command): Add comment.

	Fix data and bss relocation for VxWorks 5.1:
	* remote-vx.c (vx_add_symbols): New function.
	(vx_load_command, add_symbol_stub): Call it instead of
	symbol_file_add.
	(vx_wait): Remove comment which was wrong to useless.
	* remote-vx.c: Reindent much of file.
	* coffread.c (cs_to_section, find_targ_sec): New functions.
	(process_coff_symbol): Set SYMBOL_SECTION to result
	from cs_to_section.
	(coff_symtab_read): Call cs_to_section and deal appropriate
	rather than assuming sections are in a certain order.  Deal with
	BSS.
	* coffread.c: Remove text_bfd_scnum variable.
This commit is contained in:
Jim Kingdon
1994-10-17 21:21:52 +00:00
parent 0a1e63c4b5
commit e7b5942b5c
5 changed files with 412 additions and 261 deletions

@ -1,3 +1,24 @@
Mon Oct 17 10:29:08 1994 Jim Kingdon (kingdon@lioth.cygnus.com)
* Makefile.in (ALLDEPFILES): Remove xcoffexec.c.
* Makefile.in: Remove xcoffexec.o rule.
* exec.c (exec_file_command): Add comment.
Fix data and bss relocation for VxWorks 5.1:
* remote-vx.c (vx_add_symbols): New function.
(vx_load_command, add_symbol_stub): Call it instead of
symbol_file_add.
(vx_wait): Remove comment which was wrong to useless.
* remote-vx.c: Reindent much of file.
* coffread.c (cs_to_section, find_targ_sec): New functions.
(process_coff_symbol): Set SYMBOL_SECTION to result
from cs_to_section.
(coff_symtab_read): Call cs_to_section and deal appropriate
rather than assuming sections are in a certain order. Deal with
BSS.
* coffread.c: Remove text_bfd_scnum variable.
Sat Oct 15 16:55:48 1994 Stan Shebs (shebs@andros.cygnus.com) Sat Oct 15 16:55:48 1994 Stan Shebs (shebs@andros.cygnus.com)
* corelow.c: Format to standard. * corelow.c: Format to standard.

@ -203,6 +203,8 @@ SER_HARDWIRE=ser-unix.o
# but not all (e.g. 960) # but not all (e.g. 960)
REMOTE_O = remote.o dcache.o remote-utils.o REMOTE_O = remote.o dcache.o remote-utils.o
ANNOTATE_OBS = annotate.o
# Host and target-dependent makefile fragments come in here. # Host and target-dependent makefile fragments come in here.
#### ####
# End of host and target-dependent makefile fragments # End of host and target-dependent makefile fragments
@ -287,9 +289,6 @@ NLMCONV_FOR_TARGET = ` \
fi; \ fi; \
fi` fi`
NWSOURCE = /gaunt/grossman/unsupported/Novell
NWINCLUDES = $(NWSOURCE)/novh40
LD_FOR_TARGET = ` \ LD_FOR_TARGET = ` \
if [ -f $${rootme}/../ld/ld.new ] ; then \ if [ -f $${rootme}/../ld/ld.new ] ; then \
echo $${rootme}/../ld/ld.new; \ echo $${rootme}/../ld/ld.new; \
@ -334,8 +333,10 @@ TARGET_FLAGS_TO_PASS = \
SFILES = blockframe.c breakpoint.c buildsym.c c-exp.y c-lang.c \ SFILES = blockframe.c breakpoint.c buildsym.c c-exp.y c-lang.c \
c-typeprint.c c-valprint.c ch-exp.y ch-lang.c ch-typeprint.c \ c-typeprint.c c-valprint.c ch-exp.y ch-lang.c ch-typeprint.c \
ch-valprint.c coffread.c command.c complaints.c core.c cp-valprint.c \ ch-valprint.c coffread.c command.c complaints.c core.c cp-valprint.c \
dbxread.c demangle.c dwarfread.c elfread.c environ.c eval.c expprint.c \ dbxread.c demangle.c dwarfread.c \
findvar.c gdbtypes.c infcmd.c inflow.c infrun.c language.c \ elfread.c environ.c eval.c expprint.c \
f-exp.y f-lang.c f-typeprint.c f-valprint.c findvar.c \
gdbtypes.c infcmd.c inflow.c infrun.c language.c \
m2-exp.y m2-lang.c m2-typeprint.c m2-valprint.c main.c maint.c \ m2-exp.y m2-lang.c m2-typeprint.c m2-valprint.c main.c maint.c \
mem-break.c minsyms.c mipsread.c nlmread.c objfiles.c parse.c \ mem-break.c minsyms.c mipsread.c nlmread.c objfiles.c parse.c \
printcmd.c remote.c source.c stabsread.c stack.c symfile.c symmisc.c \ printcmd.c remote.c source.c stabsread.c stack.c symfile.c symmisc.c \
@ -402,7 +403,8 @@ HFILES_NO_SRCDIR = buildsym.h call-cmds.h coff-solib.h defs.h dst.h environ.h \
gdb-stabs.h $(inferior_h) language.h minimon.h monitor.h \ gdb-stabs.h $(inferior_h) language.h minimon.h monitor.h \
objfiles.h parser-defs.h partial-stab.h serial.h signals.h solib.h \ objfiles.h parser-defs.h partial-stab.h serial.h signals.h solib.h \
symfile.h stabsread.h target.h terminal.h typeprint.h xcoffsolib.h \ symfile.h stabsread.h target.h terminal.h typeprint.h xcoffsolib.h \
c-lang.h ch-lang.h m2-lang.h complaints.h ns32k-opcode.h valprint.h \ c-lang.h ch-lang.h f-lang.h m2-lang.h \
complaints.h valprint.h \
29k-share/udi/udiids.h 29k-share/udi_soc nindy-share/b.out.h \ 29k-share/udi/udiids.h 29k-share/udi_soc nindy-share/b.out.h \
nindy-share/block_io.h nindy-share/coff.h \ nindy-share/block_io.h nindy-share/coff.h \
nindy-share/env.h nindy-share/stop.h \ nindy-share/env.h nindy-share/stop.h \
@ -448,13 +450,16 @@ COMMON_OBS = version.o blockframe.o breakpoint.o findvar.o stack.o thread.o \
symtab.o symfile.o symmisc.o infcmd.o infrun.o command.o \ symtab.o symfile.o symmisc.o infcmd.o infrun.o command.o \
expprint.o environ.o gdbtypes.o copying.o $(DEPFILES) \ expprint.o environ.o gdbtypes.o copying.o $(DEPFILES) \
mem-break.o target.o parse.o language.o $(YYOBJ) buildsym.o \ mem-break.o target.o parse.o language.o $(YYOBJ) buildsym.o \
objfiles.o minsyms.o maint.o demangle.o dbxread.o coffread.o elfread.o \ exec.o objfiles.o minsyms.o maint.o demangle.o \
dwarfread.o mipsread.o stabsread.o core.o c-lang.o ch-lang.o m2-lang.o \ dbxread.o coffread.o elfread.o \
complaints.o typeprint.o c-typeprint.o ch-typeprint.o m2-typeprint.o \ dwarfread.o mipsread.o stabsread.o core.o \
c-valprint.o cp-valprint.o ch-valprint.o m2-valprint.o nlmread.o \ c-lang.o ch-lang.o f-lang.o m2-lang.o \
serial.o mdebugread.o os9kread.o top.o utils.o complaints.o typeprint.o \
c-typeprint.o ch-typeprint.o f-typeprint.o m2-typeprint.o \
c-valprint.o cp-valprint.o ch-valprint.o f-valprint.o m2-valprint.o \
nlmread.o serial.o mdebugread.o os9kread.o top.o utils.o
OBS = $(COMMON_OBS) main.o annotate.o OBS = $(COMMON_OBS) $(ANNOTATE_OBS) main.o
LIBGDB_OBS = LIBGDB_OBS =
@ -467,8 +472,8 @@ NTSSTART = kdb-start.o
SUBDIRS = doc testsuite nlm SUBDIRS = doc testsuite nlm
# For now, shortcut the "configure GDB for fewer languages" stuff. # For now, shortcut the "configure GDB for fewer languages" stuff.
YYFILES = c-exp.tab.c m2-exp.tab.c ch-exp.tab.c YYFILES = c-exp.tab.c f-exp.tab.c m2-exp.tab.c ch-exp.tab.c
YYOBJ = c-exp.tab.o m2-exp.tab.o ch-exp.tab.o YYOBJ = c-exp.tab.o f-exp.tab.o m2-exp.tab.o ch-exp.tab.o
# Things which need to be built when making a distribution. # Things which need to be built when making a distribution.
@ -572,20 +577,6 @@ gdb: $(OBS) $(TSOBS) $(ADD_DEPS) $(CDEPS) init.o
$(CC-LD) $(INTERNAL_LDFLAGS) -o gdb \ $(CC-LD) $(INTERNAL_LDFLAGS) -o gdb \
init.o $(OBS) $(TSOBS) $(ADD_FILES) $(CLIBS) $(LOADLIBES) init.o $(OBS) $(TSOBS) $(ADD_FILES) $(CLIBS) $(LOADLIBES)
prelude.o: $(NWSOURCE)/prelude.c
rootme=`pwd`; export rootme; rootsrc=`cd $(srcdir); pwd`; export rootsrc; $(CC_FOR_TARGET) -g -I $(NWINCLUDES) -c $(NWSOURCE)/prelude.c
i386-nlmstub.o: $(srcdir)/i386-nlmstub.c
rootme=`pwd`; export rootme; rootsrc=`cd $(srcdir); pwd`; export rootsrc; $(CC_FOR_TARGET) -g -I $(NWINCLUDES) -c $(srcdir)/i386-nlmstub.c
nlmstub.o: prelude.o i386-nlmstub.o
rootme=`pwd`; export rootme; $(LD_FOR_TARGET) -r -o nlmstub.o prelude.o i386-nlmstub.o
nlmstub.nlm: nlmstub.o $(srcdir)/nlmstub.def
rootme=`pwd`; export rootme; $(NLMCONV_FOR_TARGET) -T $(srcdir)/nlmstub.def nlmstub.o nlmstub.nlm
nlmstub: nlmstub.nlm
nlm: force nlm: force
rootme=`pwd`; export rootme; $(MAKE) $(TARGET_FLAGS_TO_PASS) DO=all DODIRS=nlm subdir_do rootme=`pwd`; export rootme; $(MAKE) $(TARGET_FLAGS_TO_PASS) DO=all DODIRS=nlm subdir_do
@ -713,7 +704,8 @@ distclean: clean
realclean: clean realclean: clean
@$(MAKE) $(FLAGS_TO_PASS) DO=realclean "DODIRS=$(SUBDIRS)" subdir_do @$(MAKE) $(FLAGS_TO_PASS) DO=realclean "DODIRS=$(SUBDIRS)" subdir_do
rm -f c-exp.tab.c m2-exp.tab.c ch-exp.tab.c TAGS $(INFOFILES) rm -f c-exp.tab.c f-exp.tab.c m2-exp.tab.c ch-exp.tab.c
rm -f TAGS $(INFOFILES)
rm -f nm.h tm.h xm.h config.status rm -f nm.h tm.h xm.h config.status
rm -f y.output yacc.acts yacc.tmp rm -f y.output yacc.acts yacc.tmp
rm -f Makefile rm -f Makefile
@ -789,15 +781,28 @@ c-exp.tab.c: c-exp.y
-rm y.tab.c -rm y.tab.c
mv c-exp.new ./c-exp.tab.c mv c-exp.new ./c-exp.tab.c
f-exp.tab.o: f-exp.tab.c
f-exp.tab.c: f-exp.y c-exp.tab.c
$(YACC) $(YFLAGS) $(srcdir)/f-exp.y
-sed -e '/extern.*malloc/d' \
-e '/extern.*realloc/d' \
-e '/extern.*free/d' \
-e '/include.*malloc.h/d' \
-e 's/malloc/xmalloc/g' \
-e 's/realloc/xrealloc/g' \
< y.tab.c > f-exp.new
-rm y.tab.c
mv f-exp.new ./f-exp.tab.c
# ch-exp.tab.c is generated in objdir from ch-exp.y if it doesn't exist # ch-exp.tab.c is generated in objdir from ch-exp.y if it doesn't exist
# in srcdir, then compiled in objdir to ch-exp.tab.o. # in srcdir, then compiled in objdir to ch-exp.tab.o.
# Remove bogus decls for malloc/realloc/free which conflict with everything # Remove bogus decls for malloc/realloc/free which conflict with everything
# else. # else.
ch-exp.tab.o: ch-exp.tab.c ch-exp.tab.o: ch-exp.tab.c
# the dependency here on c-exp.tab.c is artificial. Without this # the dependency here on f-exp.tab.c is artificial. Without this
# dependency, a parallel make will attempt to build both at the same # dependency, a parallel make will attempt to build both at the same
# time and the second yacc will pollute the first y.tab.c file. # time and the second yacc will pollute the first y.tab.c file.
ch-exp.tab.c: ch-exp.y c-exp.tab.c ch-exp.tab.c: ch-exp.y f-exp.tab.c
$(YACC) $(YFLAGS) $(srcdir)/ch-exp.y $(YACC) $(YFLAGS) $(srcdir)/ch-exp.y
-sed -e '/extern.*malloc/d' \ -sed -e '/extern.*malloc/d' \
-e '/extern.*realloc/d' \ -e '/extern.*realloc/d' \
@ -830,7 +835,7 @@ m2-exp.tab.c: m2-exp.y ch-exp.tab.c
mv m2-exp.new ./m2-exp.tab.c mv m2-exp.new ./m2-exp.tab.c
# These files are updated atomically, so make never has to remove them # These files are updated atomically, so make never has to remove them
.PRECIOUS: m2-exp.tab.c ch-exp.tab.c c-exp.tab.c .PRECIOUS: m2-exp.tab.c ch-exp.tab.c f-exp.tab.c c-exp.tab.c
lint: $(LINTFILES) lint: $(LINTFILES)
$(LINT) $(INCLUDE_CFLAGS) $(LINTFLAGS) $(LINTFILES) \ $(LINT) $(INCLUDE_CFLAGS) $(LINTFLAGS) $(LINTFILES) \
@ -899,7 +904,7 @@ ALLDEPFILES = 29k-share/udi/udip2soc.c 29k-share/udi/udr.c \
tahoe-pinsn.c ultra3-nat.c ultra3-xdep.c umax-xdep.c \ tahoe-pinsn.c ultra3-nat.c ultra3-xdep.c umax-xdep.c \
vax-pinsn.c \ vax-pinsn.c \
vx-share/xdr_ld.c vx-share/xdr_ptrace.c vx-share/xdr_rdb.c \ vx-share/xdr_ld.c vx-share/xdr_ptrace.c vx-share/xdr_rdb.c \
xcoffexec.c xcoffread.c xcoffsolib.c z8k-tdep.c xcoffread.c xcoffsolib.c z8k-tdep.c
ALLCONFIG = config/a29k/a29k-kern.mt config/a29k/a29k-udi.mt \ ALLCONFIG = config/a29k/a29k-kern.mt config/a29k/a29k-udi.mt \
config/a29k/a29k.mt config/a29k/ultra3.mh config/a29k/ultra3.mt \ config/a29k/a29k.mt config/a29k/ultra3.mh config/a29k/ultra3.mt \
@ -1009,6 +1014,16 @@ c-typeprint.o: c-typeprint.c c-lang.h $(defs_h) $(expression_h) \
c-valprint.o: c-valprint.c $(defs_h) $(expression_h) $(gdbtypes_h) \ c-valprint.o: c-valprint.c $(defs_h) $(expression_h) $(gdbtypes_h) \
language.h $(symtab_h) valprint.h $(value_h) language.h $(symtab_h) valprint.h $(value_h)
f-lang.o: f-lang.c f-lang.h $(defs_h) $(expression_h) $(gdbtypes_h) \
language.h parser-defs.h $(symtab_h)
f-typeprint.o: f-typeprint.c f-lang.h $(defs_h) $(expression_h) \
$(gdbcmd_h) $(gdbcore_h) $(gdbtypes_h) language.h $(symtab_h) target.h \
typeprint.h $(value_h)
f-valprint.o: f-valprint.c $(defs_h) $(expression_h) $(gdbtypes_h) \
language.h $(symtab_h) valprint.h $(value_h)
ch-lang.o: ch-lang.c ch-lang.h $(defs_h) $(expression_h) $(gdbtypes_h) \ ch-lang.o: ch-lang.c ch-lang.h $(defs_h) $(expression_h) $(gdbtypes_h) \
language.h parser-defs.h $(symtab_h) language.h parser-defs.h $(symtab_h)
@ -1185,8 +1200,6 @@ top.o: top.c top.h $(bfd_h) $(getopt_h) $(readline_headers) call-cmds.h \
main.o: main.c top.h $(defs_h) main.o: main.c top.h $(defs_h)
annotate.o: annotate.c annotate.h $(defs_h) value.h target.h $(gdbtypes_h)
maint.o: maint.c $(defs_h) $(gdbcmd_h) $(gdbtypes_h) $(symtab_h) language.h \ maint.o: maint.c $(defs_h) $(gdbcmd_h) $(gdbtypes_h) $(symtab_h) language.h \
$(expression_h) $(expression_h)
@ -1233,8 +1246,7 @@ ttyflush.o: nindy-share/ttyflush.c
nindy-tdep.o: nindy-tdep.c $(defs_h) $(frame_h) $(symtab_h) nindy-tdep.o: nindy-tdep.c $(defs_h) $(frame_h) $(symtab_h)
ns32k-pinsn.o: ns32k-pinsn.c $(defs_h) $(gdbcore_h) ns32k-opcode.h \ ns32k-pinsn.o: ns32k-pinsn.c $(bfd_h) $(dis-asm_h) $(defs_h)
$(symtab_h)
objfiles.o: objfiles.c $(bfd_h) $(defs_h) objfiles.h symfile.h \ objfiles.o: objfiles.c $(bfd_h) $(defs_h) objfiles.h symfile.h \
$(symtab_h) $(symtab_h)
@ -1420,9 +1432,6 @@ xdr_rdb.o: vx-share/xdr_rdb.c $(defs_h) vx-share/vxTypes.h \
vx-share/vxWorks.h vx-share/xdr_rdb.h vx-share/vxWorks.h vx-share/xdr_rdb.h
$(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/vx-share/xdr_rdb.c $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/vx-share/xdr_rdb.c
xcoffexec.o: xcoffexec.c $(BFD_SRC)/libbfd.h $(defs_h) $(gdbcmd_h) \
$(gdbcore_h) $(inferior_h) objfiles.h symfile.h target.h xcoffsolib.h
xcoffread.o: xcoffread.c $(bfd_h) $(INCLUDE_DIR)/aout/stab.def \ xcoffread.o: xcoffread.c $(bfd_h) $(INCLUDE_DIR)/aout/stab.def \
$(INCLUDE_DIR)/aout/stab_gnu.h $(INCLUDE_DIR)/coff/internal.h \ $(INCLUDE_DIR)/aout/stab_gnu.h $(INCLUDE_DIR)/coff/internal.h \
$(INCLUDE_DIR)/coff/rs6000.h $(BFD_SRC)/libcoff.h buildsym.h \ $(INCLUDE_DIR)/coff/rs6000.h $(BFD_SRC)/libcoff.h buildsym.h \

@ -284,6 +284,48 @@ coff_locate_sections (ignore_abfd, sectp, csip)
} }
} }
/* Return the section_offsets* that CS points to. */
static int cs_to_section PARAMS ((struct coff_symbol *, struct objfile *));
struct find_targ_sec_arg {
int targ_index;
int *resultp;
};
static void find_targ_sec PARAMS ((bfd *, asection *, void *));
static void find_targ_sec (abfd, sect, obj)
bfd *abfd;
asection *sect;
PTR obj;
{
struct find_targ_sec_arg *args = (struct find_targ_sec_arg *)obj;
if (sect->target_index == args->targ_index)
{
/* This is the section. Figure out what SECT_OFF_* code it is. */
if (bfd_get_section_flags (abfd, sect) & SEC_CODE)
*args->resultp = SECT_OFF_TEXT;
else if (bfd_get_section_flags (abfd, sect) & SEC_LOAD)
*args->resultp = SECT_OFF_DATA;
else
*args->resultp = SECT_OFF_BSS;
}
}
/* Return the section number (SECT_OFF_*) that CS points to. */
static int
cs_to_section (cs, objfile)
struct coff_symbol *cs;
struct objfile *objfile;
{
int off = SECT_OFF_TEXT;
struct find_targ_sec_arg args;
args.targ_index = cs->c_secnum;
args.resultp = &off;
bfd_map_over_sections (objfile->obfd, find_targ_sec, &args);
return off;
}
/* Look up a coff type-number index. Return the address of the slot /* Look up a coff type-number index. Return the address of the slot
where the type for that index is stored. where the type for that index is stored.
The type-number is in INDEX. The type-number is in INDEX.
@ -482,13 +524,10 @@ record_minimal_symbol (name, address, type, objfile)
The ultimate result is a new symtab (or, FIXME, eventually a psymtab). */ The ultimate result is a new symtab (or, FIXME, eventually a psymtab). */
static int text_bfd_scnum;
static void static void
coff_symfile_init (objfile) coff_symfile_init (objfile)
struct objfile *objfile; struct objfile *objfile;
{ {
asection *section;
bfd *abfd = objfile->obfd; bfd *abfd = objfile->obfd;
/* Allocate struct to keep track of stab reading. */ /* Allocate struct to keep track of stab reading. */
@ -504,13 +543,6 @@ coff_symfile_init (objfile)
memset (objfile->sym_private, 0, sizeof (struct coff_symfile_info)); memset (objfile->sym_private, 0, sizeof (struct coff_symfile_info));
init_entry_point_info (objfile); init_entry_point_info (objfile);
/* Save the section number for the text section */
section = bfd_get_section_by_name (abfd, ".text");
if (section)
text_bfd_scnum = section->index;
else
text_bfd_scnum = -1;
} }
/* This function is called for every section; it finds the outer limits /* This function is called for every section; it finds the outer limits
@ -867,36 +899,39 @@ coff_symtab_read (symtab_offset, nsyms, section_offsets, objfile)
break; break;
/* fall in for static symbols that don't start with '.' */ /* fall in for static symbols that don't start with '.' */
case C_EXT: case C_EXT:
/* Record it in the minimal symbols regardless of SDB_TYPE. {
This parallels what we do for other debug formats, and /* Record it in the minimal symbols regardless of
probably is needed to make print_address_symbolic work right SDB_TYPE. This parallels what we do for other debug
without the (now gone) "set fast-symbolic-addr off" kludge. */ formats, and probably is needed to make
print_address_symbolic work right without the (now
gone) "set fast-symbolic-addr off" kludge. */
/* FIXME: This bogusly assumes the sections are in a certain /* FIXME: should use mst_abs, and not relocate, if absolute. */
order, text (SEC_CODE) sections are before data sections, enum minimal_symbol_type ms_type;
etc. */ int sec = cs_to_section (cs, objfile);
if (cs->c_secnum <= text_bfd_scnum+1)
{
/* text or absolute. (FIXME, should use mst_abs if
absolute). */
tmpaddr = cs->c_value; tmpaddr = cs->c_value;
if (cs->c_sclass != C_STAT) if (cs->c_sclass != C_STAT)
tmpaddr += ANOFFSET (section_offsets, SECT_OFF_TEXT); tmpaddr += ANOFFSET (section_offsets, sec);
record_minimal_symbol switch (sec)
(cs->c_name, tmpaddr,
cs->c_sclass == C_STAT ? mst_file_text : mst_text,
objfile);
}
else
{ {
tmpaddr = cs->c_value; case SECT_OFF_TEXT:
if (cs->c_sclass != C_STAT) case SECT_OFF_RODATA:
tmpaddr += ANOFFSET (section_offsets, SECT_OFF_DATA); ms_type = cs->c_sclass == C_STAT ? mst_file_text : mst_text;
record_minimal_symbol break;
(cs->c_name, tmpaddr, case SECT_OFF_DATA:
cs->c_sclass == C_STAT ? mst_file_data : mst_data, ms_type = cs->c_sclass == C_STAT ? mst_file_data : mst_data;
objfile); break;
case SECT_OFF_BSS:
ms_type = cs->c_sclass == C_STAT ? mst_file_bss : mst_bss;
break;
default:
ms_type = mst_unknown;
break;
} }
record_minimal_symbol (cs->c_name, tmpaddr, ms_type, objfile);
}
if (SDB_TYPE (cs->c_type)) if (SDB_TYPE (cs->c_type))
process_coff_symbol (cs, &main_aux, section_offsets, objfile); process_coff_symbol (cs, &main_aux, section_offsets, objfile);
break; break;
@ -1362,6 +1397,7 @@ process_coff_symbol (cs, aux, section_offsets, objfile)
/* default assumptions */ /* default assumptions */
SYMBOL_VALUE (sym) = cs->c_value; SYMBOL_VALUE (sym) = cs->c_value;
SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE; SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
SYMBOL_SECTION (sym) = cs_to_section (cs, objfile);
if (ISFCN (cs->c_type)) if (ISFCN (cs->c_type))
{ {
@ -1443,13 +1479,15 @@ process_coff_symbol (cs, aux, section_offsets, objfile)
add_param_to_type(&in_function_type,sym); add_param_to_type(&in_function_type,sym);
#endif #endif
add_symbol_to_list (sym, &local_symbols); add_symbol_to_list (sym, &local_symbols);
#if !defined (BELIEVE_PCC_PROMOTION) && (TARGET_BYTE_ORDER == BIG_ENDIAN) #if !defined (BELIEVE_PCC_PROMOTION)
if (TARGET_BYTE_ORDER == BIG_ENDIAN)
{ {
/* If PCC says a parameter is a short or a char, /* If PCC says a parameter is a short or a char,
aligned on an int boundary, realign it to the "little end" aligned on an int boundary, realign it to the
of the int. */ "little end" of the int. */
struct type *temptype; struct type *temptype;
temptype = lookup_fundamental_type (current_objfile, FT_INTEGER); temptype = lookup_fundamental_type (current_objfile,
FT_INTEGER);
if (TYPE_LENGTH (SYMBOL_TYPE (sym)) < TYPE_LENGTH (temptype) if (TYPE_LENGTH (SYMBOL_TYPE (sym)) < TYPE_LENGTH (temptype)
&& TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT
&& 0 == SYMBOL_VALUE (sym) % TYPE_LENGTH (temptype)) && 0 == SYMBOL_VALUE (sym) % TYPE_LENGTH (temptype))

@ -103,11 +103,16 @@ exec_close (quitting)
need_symtab_cleanup = 1; need_symtab_cleanup = 1;
} }
else if (vp->bfd != exec_bfd) else if (vp->bfd != exec_bfd)
bfd_close (vp->bfd); /* FIXME-leak: We should be freeing vp->name too, I think. */
if (!bfd_close (vp->bfd))
warning ("cannot close \"%s\": %s",
vp->name, bfd_errmsg (bfd_get_error ()));
/* FIXME: This routine is #if 0'd in symfile.c. What should we /* FIXME: This routine is #if 0'd in symfile.c. What should we
be doing here? Should we just free everything in be doing here? Should we just free everything in
vp->objfile->symtabs? Should free_objfile do that? */ vp->objfile->symtabs? Should free_objfile do that?
FIXME-as-well: free_objfile already free'd vp->name, so it isn't
valid here. */
free_named_symtabs (vp->name); free_named_symtabs (vp->name);
free (vp); free (vp);
} }
@ -118,7 +123,9 @@ exec_close (quitting)
{ {
char *name = bfd_get_filename (exec_bfd); char *name = bfd_get_filename (exec_bfd);
bfd_close (exec_bfd); if (!bfd_close (exec_bfd))
warning ("cannot close \"%s\": %s",
name, bfd_errmsg (bfd_get_error ()));
free (name); free (name);
exec_bfd = NULL; exec_bfd = NULL;
} }
@ -229,6 +236,8 @@ exec_file_command (args, from_tty)
/* Set text_start to the lowest address of the start of any /* Set text_start to the lowest address of the start of any
readonly code section and set text_end to the highest readonly code section and set text_end to the highest
address of the end of any readonly code section. */ address of the end of any readonly code section. */
/* FIXME: The comment above does not match the code. The code
checks for sections with are either code *or* readonly. */
text_start = ~(CORE_ADDR)0; text_start = ~(CORE_ADDR)0;
text_end = (CORE_ADDR)0; text_end = (CORE_ADDR)0;
@ -366,7 +375,7 @@ map_vmap (abfd, arch)
struct vmap_and_bfd vmap_bfd; struct vmap_and_bfd vmap_bfd;
struct vmap *vp, **vpp; struct vmap *vp, **vpp;
vp = (PTR) xmalloc (sizeof (*vp)); vp = (struct vmap *) xmalloc (sizeof (*vp));
memset ((char *) vp, '\0', sizeof (*vp)); memset ((char *) vp, '\0', sizeof (*vp));
vp->nxt = 0; vp->nxt = 0;
vp->bfd = abfd; vp->bfd = abfd;

@ -28,6 +28,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "symtab.h" #include "symtab.h"
#include "complaints.h" #include "complaints.h"
#include "gdbcmd.h" #include "gdbcmd.h"
#include "bfd.h" /* Required by objfiles.h. */
#include "symfile.h" /* Required by objfiles.h. */
#include "objfiles.h"
#include "gdb-stabs.h"
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
@ -96,7 +100,7 @@ net_load (filename, pTextAddr, pDataAddr, pBssAddr)
CORE_ADDR *pTextAddr; CORE_ADDR *pTextAddr;
CORE_ADDR *pDataAddr; CORE_ADDR *pDataAddr;
CORE_ADDR *pBssAddr; CORE_ADDR *pBssAddr;
{ {
enum clnt_stat status; enum clnt_stat status;
struct ldfile ldstruct; struct ldfile ldstruct;
struct timeval load_timeout; struct timeval load_timeout;
@ -129,7 +133,7 @@ net_load (filename, pTextAddr, pDataAddr, pBssAddr)
} }
else else
return -1; return -1;
} }
/* returns 0 if successful, errno if RPC failed or VxWorks complains. */ /* returns 0 if successful, errno if RPC failed or VxWorks complains. */
@ -137,7 +141,7 @@ static int
net_break (addr, procnum) net_break (addr, procnum)
int addr; int addr;
u_long procnum; u_long procnum;
{ {
enum clnt_stat status; enum clnt_stat status;
int break_status; int break_status;
Rptrace ptrace_in; /* XXX This is stupid. It doesn't need to be a ptrace Rptrace ptrace_in; /* XXX This is stupid. It doesn't need to be a ptrace
@ -158,25 +162,25 @@ net_break (addr, procnum)
if (break_status == -1) if (break_status == -1)
return ENOMEM; return ENOMEM;
return break_status; /* probably (FIXME) zero */ return break_status; /* probably (FIXME) zero */
} }
/* returns 0 if successful, errno otherwise */ /* returns 0 if successful, errno otherwise */
static int static int
vx_insert_breakpoint (addr) vx_insert_breakpoint (addr)
int addr; int addr;
{ {
return net_break (addr, VX_BREAK_ADD); return net_break (addr, VX_BREAK_ADD);
} }
/* returns 0 if successful, errno otherwise */ /* returns 0 if successful, errno otherwise */
static int static int
vx_remove_breakpoint (addr) vx_remove_breakpoint (addr)
int addr; int addr;
{ {
return net_break (addr, VX_BREAK_DELETE); return net_break (addr, VX_BREAK_DELETE);
} }
/* Start an inferior process and sets inferior_pid to its pid. /* Start an inferior process and sets inferior_pid to its pid.
EXEC_FILE is the file to run. EXEC_FILE is the file to run.
@ -333,7 +337,8 @@ net_wait (pEvent)
memset ((char *) pEvent, '\0', sizeof (RDB_EVENT)); memset ((char *) pEvent, '\0', sizeof (RDB_EVENT));
pid = inferior_pid; pid = inferior_pid;
status = net_clnt_call (PROCESS_WAIT, xdr_int, &pid, xdr_RDB_EVENT, pEvent); status = net_clnt_call (PROCESS_WAIT, xdr_int, &pid, xdr_RDB_EVENT,
pEvent);
return (status == RPC_SUCCESS)? pEvent->status: -1; return (status == RPC_SUCCESS)? pEvent->status: -1;
} }
@ -437,7 +442,7 @@ vx_prepare_to_store ()
/* Store our register values back into the inferior. /* Store our register values back into the inferior.
If REGNO is -1, do this for all registers. If REGNO is -1, do this for all registers.
Otherwise, REGNO specifies which register (so we can save time). */ Otherwise, REGNO specifies which register (so we can save time). */
/* FIXME, look at REGNO to save time here */ /* FIXME, look at REGNO to save time here */
static void static void
vx_write_register (regno) vx_write_register (regno)
@ -484,7 +489,8 @@ vx_write_register (regno)
in_data.bytes = &registers[REGISTER_BYTE (FP0_REGNUM)]; in_data.bytes = &registers[REGISTER_BYTE (FP0_REGNUM)];
in_data.len = VX_SIZE_FPREGS; in_data.len = VX_SIZE_FPREGS;
status = net_ptrace_clnt_call (PTRACE_SETFPREGS, &ptrace_in, &ptrace_out); status = net_ptrace_clnt_call (PTRACE_SETFPREGS, &ptrace_in,
&ptrace_out);
if (status) if (status)
error (rpcerr); error (rpcerr);
if (ptrace_out.status == -1) if (ptrace_out.status == -1)
@ -533,7 +539,8 @@ vx_xfer_memory (memaddr, myaddr, len, write, target)
data.len = len; /* How many bytes (again, for XDR) */ data.len = len; /* How many bytes (again, for XDR) */
/* XXX change second param to be a proc number */ /* XXX change second param to be a proc number */
status = net_ptrace_clnt_call (PTRACE_WRITEDATA, &ptrace_in, &ptrace_out); status = net_ptrace_clnt_call (PTRACE_WRITEDATA, &ptrace_in,
&ptrace_out);
} }
else else
{ {
@ -615,11 +622,78 @@ vx_mourn_inferior ()
} }
static void vx_add_symbols PARAMS ((char *, int, CORE_ADDR, CORE_ADDR,
CORE_ADDR));
struct find_sect_args {
CORE_ADDR text_start;
CORE_ADDR data_start;
CORE_ADDR bss_start;
};
static void find_sect PARAMS ((bfd *, asection *, void *));
static void
find_sect (abfd, sect, obj)
bfd *abfd;
asection *sect;
PTR obj;
{
struct find_sect_args *args = (struct find_sect_args *)obj;
if (bfd_get_section_flags (abfd, sect) & (SEC_CODE & SEC_READONLY))
args->text_start = bfd_get_section_vma (abfd, sect);
else if (bfd_get_section_flags (abfd, sect) & SEC_ALLOC)
{
if (bfd_get_section_flags (abfd, sect) & SEC_LOAD)
{
/* Exclude .ctor and .dtor sections which have SEC_CODE set but not
SEC_DATA. */
if (bfd_get_section_flags (abfd, sect) & SEC_DATA)
args->data_start = bfd_get_section_vma (abfd, sect);
}
else
args->bss_start = bfd_get_section_vma (abfd, sect);
}
}
static void
vx_add_symbols (name, from_tty, text_addr, data_addr, bss_addr)
char *name;
int from_tty;
CORE_ADDR text_addr;
CORE_ADDR data_addr;
CORE_ADDR bss_addr;
{
struct section_offsets *offs;
struct objfile *objfile;
struct find_sect_args ss;
objfile = symbol_file_add (name, from_tty, 0, 0, 0, 0);
offs = (struct section_offsets *)
alloca (sizeof (struct section_offsets)
+ objfile->num_sections * sizeof (offs->offsets));
memcpy (offs, objfile->section_offsets,
sizeof (struct section_offsets)
+ objfile->num_sections * sizeof (offs->offsets));
ss.text_start = 0;
ss.data_start = 0;
ss.bss_start = 0;
bfd_map_over_sections (objfile->obfd, find_sect, &ss);
/* Both COFF and b.out frontends use these SECT_OFF_* values. */
ANOFFSET (offs, SECT_OFF_TEXT) = text_addr - ss.text_start;
ANOFFSET (offs, SECT_OFF_DATA) = data_addr - ss.data_start;
ANOFFSET (offs, SECT_OFF_BSS) = bss_addr - ss.bss_start;
objfile_relocate (objfile, offs);
}
/* This function allows the addition of incrementally linked object files. */ /* This function allows the addition of incrementally linked object files. */
static void static void
vx_load_command (arg_string, from_tty) vx_load_command (arg_string, from_tty)
char* arg_string; char *arg_string;
int from_tty; int from_tty;
{ {
CORE_ADDR text_addr; CORE_ADDR text_addr;
@ -640,8 +714,7 @@ vx_load_command (arg_string, from_tty)
error ("Load failed on target machine"); error ("Load failed on target machine");
immediate_quit--; immediate_quit--;
/* FIXME, for now we ignore data_addr and bss_addr. */ vx_add_symbols (arg_string, from_tty, text_addr, data_addr, bss_addr);
symbol_file_add (arg_string, from_tty, text_addr, 0, 0, 0);
/* Getting new symbols may change our opinion about what is /* Getting new symbols may change our opinion about what is
frameless. */ frameless. */
@ -757,7 +830,8 @@ vx_lookup_symbol (name, pAddr)
status = net_clnt_call (VX_SYMBOL_INQ, xdr_wrapstring, &name, status = net_clnt_call (VX_SYMBOL_INQ, xdr_wrapstring, &name,
xdr_SYMBOL_ADDR, &symbolAddr); xdr_SYMBOL_ADDR, &symbolAddr);
if (status != RPC_SUCCESS) { if (status != RPC_SUCCESS)
{
complain (&cant_contact_target); complain (&cant_contact_target);
return -1; return -1;
} }
@ -802,6 +876,9 @@ net_connect (host)
{ {
destHost = (struct hostent *) gethostbyname (host); destHost = (struct hostent *) gethostbyname (host);
if (destHost == NULL) if (destHost == NULL)
/* FIXME: Probably should include hostname here in quotes.
For example if the user types "target vxworks vx960 " it should
say "Invalid host `vx960 '." not just "Invalid hostname". */
error ("Invalid hostname. Couldn't find remote host address."); error ("Invalid hostname. Couldn't find remote host address.");
addr = * (unsigned long *) destHost->h_addr; addr = * (unsigned long *) destHost->h_addr;
} }
@ -818,7 +895,8 @@ net_connect (host)
ptraceSock = RPC_ANYSOCK; ptraceSock = RPC_ANYSOCK;
pClient = clnttcp_create (&destAddr, RDBPROG, RDBVERS, &ptraceSock, 0, 0); pClient = clnttcp_create (&destAddr, RDBPROG, RDBVERS, &ptraceSock, 0, 0);
/* FIXME, here is where we deal with different version numbers of the proto */ /* FIXME, here is where we deal with different version numbers of the
proto */
if (pClient == NULL) if (pClient == NULL)
{ {
@ -843,24 +921,13 @@ sleep_ms (ms)
select_timeout.tv_sec = 0; select_timeout.tv_sec = 0;
select_timeout.tv_usec = ms * 1000; select_timeout.tv_usec = ms * 1000;
status = select (0, (fd_set *) 0, (fd_set *) 0, (fd_set *) 0, &select_timeout); status = select (0, (fd_set *) 0, (fd_set *) 0, (fd_set *) 0,
&select_timeout);
if (status < 0 && errno != EINTR) if (status < 0 && errno != EINTR)
perror_with_name ("select"); perror_with_name ("select");
} }
/* Wait for control to return from inferior to debugger.
If inferior gets a signal, we may decide to start it up again
instead of returning. That is why there is a loop in this function.
When this function actually returns it means the inferior
should be left stopped and GDB should read more commands. */
/* For network debugging with VxWorks.
* VxWorks knows when tasks hit breakpoints, receive signals, exit, etc,
* so vx_wait() receives this information directly from
* VxWorks instead of trying to figure out what happenned via a wait() call.
*/
static int static int
vx_wait (pid_to_wait_for, status) vx_wait (pid_to_wait_for, status)
int pid_to_wait_for; int pid_to_wait_for;
@ -984,7 +1051,8 @@ add_symbol_stub (arg)
struct ldfile *pLoadFile = (struct ldfile *)arg; struct ldfile *pLoadFile = (struct ldfile *)arg;
printf_unfiltered("\t%s: ", pLoadFile->name); printf_unfiltered("\t%s: ", pLoadFile->name);
symbol_file_add (pLoadFile->name, 0, pLoadFile->txt_addr, 0, 0, 0); vx_add_symbols (pLoadFile->name, 0, pLoadFile->txt_addr,
pLoadFile->data_addr, pLoadFile->bss_addr);
printf_unfiltered ("ok\n"); printf_unfiltered ("ok\n");
return 1; return 1;
} }
@ -1042,13 +1110,19 @@ vx_open (args, from_tty)
bootFile = NULL; bootFile = NULL;
if (!net_get_boot_file (&bootFile)) if (!net_get_boot_file (&bootFile))
{ {
if (*bootFile) { if (*bootFile)
{
printf_filtered ("\t%s: ", bootFile); printf_filtered ("\t%s: ", bootFile);
/* This assumes that the kernel is never relocated. Hope that is an
accurate assumption. */
if (catch_errors if (catch_errors
(symbol_stub, bootFile, (symbol_stub,
"Error while reading symbols from boot file:\n", RETURN_MASK_ALL)) bootFile,
"Error while reading symbols from boot file:\n",
RETURN_MASK_ALL))
puts_filtered ("ok\n"); puts_filtered ("ok\n");
} else if (from_tty) }
else if (from_tty)
printf_unfiltered ("VxWorks kernel symbols not loaded.\n"); printf_unfiltered ("VxWorks kernel symbols not loaded.\n");
} }
else else
@ -1079,9 +1153,10 @@ vx_open (args, from_tty)
do_cleanups (old_chain); do_cleanups (old_chain);
} }
#else #else
/* Botches, FIXME: /* FIXME: Is there something better to search than the PATH? (probably
(1) Searches the PATH, not the source path. not the source path, since source might be in different directories
(2) data and bss are assumed to be at the usual offsets from text. */ than objects. */
if (catch_errors (add_symbol_stub, (char *)pLoadFile, (char *)0, if (catch_errors (add_symbol_stub, (char *)pLoadFile, (char *)0,
RETURN_MASK_ALL)) RETURN_MASK_ALL))
symbols_added = 1; symbols_added = 1;
@ -1323,8 +1398,8 @@ struct target_ops vx_run_ops = {
0, /* can_run */ 0, /* can_run */
0, /* notice_signals */ 0, /* notice_signals */
process_stratum, 0, /* next */ process_stratum, 0, /* next */
0, 1, 1, 1, 1, /* all mem, mem, stack, regs, exec */ 0, /* all_mem--off to avoid spurious msg in "i files" */
/* all_mem is off to avoid spurious msg in "i files" */ 1, 1, 1, 1, /* mem, stack, regs, exec */
0, 0, /* Section pointers */ 0, 0, /* Section pointers */
OPS_MAGIC, /* Always the last thing */ OPS_MAGIC, /* Always the last thing */
}; };
@ -1333,7 +1408,6 @@ struct target_ops vx_run_ops = {
void void
_initialize_vx () _initialize_vx ()
{ {
add_show_from_set add_show_from_set
(add_set_cmd ("vxworks-timeout", class_support, var_uinteger, (add_set_cmd ("vxworks-timeout", class_support, var_uinteger,
(char *) &rpcTimeout.tv_sec, (char *) &rpcTimeout.tv_sec,