From b2259038ba4e56f7b9e09f4e909596ef2d795b40 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 9 Jan 2013 17:21:36 +0000 Subject: [PATCH] * config/pa/hpux.mh (NATDEPFILES): Remove somread.o. * configure: Rebuild. * configure.ac: Add somread.o to the build if BFD has SOM support. * somread.c: Include som/aout.h, not syms.h. (som_symtab_read): Use som_external_symbol_dictionary_record. Unpack records manually. (_initialize_somread): Declare. --- gdb/ChangeLog | 11 ++++++ gdb/config/pa/hpux.mh | 2 +- gdb/configure | 52 ++++++++++++++++++++++++ gdb/configure.ac | 7 ++++ gdb/somread.c | 92 +++++++++++++++++++++---------------------- 5 files changed, 117 insertions(+), 47 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3928ac63f88..f27ddf018b9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2013-01-09 Tom Tromey + + * config/pa/hpux.mh (NATDEPFILES): Remove somread.o. + * configure: Rebuild. + * configure.ac: Add somread.o to the build if BFD has SOM + support. + * somread.c: Include som/aout.h, not syms.h. + (som_symtab_read): Use som_external_symbol_dictionary_record. + Unpack records manually. + (_initialize_somread): Declare. + 2012-01-08 Mike Frysinger * common/linux-ptrace.c (linux_ptrace_test_ret_to_nx) [__x86_64__]: diff --git a/gdb/config/pa/hpux.mh b/gdb/config/pa/hpux.mh index e88bddbf919..3151120c29e 100644 --- a/gdb/config/pa/hpux.mh +++ b/gdb/config/pa/hpux.mh @@ -1,3 +1,3 @@ # Host: PA-RISC HP-UX NATDEPFILES= fork-child.o inf-ptrace.o inf-ttrace.o \ - hppa-hpux-nat.o somread.o + hppa-hpux-nat.o diff --git a/gdb/configure b/gdb/configure index 62731934c18..c54709cc085 100755 --- a/gdb/configure +++ b/gdb/configure @@ -12674,6 +12674,58 @@ if test $gdb_cv_var_macho = yes; then CONFIG_OBS="$CONFIG_OBS machoread.o" fi +# Add SOM support to GDB, but only if BFD includes it. + + OLD_CFLAGS=$CFLAGS + OLD_LDFLAGS=$LDFLAGS + OLD_LIBS=$LIBS + # Put the old CFLAGS/LDFLAGS last, in case the user's (C|LD)FLAGS + # points somewhere with bfd, with -I/foo/lib and -L/foo/lib. We + # always want our bfd. + CFLAGS="-I${srcdir}/../include -I../bfd -I${srcdir}/../bfd $CFLAGS" + LDFLAGS="-L../bfd -L../libiberty $LDFLAGS" + intl=`echo $LIBINTL | sed 's,${top_builddir}/,,g'` + # -ldl is provided by bfd/Makfile.am (LIBDL) . + if test "$plugins" = "yes"; then + LIBS="-ldl $LIBS" + fi + LIBS="-lbfd -liberty $intl $LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOM support in BFD" >&5 +$as_echo_n "checking for SOM support in BFD... " >&6; } +if test "${gdb_cv_var_som+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include "bfd.h" + #include "som.h" + +int +main () +{ +return bfd_som_attach_aux_hdr (NULL, 0, NULL); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gdb_cv_var_som=yes +else + gdb_cv_var_som=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gdb_cv_var_som" >&5 +$as_echo "$gdb_cv_var_som" >&6; } + CFLAGS=$OLD_CFLAGS + LDFLAGS=$OLD_LDFLAGS + LIBS=$OLD_LIBS +if test $gdb_cv_var_som = yes; then + CONFIG_OBS="$CONFIG_OBS somread.o" +fi + # Add any host-specific objects to GDB. CONFIG_OBS="${CONFIG_OBS} ${gdb_host_obs}" diff --git a/gdb/configure.ac b/gdb/configure.ac index de096b8d2a7..e501766034f 100644 --- a/gdb/configure.ac +++ b/gdb/configure.ac @@ -2034,6 +2034,13 @@ if test $gdb_cv_var_macho = yes; then CONFIG_OBS="$CONFIG_OBS machoread.o" fi +# Add SOM support to GDB, but only if BFD includes it. +GDB_AC_CHECK_BFD([for SOM support in BFD], gdb_cv_var_som, + [bfd_som_attach_aux_hdr (NULL, 0, NULL)], som.h) +if test $gdb_cv_var_som = yes; then + CONFIG_OBS="$CONFIG_OBS somread.o" +fi + # Add any host-specific objects to GDB. CONFIG_OBS="${CONFIG_OBS} ${gdb_host_obs}" diff --git a/gdb/somread.c b/gdb/somread.c index 2d619f3279b..d9d3e7bb72b 100644 --- a/gdb/somread.c +++ b/gdb/somread.c @@ -19,7 +19,7 @@ #include "defs.h" #include "bfd.h" -#include +#include "som/aout.h" #include "symtab.h" #include "symfile.h" #include "objfiles.h" @@ -51,9 +51,9 @@ som_symtab_read (bfd *abfd, struct objfile *objfile, int val, dynamic; char *stringtab; asection *shlib_info; - struct symbol_dictionary_record *buf, *bufp, *endbufp; + struct som_external_symbol_dictionary_record *buf, *bufp, *endbufp; char *symname; - CONST int symsize = sizeof (struct symbol_dictionary_record); + CONST int symsize = sizeof (struct som_external_symbol_dictionary_record); CORE_ADDR text_offset, data_offset; @@ -100,14 +100,20 @@ som_symtab_read (bfd *abfd, struct objfile *objfile, for (bufp = buf; bufp < endbufp; ++bufp) { enum minimal_symbol_type ms_type; + unsigned int flags = bfd_getb32 (bufp->flags); + unsigned int symbol_type + = (flags >> SOM_SYMBOL_TYPE_SH) & SOM_SYMBOL_TYPE_MASK; + unsigned int symbol_scope + = (flags >> SOM_SYMBOL_SCOPE_SH) & SOM_SYMBOL_SCOPE_MASK; + CORE_ADDR symbol_value = bfd_getb32 (bufp->symbol_value); QUIT; - switch (bufp->symbol_scope) + switch (symbol_scope) { case SS_UNIVERSAL: case SS_EXTERNAL: - switch (bufp->symbol_type) + switch (symbol_type) { case ST_SYM_EXT: case ST_ARG_EXT: @@ -117,15 +123,14 @@ som_symtab_read (bfd *abfd, struct objfile *objfile, case ST_PRI_PROG: case ST_SEC_PROG: case ST_MILLICODE: - symname = bufp->name.n_strx + stringtab; + symname = bfd_getb32 (bufp->name) + stringtab; ms_type = mst_text; - bufp->symbol_value += text_offset; - bufp->symbol_value = gdbarch_addr_bits_remove - (gdbarch, bufp->symbol_value); + symbol_value += text_offset; + symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value); break; case ST_ENTRY: - symname = bufp->name.n_strx + stringtab; + symname = bfd_getb32 (bufp->name) + stringtab; /* For a dynamic executable, ST_ENTRY symbols are the stubs, while the ST_CODE symbol is the real function. */ @@ -133,22 +138,20 @@ som_symtab_read (bfd *abfd, struct objfile *objfile, ms_type = mst_solib_trampoline; else ms_type = mst_text; - bufp->symbol_value += text_offset; - bufp->symbol_value = gdbarch_addr_bits_remove - (gdbarch, bufp->symbol_value); + symbol_value += text_offset; + symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value); break; case ST_STUB: - symname = bufp->name.n_strx + stringtab; + symname = bfd_getb32 (bufp->name) + stringtab; ms_type = mst_solib_trampoline; - bufp->symbol_value += text_offset; - bufp->symbol_value = gdbarch_addr_bits_remove - (gdbarch, bufp->symbol_value); + symbol_value += text_offset; + symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value); break; case ST_DATA: - symname = bufp->name.n_strx + stringtab; - bufp->symbol_value += data_offset; + symname = bfd_getb32 (bufp->name) + stringtab; + symbol_value += data_offset; ms_type = mst_data; break; default: @@ -161,18 +164,17 @@ som_symtab_read (bfd *abfd, struct objfile *objfile, case SS_GLOBAL: #endif case SS_LOCAL: - switch (bufp->symbol_type) + switch (symbol_type) { case ST_SYM_EXT: case ST_ARG_EXT: continue; case ST_CODE: - symname = bufp->name.n_strx + stringtab; + symname = bfd_getb32 (bufp->name) + stringtab; ms_type = mst_file_text; - bufp->symbol_value += text_offset; - bufp->symbol_value = gdbarch_addr_bits_remove - (gdbarch, bufp->symbol_value); + symbol_value += text_offset; + symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value); check_strange_names: /* Utah GCC 2.5, FSF GCC 2.6 and later generate correct local @@ -200,37 +202,34 @@ som_symtab_read (bfd *abfd, struct objfile *objfile, case ST_PRI_PROG: case ST_SEC_PROG: case ST_MILLICODE: - symname = bufp->name.n_strx + stringtab; + symname = bfd_getb32 (bufp->name) + stringtab; ms_type = mst_file_text; - bufp->symbol_value += text_offset; - bufp->symbol_value = gdbarch_addr_bits_remove - (gdbarch, bufp->symbol_value); + symbol_value += text_offset; + symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value); break; case ST_ENTRY: - symname = bufp->name.n_strx + stringtab; + symname = bfd_getb32 (bufp->name) + stringtab; /* SS_LOCAL symbols in a shared library do not have export stubs, so we do not have to worry about using mst_file_text vs mst_solib_trampoline here like we do for SS_UNIVERSAL and SS_EXTERNAL symbols above. */ ms_type = mst_file_text; - bufp->symbol_value += text_offset; - bufp->symbol_value = gdbarch_addr_bits_remove - (gdbarch, bufp->symbol_value); + symbol_value += text_offset; + symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value); break; case ST_STUB: - symname = bufp->name.n_strx + stringtab; + symname = bfd_getb32 (bufp->name) + stringtab; ms_type = mst_solib_trampoline; - bufp->symbol_value += text_offset; - bufp->symbol_value = gdbarch_addr_bits_remove - (gdbarch, bufp->symbol_value); + symbol_value += text_offset; + symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value); break; case ST_DATA: - symname = bufp->name.n_strx + stringtab; - bufp->symbol_value += data_offset; + symname = bfd_getb32 (bufp->name) + stringtab; + symbol_value += data_offset; ms_type = mst_file_data; goto check_strange_names; @@ -246,12 +245,12 @@ som_symtab_read (bfd *abfd, struct objfile *objfile, This also happens for weak symbols, but their type is ST_DATA. */ case SS_UNSAT: - switch (bufp->symbol_type) + switch (symbol_type) { case ST_STORAGE: case ST_DATA: - symname = bufp->name.n_strx + stringtab; - bufp->symbol_value += data_offset; + symname = bfd_getb32 (bufp->name) + stringtab; + symbol_value += data_offset; ms_type = mst_data; break; @@ -264,12 +263,11 @@ som_symtab_read (bfd *abfd, struct objfile *objfile, continue; } - if (bufp->name.n_strx > obj_som_stringtab_size (abfd)) - error (_("Invalid symbol data; bad HP string table offset: %d"), - bufp->name.n_strx); + if (bfd_getb32 (bufp->name) > obj_som_stringtab_size (abfd)) + error (_("Invalid symbol data; bad HP string table offset: %s"), + plongest (bfd_getb32 (bufp->name))); - prim_record_minimal_symbol (symname, bufp->symbol_value, ms_type, - objfile); + prim_record_minimal_symbol (symname, symbol_value, ms_type, objfile); } } @@ -426,6 +424,8 @@ static const struct sym_fns som_sym_fns = &psym_functions }; +initialize_file_ftype _initialize_somread; + void _initialize_somread (void) {