From 261b8d0859fcd2ee7a43e1b3d2db6b2496bd6d61 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Wed, 18 Aug 2010 12:24:13 +0000 Subject: [PATCH] 2010-08-18 Pedro Alves PR corefile/8210 bfd/ * bfd-in2.h: Regenerate. * corefile.c (bfd_core_file_pid): New. * targets.c (BFD_JUMP_TABLE_CORE): Add NAME##_core_file_pid. (struct bfd_target) <_core_file_pid>: New. * libbfd-in.h (_bfd_nocore_core_file_pid): Declare. * libbfd.c (_bfd_nocore_core_file_pid): New. * elf-bfd.h (bfd_elf32_core_file_pid, bfd_elf64_core_file_pid): Declare. * elfcode.h (elf_core_file_pid): New define. * elfcore.h (elf_core_file_pid): New function. * elf.c (elfcore_make_pid): Rewrite. (elfcore_grok_prstatus): Only set core_pid if not set yet. (elfcore_grok_prstatus) [!HAVE_PRSTATUS_T_PR_WHO]: Fallback to getting the lwpid from prstat.pr_pid. * elf64-x86-64.c (elf64_x86_64_grok_prstatus): Write the LWPID to elf_tdata's core_lwpid instead of to core_pid. (elf64_x86_64_grok_psinfo): Extract the the main process's PID, and store it in elf_tdata's core_pid field. * elf32-i386.c (elf_i386_grok_prstatus): Write the LWPID to elf_tdata's core_lwpid instead of to core_pid. (elf_i386_grok_psinfo): Extract the the main process's PID, and store it in elf_tdata's core_pid field. * elf32-am33lin.c (elf32_am33lin_grok_prstatus): Write the LWPID to elf_tdata's core_lwpid instead of to core_pid. * elf32-arm.c (elf32_arm_nabi_grok_prstatus): Write the LWPID to elf_tdata's core_lwpid instead of to core_pid. * elf32-cris.c (cris_elf_grok_prstatus): Write the LWPID to elf_tdata's core_lwpid instead of to core_pid. * elf32-frv.c (elf32_frv_grok_prstatus): Write the LWPID to elf_tdata's core_lwpid instead of to core_pid. * elf32-hppa.c (elf32_hppa_grok_prstatus): Write the LWPID to elf_tdata's core_lwpid instead of to core_pid. * elf32-mips.c (elf32_mips_grok_prstatus): Write the LWPID to elf_tdata's core_lwpid instead of to core_pid. * elf32-ppc.c (ppc_elf_grok_prstatus): Write the LWPID to elf_tdata's core_lwpid instead of to core_pid. * elf32-s390.c (elf_s390_grok_prstatus): Write the LWPID to elf_tdata's core_lwpid instead of to core_pid. * elf32-score.c (s3_bfd_score_elf_grok_prstatus): Write the LWPID to elf_tdata's core_lwpid instead of to core_pid. * elf32-score7.c (s7_bfd_score_elf_grok_prstatus): Write the LWPID to elf_tdata's core_lwpid instead of to core_pid. * elf32-sh.c (elf32_shlin_grok_prstatus): Write the LWPID to elf_tdata's core_lwpid instead of to core_pid. * elf32-xtensa.c (elf_xtensa_grok_prstatus): Write the LWPID to elf_tdata's core_lwpid instead of to core_pid. * elf64-hppa.c (elf64_hppa_grok_prstatus): Write the LWPID to elf_tdata's core_lwpid instead of to core_pid. * elf64-mips.c (elf64_mips_grok_prstatus): Write the LWPID to elf_tdata's core_lwpid instead of to core_pid. * elf64-ppc.c (ppc64_elf_grok_prstatus): Write the LWPID to elf_tdata's core_lwpid instead of to core_pid. * elfn32-mips.c (elf32_mips_grok_prstatus): Write the LWPID to elf_tdata's core_lwpid instead of to core_pid. * plugin.c (bfd_plugin_core_file_pid): New function. * aout-target.h (MY_core_file_pid): Define. * aout-tic30.c (MY_core_file_pid, MY_core_file_p): New defines. * coff-rs6000.c (coff_core_file_pid): New define. (rs6000coff_vec, pmac_xcoff_vec): Use BFD_JUMP_TABLE_CORE. * coff64-rs6000.c (coff_core_file_pid): New define. (rs6000coff64_vec): Use BFD_JUMP_TABLE_CORE. (xcoff64_core_file_pid): New define. (aix5coff64_vec): Use BFD_JUMP_TABLE_CORE. * mach-o-target.c (bfd_mach_o_core_file_pid): New define. * aix386-core.c (aix386_core_file_pid): New define. * hppabsd-core.c (hppabsd_core_core_file_pid): New define. * hpux-core.c (hpux_core_core_file_pid): New define. * irix-core.c (irix_core_core_file_pid): New define. * lynx-core.c (lynx_core_file_pid): New define. * osf-core.c (osf_core_core_file_pid): New define. * ptrace-core.c (ptrace_unix_core_file_pid): New define. * sco5-core.c (sco5_core_file_pid): New define. * xcoff-target.h (coff_core_file_pid): New define. * netbsd-core.c (netbsd_core_core_file_pid): New define. gdb/ 2010-08-18 Pedro Alves PR corefile/8210 gdb/ * corelow.c (add_to_thread_list): Don't use gdbarch_core_reg_section_encodes_pid. Use bfd_core_file_pid. (get_core_register_section): Don't use gdbarch_core_reg_section_encodes_pid. * gdbarch.sh (core_reg_section_encodes_pid): Delete. * gdbarch.h, gdbarch.c: Regenerate. * amd64-sol2-tdep.c (amd64_sol2_init_abi): Don't set gdbarch_core_reg_section_encodes_pid. * i386-sol2-tdep.c (i386_sol2_init_abi): Ditto. * sparc-sol2-tdep.c (sparc32_sol2_init_abi): Ditto. * sparc64-sol2-tdep.c (sparc64_sol2_init_abi): Ditto. --- bfd/ChangeLog | 86 +++++++++++++++++++++++++++++++++++++++++ bfd/aix386-core.c | 2 + bfd/aout-target.h | 3 ++ bfd/aout-tic30.c | 3 ++ bfd/bfd-in2.h | 10 +++-- bfd/coff-rs6000.c | 12 +++--- bfd/coff64-rs6000.c | 14 ++++--- bfd/corefile.c | 25 ++++++++++++ bfd/elf-bfd.h | 4 ++ bfd/elf.c | 22 ++++++++--- bfd/elf32-am33lin.c | 2 +- bfd/elf32-arm.c | 2 +- bfd/elf32-cris.c | 4 +- bfd/elf32-frv.c | 2 +- bfd/elf32-hppa.c | 2 +- bfd/elf32-i386.c | 6 ++- bfd/elf32-mips.c | 2 +- bfd/elf32-ppc.c | 2 +- bfd/elf32-s390.c | 2 +- bfd/elf32-score.c | 2 +- bfd/elf32-score7.c | 2 +- bfd/elf32-sh.c | 2 +- bfd/elf32-xtensa.c | 2 +- bfd/elf64-hppa.c | 2 +- bfd/elf64-mips.c | 2 +- bfd/elf64-ppc.c | 2 +- bfd/elf64-x86-64.c | 4 +- bfd/elfcode.h | 1 + bfd/elfcore.h | 6 +++ bfd/elfn32-mips.c | 2 +- bfd/hppabsd-core.c | 1 + bfd/hpux-core.c | 1 + bfd/irix-core.c | 1 + bfd/libbfd-in.h | 2 + bfd/libbfd.c | 10 +++++ bfd/libbfd.h | 2 + bfd/lynx-core.c | 1 + bfd/mach-o-target.c | 1 + bfd/netbsd-core.c | 1 + bfd/osf-core.c | 1 + bfd/plugin.c | 7 ++++ bfd/ptrace-core.c | 1 + bfd/sco5-core.c | 1 + bfd/targets.c | 4 +- bfd/trad-core.c | 1 + bfd/xcoff-target.h | 1 + gdb/ChangeLog | 17 ++++++++ gdb/amd64-sol2-tdep.c | 4 -- gdb/corelow.c | 38 +++--------------- gdb/gdbarch.c | 23 ----------- gdb/gdbarch.h | 9 ----- gdb/gdbarch.sh | 7 ---- gdb/i386-sol2-tdep.c | 4 -- gdb/sparc-sol2-tdep.c | 4 -- gdb/sparc64-sol2-tdep.c | 4 -- 55 files changed, 249 insertions(+), 129 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 5f18054423f..cfe91d979bf 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,89 @@ +2010-08-18 Pedro Alves + + PR corefile/8210 + + * bfd-in2.h: Regenerate. + * corefile.c (bfd_core_file_pid): New. + + * targets.c (BFD_JUMP_TABLE_CORE): Add NAME##_core_file_pid. + (struct bfd_target) <_core_file_pid>: New. + + * libbfd-in.h (_bfd_nocore_core_file_pid): Declare. + * libbfd.c (_bfd_nocore_core_file_pid): New. + + * elf-bfd.h (bfd_elf32_core_file_pid, bfd_elf64_core_file_pid): + Declare. + * elfcode.h (elf_core_file_pid): New define. + * elfcore.h (elf_core_file_pid): New function. + + * elf.c (elfcore_make_pid): Rewrite. + (elfcore_grok_prstatus): Only set core_pid if not set yet. + (elfcore_grok_prstatus) [!HAVE_PRSTATUS_T_PR_WHO]: Fallback to + getting the lwpid from prstat.pr_pid. + + * elf64-x86-64.c (elf64_x86_64_grok_prstatus): Write the LWPID to + elf_tdata's core_lwpid instead of to core_pid. + (elf64_x86_64_grok_psinfo): Extract the the main process's PID, + and store it in elf_tdata's core_pid field. + * elf32-i386.c (elf_i386_grok_prstatus): Write the LWPID to + elf_tdata's core_lwpid instead of to core_pid. + (elf_i386_grok_psinfo): Extract the the main process's PID, and + store it in elf_tdata's core_pid field. + + * elf32-am33lin.c (elf32_am33lin_grok_prstatus): Write the LWPID + to elf_tdata's core_lwpid instead of to core_pid. + * elf32-arm.c (elf32_arm_nabi_grok_prstatus): Write the LWPID to + elf_tdata's core_lwpid instead of to core_pid. + * elf32-cris.c (cris_elf_grok_prstatus): Write the LWPID to + elf_tdata's core_lwpid instead of to core_pid. + * elf32-frv.c (elf32_frv_grok_prstatus): Write the LWPID to + elf_tdata's core_lwpid instead of to core_pid. + * elf32-hppa.c (elf32_hppa_grok_prstatus): Write the LWPID to + elf_tdata's core_lwpid instead of to core_pid. + * elf32-mips.c (elf32_mips_grok_prstatus): Write the LWPID to + elf_tdata's core_lwpid instead of to core_pid. + * elf32-ppc.c (ppc_elf_grok_prstatus): Write the LWPID to + elf_tdata's core_lwpid instead of to core_pid. + * elf32-s390.c (elf_s390_grok_prstatus): Write the LWPID to + elf_tdata's core_lwpid instead of to core_pid. + * elf32-score.c (s3_bfd_score_elf_grok_prstatus): Write the LWPID + to elf_tdata's core_lwpid instead of to core_pid. + * elf32-score7.c (s7_bfd_score_elf_grok_prstatus): Write the LWPID + to elf_tdata's core_lwpid instead of to core_pid. + * elf32-sh.c (elf32_shlin_grok_prstatus): Write the LWPID to + elf_tdata's core_lwpid instead of to core_pid. + * elf32-xtensa.c (elf_xtensa_grok_prstatus): Write the LWPID to + elf_tdata's core_lwpid instead of to core_pid. + * elf64-hppa.c (elf64_hppa_grok_prstatus): Write the LWPID to + elf_tdata's core_lwpid instead of to core_pid. + * elf64-mips.c (elf64_mips_grok_prstatus): Write the LWPID to + elf_tdata's core_lwpid instead of to core_pid. + * elf64-ppc.c (ppc64_elf_grok_prstatus): Write the LWPID to + elf_tdata's core_lwpid instead of to core_pid. + * elfn32-mips.c (elf32_mips_grok_prstatus): Write the LWPID to + elf_tdata's core_lwpid instead of to core_pid. + + * plugin.c (bfd_plugin_core_file_pid): New function. + * aout-target.h (MY_core_file_pid): Define. + * aout-tic30.c (MY_core_file_pid, MY_core_file_p): New defines. + * coff-rs6000.c (coff_core_file_pid): New define. + (rs6000coff_vec, pmac_xcoff_vec): Use BFD_JUMP_TABLE_CORE. + * coff64-rs6000.c (coff_core_file_pid): New define. + (rs6000coff64_vec): Use BFD_JUMP_TABLE_CORE. + (xcoff64_core_file_pid): New define. + (aix5coff64_vec): Use BFD_JUMP_TABLE_CORE. + * mach-o-target.c (bfd_mach_o_core_file_pid): New define. + * aix386-core.c (aix386_core_file_pid): New define. + * hppabsd-core.c (hppabsd_core_core_file_pid): New define. + * hpux-core.c (hpux_core_core_file_pid): New define. + * irix-core.c (irix_core_core_file_pid): New define. + * lynx-core.c (lynx_core_file_pid): New define. + * osf-core.c (osf_core_core_file_pid): New define. + * ptrace-core.c (ptrace_unix_core_file_pid): New define. + * sco5-core.c (sco5_core_file_pid): New define. + * xcoff-target.h (coff_core_file_pid): New define. + * netbsd-core.c (netbsd_core_core_file_pid): New define. + 2010-08-13 H.J. Lu PR ld/11913 diff --git a/bfd/aix386-core.c b/bfd/aix386-core.c index 4438e2801f3..634d997c69b 100644 --- a/bfd/aix386-core.c +++ b/bfd/aix386-core.c @@ -211,6 +211,8 @@ aix386_core_file_failing_signal (abfd) #define aix386_core_file_matches_executable_p generic_core_file_matches_executable_p +#define aix386_core_file_pid _bfd_nocore_core_file_pid + /* If somebody calls any byte-swapping routines, shoot them. */ static void diff --git a/bfd/aout-target.h b/bfd/aout-target.h index fe1d66e8795..51624947856 100644 --- a/bfd/aout-target.h +++ b/bfd/aout-target.h @@ -401,6 +401,9 @@ MY_bfd_final_link (bfd *abfd, struct bfd_link_info *info) #define MY_core_file_matches_executable_p \ _bfd_nocore_core_file_matches_executable_p #endif +#ifndef MY_core_file_pid +#define MY_core_file_pid _bfd_nocore_core_file_pid +#endif #ifndef MY_core_file_p #define MY_core_file_p _bfd_dummy_target #endif diff --git a/bfd/aout-tic30.c b/bfd/aout-tic30.c index 05e1a80191c..5d5c7e23b70 100644 --- a/bfd/aout-tic30.c +++ b/bfd/aout-tic30.c @@ -859,6 +859,9 @@ tic30_aout_set_arch_mach (bfd *abfd, #define MY_core_file_matches_executable_p \ _bfd_nocore_core_file_matches_executable_p #endif +#ifndef MY_core_file_pid +#define MY_core_file_pid _bfd_nocore_core_file_pid +#endif #ifndef MY_core_file_p #define MY_core_file_p _bfd_dummy_target #endif diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 277d4322d23..0e7b337f771 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -1977,8 +1977,8 @@ enum bfd_architecture #define bfd_mach_v850 1 #define bfd_mach_v850e 'E' #define bfd_mach_v850e1 '1' -#define bfd_mach_v850e2 0x4532 /* ('E'<<8|'2') */ -#define bfd_mach_v850e2v3 0x45325633 /* ('E'<<24|'2'<<16|'V'<<8|'3') */ +#define bfd_mach_v850e2 0x4532 +#define bfd_mach_v850e2v3 0x45325633 bfd_arch_arc, /* ARC Cores */ #define bfd_mach_arc_5 5 #define bfd_mach_arc_6 6 @@ -5412,6 +5412,8 @@ const char *bfd_core_file_failing_command (bfd *abfd); int bfd_core_file_failing_signal (bfd *abfd); +int bfd_core_file_pid (bfd *abfd); + bfd_boolean core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd); @@ -5608,11 +5610,13 @@ typedef struct bfd_target #define BFD_JUMP_TABLE_CORE(NAME) \ NAME##_core_file_failing_command, \ NAME##_core_file_failing_signal, \ - NAME##_core_file_matches_executable_p + NAME##_core_file_matches_executable_p, \ + NAME##_core_file_pid char * (*_core_file_failing_command) (bfd *); int (*_core_file_failing_signal) (bfd *); bfd_boolean (*_core_file_matches_executable_p) (bfd *, bfd *); + int (*_core_file_pid) (bfd *); /* Archive entry points. */ #define BFD_JUMP_TABLE_ARCHIVE(NAME) \ diff --git a/bfd/coff-rs6000.c b/bfd/coff-rs6000.c index 37d668c97bd..7fb20d8518e 100644 --- a/bfd/coff-rs6000.c +++ b/bfd/coff-rs6000.c @@ -112,6 +112,8 @@ extern int rs6000coff_core_file_failing_signal rs6000coff_core_file_failing_signal #define coff_core_file_matches_executable_p \ rs6000coff_core_file_matches_executable_p +#define coff_core_file_pid \ + _bfd_nocore_core_file_pid #else #define CORE_FILE_P _bfd_dummy_target #define coff_core_file_failing_command \ @@ -120,6 +122,8 @@ extern int rs6000coff_core_file_failing_signal _bfd_nocore_core_file_failing_signal #define coff_core_file_matches_executable_p \ _bfd_nocore_core_file_matches_executable_p +#define coff_core_file_pid \ + _bfd_nocore_core_file_pid #endif #define coff_SWAP_sym_in _bfd_xcoff_swap_sym_in #define coff_SWAP_sym_out _bfd_xcoff_swap_sym_out @@ -4182,9 +4186,7 @@ const bfd_target rs6000coff_vec = _bfd_generic_bfd_print_private_bfd_data, /* Core */ - coff_core_file_failing_command, - coff_core_file_failing_signal, - coff_core_file_matches_executable_p, + BFD_JUMP_TABLE_CORE (coff), /* Archive */ _bfd_xcoff_slurp_armap, @@ -4437,9 +4439,7 @@ const bfd_target pmac_xcoff_vec = _bfd_generic_bfd_print_private_bfd_data, /* Core */ - coff_core_file_failing_command, - coff_core_file_failing_signal, - coff_core_file_matches_executable_p, + BFD_JUMP_TABLE_CORE (coff), /* Archive */ _bfd_xcoff_slurp_armap, diff --git a/bfd/coff64-rs6000.c b/bfd/coff64-rs6000.c index 99cbfb7136d..b154b676210 100644 --- a/bfd/coff64-rs6000.c +++ b/bfd/coff64-rs6000.c @@ -256,6 +256,8 @@ extern int rs6000coff_core_file_failing_signal rs6000coff_core_file_failing_signal #define coff_core_file_matches_executable_p \ rs6000coff_core_file_matches_executable_p +#define coff_core_file_pid \ + _bfd_nocore_core_file_pid #else #define CORE_FILE_P _bfd_dummy_target #define coff_core_file_failing_command \ @@ -264,6 +266,8 @@ extern int rs6000coff_core_file_failing_signal _bfd_nocore_core_file_failing_signal #define coff_core_file_matches_executable_p \ _bfd_nocore_core_file_matches_executable_p +#define coff_core_file_pid \ + _bfd_nocore_core_file_pid #endif #define coff_SWAP_sym_in _bfd_xcoff64_swap_sym_in #define coff_SWAP_sym_out _bfd_xcoff64_swap_sym_out @@ -2753,9 +2757,7 @@ const bfd_target rs6000coff64_vec = _bfd_generic_bfd_print_private_bfd_data, /* Core */ - coff_core_file_failing_command, - coff_core_file_failing_signal, - coff_core_file_matches_executable_p, + BFD_JUMP_TABLE_CORE (coff), /* Archive */ xcoff64_slurp_armap, @@ -2835,6 +2837,8 @@ extern char *xcoff64_core_file_failing_command PARAMS ((bfd *)); extern int xcoff64_core_file_failing_signal PARAMS ((bfd *)); +#define xcoff64_core_file_pid \ + _bfd_nocore_core_file_pid /* AIX 5 */ static const struct xcoff_backend_data_rec bfd_xcoff_aix5_backend_data = @@ -3009,9 +3013,7 @@ const bfd_target aix5coff64_vec = _bfd_generic_bfd_print_private_bfd_data, /* Core */ - xcoff64_core_file_failing_command, - xcoff64_core_file_failing_signal, - xcoff64_core_file_matches_executable_p, + BFD_JUMP_TABLE_CORE (xcoff64), /* Archive */ xcoff64_slurp_armap, diff --git a/bfd/corefile.c b/bfd/corefile.c index 7802a3a3fa2..605be8d33da 100644 --- a/bfd/corefile.c +++ b/bfd/corefile.c @@ -82,6 +82,31 @@ bfd_core_file_failing_signal (bfd *abfd) return BFD_SEND (abfd, _core_file_failing_signal, (abfd)); } +/* +FUNCTION + bfd_core_file_pid + +SYNOPSIS + int bfd_core_file_pid (bfd *abfd); + +DESCRIPTION + + Returns the PID of the process the core dump the BFD + @var{abfd} is attached to was generated from. +*/ + +int +bfd_core_file_pid (bfd *abfd) +{ + if (abfd->format != bfd_core) + { + bfd_set_error (bfd_error_invalid_operation); + return 0; + } + return BFD_SEND (abfd, _core_file_pid, (abfd)); +} + + /* FUNCTION core_file_matches_executable_p diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 754e7335b65..2220d4db5c2 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1989,6 +1989,8 @@ extern int bfd_elf32_core_file_failing_signal (bfd *); extern bfd_boolean bfd_elf32_core_file_matches_executable_p (bfd *, bfd *); +extern int bfd_elf32_core_file_pid + (bfd *); extern bfd_boolean bfd_elf32_swap_symbol_in (bfd *, const void *, const void *, Elf_Internal_Sym *); @@ -2033,6 +2035,8 @@ extern int bfd_elf64_core_file_failing_signal (bfd *); extern bfd_boolean bfd_elf64_core_file_matches_executable_p (bfd *, bfd *); +extern int bfd_elf64_core_file_pid + (bfd *); extern bfd_boolean bfd_elf64_swap_symbol_in (bfd *, const void *, const void *, Elf_Internal_Sym *); diff --git a/bfd/elf.c b/bfd/elf.c index 90fc3d1286c..f9f2dadb59a 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -7519,13 +7519,19 @@ _bfd_elf_rel_vtable_reloc_fn # include #endif -/* FIXME: this is kinda wrong, but it's what gdb wants. */ +/* Return a PID that identifies a "thread" for threaded cores, or the + PID of the main process for non-threaded cores. */ static int elfcore_make_pid (bfd *abfd) { - return ((elf_tdata (abfd)->core_lwpid << 16) - + (elf_tdata (abfd)->core_pid)); + int pid; + + pid = elf_tdata (abfd)->core_lwpid; + if (pid == 0) + pid = elf_tdata (abfd)->core_pid; + + return pid; } /* If there isn't a section called NAME, make one, using @@ -7615,7 +7621,8 @@ elfcore_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) has already been set by another thread. */ if (elf_tdata (abfd)->core_signal == 0) elf_tdata (abfd)->core_signal = prstat.pr_cursig; - elf_tdata (abfd)->core_pid = prstat.pr_pid; + if (elf_tdata (abfd)->core_pid == 0) + elf_tdata (abfd)->core_pid = prstat.pr_pid; /* pr_who exists on: solaris 2.5+ @@ -7625,6 +7632,8 @@ elfcore_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) */ #if defined (HAVE_PRSTATUS_T_PR_WHO) elf_tdata (abfd)->core_lwpid = prstat.pr_who; +#else + elf_tdata (abfd)->core_lwpid = prstat.pr_pid; #endif } #if defined (HAVE_PRSTATUS32_T) @@ -7641,7 +7650,8 @@ elfcore_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) has already been set by another thread. */ if (elf_tdata (abfd)->core_signal == 0) elf_tdata (abfd)->core_signal = prstat.pr_cursig; - elf_tdata (abfd)->core_pid = prstat.pr_pid; + if (elf_tdata (abfd)->core_pid == 0) + elf_tdata (abfd)->core_pid = prstat.pr_pid; /* pr_who exists on: solaris 2.5+ @@ -7651,6 +7661,8 @@ elfcore_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) */ #if defined (HAVE_PRSTATUS32_T_PR_WHO) elf_tdata (abfd)->core_lwpid = prstat.pr_who; +#else + elf_tdata (abfd)->core_lwpid = prstat.pr_pid; #endif } #endif /* HAVE_PRSTATUS32_T */ diff --git a/bfd/elf32-am33lin.c b/bfd/elf32-am33lin.c index c3ec2dcc454..177a7140de7 100644 --- a/bfd/elf32-am33lin.c +++ b/bfd/elf32-am33lin.c @@ -55,7 +55,7 @@ elf32_am33lin_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); /* pr_pid */ - elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24); + elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24); /* pr_reg */ offset = 72; diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index f6115bd24e3..0cd1e644e85 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -1829,7 +1829,7 @@ elf32_arm_nabi_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); /* pr_pid */ - elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24); + elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24); /* pr_reg */ offset = 72; diff --git a/bfd/elf32-cris.c b/bfd/elf32-cris.c index 1783ae3b66c..0129d6a8148 100644 --- a/bfd/elf32-cris.c +++ b/bfd/elf32-cris.c @@ -580,7 +580,7 @@ cris_elf_grok_prstatus (abfd, note) elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); /* pr_pid */ - elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 22); + elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 22); /* pr_reg */ offset = 70; @@ -599,7 +599,7 @@ cris_elf_grok_prstatus (abfd, note) elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); /* pr_pid */ - elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 22); + elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 22); /* pr_reg */ offset = 70; diff --git a/bfd/elf32-frv.c b/bfd/elf32-frv.c index 8d940c08908..811d5f5b3ae 100644 --- a/bfd/elf32-frv.c +++ b/bfd/elf32-frv.c @@ -6935,7 +6935,7 @@ elf32_frv_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); /* `pr_pid' is at offset 24. */ - elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24); + elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24); /* `pr_reg' is at offset 72. */ offset = 72; diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c index 32a374fbc51..794de8282ca 100644 --- a/bfd/elf32-hppa.c +++ b/bfd/elf32-hppa.c @@ -1736,7 +1736,7 @@ elf32_hppa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); /* pr_pid */ - elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24); + elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24); /* pr_reg */ offset = 72; diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 4ba1ba035d9..581f218c8ca 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -419,7 +419,7 @@ elf_i386_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) elf_tdata (abfd)->core_signal = bfd_get_32 (abfd, note->descdata + 20); /* pr_pid */ - elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24); + elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24); /* pr_reg */ offset = 28; @@ -437,7 +437,7 @@ elf_i386_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); /* pr_pid */ - elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24); + elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24); /* pr_reg */ offset = 72; @@ -475,6 +475,8 @@ elf_i386_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) return FALSE; case 124: /* Linux/i386 elf_prpsinfo. */ + elf_tdata (abfd)->core_pid + = bfd_get_32 (abfd, note->descdata + 12); elf_tdata (abfd)->core_program = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16); elf_tdata (abfd)->core_command diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c index 51555579137..aabf2847fed 100644 --- a/bfd/elf32-mips.c +++ b/bfd/elf32-mips.c @@ -1506,7 +1506,7 @@ elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); /* pr_pid */ - elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24); + elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24); /* pr_reg */ offset = 72; diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index e3638cd20c6..eb8d5404e5f 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -1858,7 +1858,7 @@ ppc_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); /* pr_pid */ - elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24); + elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24); /* pr_reg */ offset = 72; diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c index 336ba36e8dc..4f9e0b33636 100644 --- a/bfd/elf32-s390.c +++ b/bfd/elf32-s390.c @@ -3462,7 +3462,7 @@ elf_s390_grok_prstatus (abfd, note) elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); /* pr_pid */ - elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24); + elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24); /* pr_reg */ offset = 72; diff --git a/bfd/elf32-score.c b/bfd/elf32-score.c index b443b601afc..f1f1aae1e72 100644 --- a/bfd/elf32-score.c +++ b/bfd/elf32-score.c @@ -3917,7 +3917,7 @@ s3_bfd_score_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) elf_tdata (abfd)->core_signal = score_bfd_get_16 (abfd, note->descdata + 12); /* pr_pid */ - elf_tdata (abfd)->core_pid = score_bfd_get_32 (abfd, note->descdata + 24); + elf_tdata (abfd)->core_lwpid = score_bfd_get_32 (abfd, note->descdata + 24); /* pr_reg */ offset = 72; diff --git a/bfd/elf32-score7.c b/bfd/elf32-score7.c index 31784105f95..85ce236a4f1 100644 --- a/bfd/elf32-score7.c +++ b/bfd/elf32-score7.c @@ -3734,7 +3734,7 @@ s7_bfd_score_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); /* pr_pid */ - elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24); + elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24); /* pr_reg */ offset = 72; diff --git a/bfd/elf32-sh.c b/bfd/elf32-sh.c index bde565ee469..a4fdd707439 100644 --- a/bfd/elf32-sh.c +++ b/bfd/elf32-sh.c @@ -7438,7 +7438,7 @@ elf32_shlin_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); /* pr_pid */ - elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24); + elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24); /* pr_reg */ offset = 72; diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c index 770d9a82d43..12788ec5fac 100644 --- a/bfd/elf32-xtensa.c +++ b/bfd/elf32-xtensa.c @@ -3802,7 +3802,7 @@ elf_xtensa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); /* pr_pid */ - elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24); + elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24); /* pr_reg */ offset = 72; diff --git a/bfd/elf64-hppa.c b/bfd/elf64-hppa.c index 9ccb518dbb7..e76593db34f 100644 --- a/bfd/elf64-hppa.c +++ b/bfd/elf64-hppa.c @@ -2611,7 +2611,7 @@ elf64_hppa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); /* pr_pid */ - elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 32); + elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 32); /* pr_reg */ offset = 112; diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c index 95186d4c3aa..33d7a87d105 100644 --- a/bfd/elf64-mips.c +++ b/bfd/elf64-mips.c @@ -3083,7 +3083,7 @@ elf64_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); /* pr_pid */ - elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 32); + elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 32); /* pr_reg */ offset = 112; diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index b6ef660046e..954d18df3a1 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -2651,7 +2651,7 @@ ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); /* pr_pid */ - elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 32); + elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 32); /* pr_reg */ offset = 112; diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 9899fd4a34d..f11584b8a92 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -308,7 +308,7 @@ elf64_x86_64_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) = bfd_get_16 (abfd, note->descdata + 12); /* pr_pid */ - elf_tdata (abfd)->core_pid + elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 32); /* pr_reg */ @@ -332,6 +332,8 @@ elf64_x86_64_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) return FALSE; case 136: /* sizeof(struct elf_prpsinfo) on Linux/x86_64 */ + elf_tdata (abfd)->core_pid + = bfd_get_32 (abfd, note->descdata + 24); elf_tdata (abfd)->core_program = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16); elf_tdata (abfd)->core_command diff --git a/bfd/elfcode.h b/bfd/elfcode.h index cd06455664d..f7c89263eea 100644 --- a/bfd/elfcode.h +++ b/bfd/elfcode.h @@ -87,6 +87,7 @@ #define elf_core_file_failing_signal NAME(bfd_elf,core_file_failing_signal) #define elf_core_file_matches_executable_p \ NAME(bfd_elf,core_file_matches_executable_p) +#define elf_core_file_pid NAME(bfd_elf,core_file_pid) #define elf_object_p NAME(bfd_elf,object_p) #define elf_core_file_p NAME(bfd_elf,core_file_p) #define elf_get_symtab_upper_bound NAME(bfd_elf,get_symtab_upper_bound) diff --git a/bfd/elfcore.h b/bfd/elfcore.h index 168c81ae21b..81980c0fecc 100644 --- a/bfd/elfcore.h +++ b/bfd/elfcore.h @@ -31,6 +31,12 @@ elf_core_file_failing_signal (bfd *abfd) return elf_tdata (abfd)->core_signal; } +int +elf_core_file_pid (bfd *abfd) +{ + return elf_tdata (abfd)->core_pid; +} + bfd_boolean elf_core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd) { diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c index a0725943e54..0aa25e72808 100644 --- a/bfd/elfn32-mips.c +++ b/bfd/elfn32-mips.c @@ -2332,7 +2332,7 @@ elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); /* pr_pid */ - elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24); + elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24); /* pr_reg */ offset = 72; diff --git a/bfd/hppabsd-core.c b/bfd/hppabsd-core.c index 9cac968dd21..152d464d190 100644 --- a/bfd/hppabsd-core.c +++ b/bfd/hppabsd-core.c @@ -59,6 +59,7 @@ static char *hppabsd_core_core_file_failing_command static int hppabsd_core_core_file_failing_signal PARAMS ((bfd *)); #define hppabsd_core_core_file_matches_executable_p generic_core_file_matches_executable_p +#define hppabsd_core_core_file_pid _bfd_nocore_core_file_pid static void swap_abort PARAMS ((void)); diff --git a/bfd/hpux-core.c b/bfd/hpux-core.c index fdcde7e5475..51990143078 100644 --- a/bfd/hpux-core.c +++ b/bfd/hpux-core.c @@ -103,6 +103,7 @@ struct hpux_core_struct #define core_kernel_thread_id(bfd) (core_hdr(bfd)->lwpid) #define core_user_thread_id(bfd) (core_hdr(bfd)->user_tid) #define hpux_core_core_file_matches_executable_p generic_core_file_matches_executable_p +#define hpux_core_core_file_pid _bfd_nocore_core_file_pid static asection *make_bfd_asection (bfd *, const char *, flagword, bfd_size_type, bfd_vma, unsigned int); diff --git a/bfd/irix-core.c b/bfd/irix-core.c index 1feff87cfe7..eb930a4d2e8 100644 --- a/bfd/irix-core.c +++ b/bfd/irix-core.c @@ -44,6 +44,7 @@ struct sgi_core_struct #define core_command(bfd) (core_hdr(bfd)->cmd) #define irix_core_core_file_matches_executable_p generic_core_file_matches_executable_p +#define irix_core_core_file_pid _bfd_nocore_core_file_pid static asection *make_bfd_asection (bfd *, const char *, flagword, bfd_size_type, bfd_vma, file_ptr); diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h index 87a73b46239..b5b614c9625 100644 --- a/bfd/libbfd-in.h +++ b/bfd/libbfd-in.h @@ -270,6 +270,8 @@ extern int _bfd_nocore_core_file_failing_signal (bfd *); extern bfd_boolean _bfd_nocore_core_file_matches_executable_p (bfd *, bfd *); +extern int _bfd_nocore_core_file_pid + (bfd *); /* Routines to use for BFD_JUMP_TABLE_ARCHIVE when there is no archive file support. Use BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive). */ diff --git a/bfd/libbfd.c b/bfd/libbfd.c index b378622b6bc..5146d9525e1 100644 --- a/bfd/libbfd.c +++ b/bfd/libbfd.c @@ -150,6 +150,16 @@ _bfd_nocore_core_file_failing_signal (bfd *ignore_abfd ATTRIBUTE_UNUSED) return 0; } +/* Routine to handle the core_file_pid entry point for targets without + core file support. */ + +int +_bfd_nocore_core_file_pid (bfd *ignore_abfd ATTRIBUTE_UNUSED) +{ + bfd_set_error (bfd_error_invalid_operation); + return 0; +} + const bfd_target * _bfd_dummy_target (bfd *ignore_abfd ATTRIBUTE_UNUSED) { diff --git a/bfd/libbfd.h b/bfd/libbfd.h index 94bbd8ef5cd..fb95c40c1c3 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -275,6 +275,8 @@ extern int _bfd_nocore_core_file_failing_signal (bfd *); extern bfd_boolean _bfd_nocore_core_file_matches_executable_p (bfd *, bfd *); +extern int _bfd_nocore_core_file_pid + (bfd *); /* Routines to use for BFD_JUMP_TABLE_ARCHIVE when there is no archive file support. Use BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive). */ diff --git a/bfd/lynx-core.c b/bfd/lynx-core.c index a432566a973..ab6a834014c 100644 --- a/bfd/lynx-core.c +++ b/bfd/lynx-core.c @@ -53,6 +53,7 @@ struct lynx_core_struct #define core_command(bfd) (core_hdr(bfd)->cmd) #define lynx_core_file_matches_executable_p generic_core_file_matches_executable_p +#define lynx_core_file_pid _bfd_nocore_core_file_pid /* Handle Lynx core dump file. */ diff --git a/bfd/mach-o-target.c b/bfd/mach-o-target.c index c9b974e8a52..64c7ddf5b65 100644 --- a/bfd/mach-o-target.c +++ b/bfd/mach-o-target.c @@ -58,6 +58,7 @@ #define bfd_mach_o_bfd_define_common_symbol bfd_generic_define_common_symbol #define bfd_mach_o_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data #define bfd_mach_o_core_file_matches_executable_p generic_core_file_matches_executable_p +#define bfd_mach_o_core_file_pid _bfd_nocore_core_file_pid #define bfd_mach_o_get_dynamic_symtab_upper_bound bfd_mach_o_get_symtab_upper_bound #define bfd_mach_o_canonicalize_dynamic_symtab bfd_mach_o_canonicalize_symtab diff --git a/bfd/netbsd-core.c b/bfd/netbsd-core.c index 397f1d086ac..2458a8450bf 100644 --- a/bfd/netbsd-core.c +++ b/bfd/netbsd-core.c @@ -44,6 +44,7 @@ #define SPARC64_WCOOKIE_OFFSET 832 #define netbsd_core_file_matches_executable_p generic_core_file_matches_executable_p +#define netbsd_core_core_file_pid _bfd_nocore_core_file_pid struct netbsd_core_struct { diff --git a/bfd/osf-core.c b/bfd/osf-core.c index 513e52afc6b..0ebbd1d4a2d 100644 --- a/bfd/osf-core.c +++ b/bfd/osf-core.c @@ -43,6 +43,7 @@ static char *osf_core_core_file_failing_command static int osf_core_core_file_failing_signal PARAMS ((bfd *)); #define osf_core_core_file_matches_executable_p generic_core_file_matches_executable_p +#define osf_core_core_file_pid _bfd_nocore_core_file_pid static void swap_abort PARAMS ((void)); diff --git a/bfd/plugin.c b/bfd/plugin.c index 91bbfd1ff3c..4c24a7f6a22 100644 --- a/bfd/plugin.c +++ b/bfd/plugin.c @@ -319,6 +319,13 @@ bfd_plugin_core_file_failing_signal (bfd *abfd ATTRIBUTE_UNUSED) return 0; } +static int +bfd_plugin_core_file_pid (bfd *abfd ATTRIBUTE_UNUSED) +{ + BFD_ASSERT (0); + return 0; +} + static long bfd_plugin_get_symtab_upper_bound (bfd *abfd) { diff --git a/bfd/ptrace-core.c b/bfd/ptrace-core.c index ce621547fe4..77eaaeb46a1 100644 --- a/bfd/ptrace-core.c +++ b/bfd/ptrace-core.c @@ -53,6 +53,7 @@ const bfd_target *ptrace_unix_core_file_p PARAMS ((bfd *abfd)); char * ptrace_unix_core_file_failing_command PARAMS ((bfd *abfd)); int ptrace_unix_core_file_failing_signal PARAMS ((bfd *abfd)); #define ptrace_unix_core_file_matches_executable_p generic_core_file_matches_executable_p +#define ptrace_unix_core_file_pid _bfd_nocore_core_file_pid static void swap_abort PARAMS ((void)); const bfd_target * diff --git a/bfd/sco5-core.c b/bfd/sco5-core.c index 4b85fa5e6f1..7f51a6f40bc 100644 --- a/bfd/sco5-core.c +++ b/bfd/sco5-core.c @@ -51,6 +51,7 @@ const bfd_target *sco5_core_file_p PARAMS ((bfd *abfd)); char *sco5_core_file_failing_command PARAMS ((bfd *abfd)); int sco5_core_file_failing_signal PARAMS ((bfd *abfd)); #define sco5_core_file_matches_executable_p generic_core_file_matches_executable_p +#define sco5_core_file_pid _bfd_nocore_core_file_pid static void swap_abort PARAMS ((void)); static asection * diff --git a/bfd/targets.c b/bfd/targets.c index bb20189bfe0..aaf7e99c64f 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -314,11 +314,13 @@ BFD_JUMP_TABLE macros. .#define BFD_JUMP_TABLE_CORE(NAME) \ . NAME##_core_file_failing_command, \ . NAME##_core_file_failing_signal, \ -. NAME##_core_file_matches_executable_p +. NAME##_core_file_matches_executable_p, \ +. NAME##_core_file_pid . . char * (*_core_file_failing_command) (bfd *); . int (*_core_file_failing_signal) (bfd *); . bfd_boolean (*_core_file_matches_executable_p) (bfd *, bfd *); +. int (*_core_file_pid) (bfd *); . . {* Archive entry points. *} .#define BFD_JUMP_TABLE_ARCHIVE(NAME) \ diff --git a/bfd/trad-core.c b/bfd/trad-core.c index e3485143185..e06b56151f4 100644 --- a/bfd/trad-core.c +++ b/bfd/trad-core.c @@ -71,6 +71,7 @@ const bfd_target *trad_unix_core_file_p PARAMS ((bfd *abfd)); char * trad_unix_core_file_failing_command PARAMS ((bfd *abfd)); int trad_unix_core_file_failing_signal PARAMS ((bfd *abfd)); #define trad_unix_core_file_matches_executable_p generic_core_file_matches_executable_p +#define trad_unix_core_file_pid _bfd_nocore_core_file_pid static void swap_abort PARAMS ((void)); /* Handle 4.2-style (and perhaps also sysV-style) core dump file. */ diff --git a/bfd/xcoff-target.h b/bfd/xcoff-target.h index 4837fdff7a7..b723eb706bc 100644 --- a/bfd/xcoff-target.h +++ b/bfd/xcoff-target.h @@ -51,6 +51,7 @@ #define coff_core_file_failing_command _bfd_nocore_core_file_failing_command #define coff_core_file_failing_signal _bfd_nocore_core_file_failing_signal #define coff_core_file_matches_executable_p _bfd_nocore_core_file_matches_executable_p +#define coff_core_file_pid _bfd_nocore_core_file_pid #define _bfd_xcoff_bfd_get_relocated_section_contents coff_bfd_get_relocated_section_contents #define _bfd_xcoff_bfd_relax_section coff_bfd_relax_section #define _bfd_xcoff_bfd_gc_sections coff_bfd_gc_sections diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 02b2e5aa692..eb3491a4722 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,20 @@ +2010-08-18 Pedro Alves + + PR corefile/8210 + + * corelow.c (add_to_thread_list): Don't use + gdbarch_core_reg_section_encodes_pid. Use bfd_core_file_pid. + (get_core_register_section): Don't use + gdbarch_core_reg_section_encodes_pid. + + * gdbarch.sh (core_reg_section_encodes_pid): Delete. + * gdbarch.h, gdbarch.c: Regenerate. + * amd64-sol2-tdep.c (amd64_sol2_init_abi): Don't set + gdbarch_core_reg_section_encodes_pid. + * i386-sol2-tdep.c (i386_sol2_init_abi): Ditto. + * sparc-sol2-tdep.c (sparc32_sol2_init_abi): Ditto. + * sparc64-sol2-tdep.c (sparc64_sol2_init_abi): Ditto. + 2010-08-18 Yao Qi * MAINTAINERS : Add myself under Write After Approval. diff --git a/gdb/amd64-sol2-tdep.c b/gdb/amd64-sol2-tdep.c index 0cf5e83b469..e8c0a80332e 100644 --- a/gdb/amd64-sol2-tdep.c +++ b/gdb/amd64-sol2-tdep.c @@ -114,10 +114,6 @@ amd64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); - /* Solaris encodes the pid of the inferior in regset section - names. */ - set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1); - /* How to print LWP PTIDs from core files. */ set_gdbarch_core_pid_to_str (gdbarch, sol2_core_pid_to_str); } diff --git a/gdb/corelow.c b/gdb/corelow.c index 9d0047124fd..6e97962bfb3 100644 --- a/gdb/corelow.c +++ b/gdb/corelow.c @@ -252,29 +252,15 @@ add_to_thread_list (bfd *abfd, asection *asect, void *reg_sect_arg) core_tid = atoi (bfd_section_name (abfd, asect) + 5); - if (core_gdbarch - && gdbarch_core_reg_section_encodes_pid (core_gdbarch)) - { - uint32_t merged_pid = core_tid; - pid = merged_pid & 0xffff; - lwpid = merged_pid >> 16; - - /* This can happen on solaris core, for example, if we don't - find a NT_PSTATUS note in the core, but do find NT_LWPSTATUS - notes. */ - if (pid == 0) - { - core_has_fake_pid = 1; - pid = CORELOW_PID; - } - } - else + pid = bfd_core_file_pid (core_bfd); + if (pid == 0) { core_has_fake_pid = 1; pid = CORELOW_PID; - lwpid = core_tid; } + lwpid = core_tid; + if (current_inferior ()->pid == 0) inferior_appeared (current_inferior (), pid); @@ -520,21 +506,7 @@ get_core_register_section (struct regcache *regcache, xfree (section_name); - if (core_gdbarch - && gdbarch_core_reg_section_encodes_pid (core_gdbarch)) - { - uint32_t merged_pid; - int pid = ptid_get_pid (inferior_ptid); - - if (core_has_fake_pid) - pid = 0; - - merged_pid = ptid_get_lwp (inferior_ptid); - merged_pid = merged_pid << 16 | pid; - - section_name = xstrprintf ("%s/%s", name, plongest (merged_pid)); - } - else if (ptid_get_lwp (inferior_ptid)) + if (ptid_get_lwp (inferior_ptid)) section_name = xstrprintf ("%s/%ld", name, ptid_get_lwp (inferior_ptid)); else section_name = xstrdup (name); diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index 4ff9f542c7b..78e5c486969 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -234,7 +234,6 @@ struct gdbarch gdbarch_register_reggroup_p_ftype *register_reggroup_p; gdbarch_fetch_pointer_argument_ftype *fetch_pointer_argument; gdbarch_regset_from_core_section_ftype *regset_from_core_section; - int core_reg_section_encodes_pid; struct core_regset_section * core_regset_sections; gdbarch_core_xfer_shared_libraries_ftype *core_xfer_shared_libraries; gdbarch_core_pid_to_str_ftype *core_pid_to_str; @@ -385,7 +384,6 @@ struct gdbarch startup_gdbarch = default_register_reggroup_p, /* register_reggroup_p */ 0, /* fetch_pointer_argument */ 0, /* regset_from_core_section */ - 0, /* core_reg_section_encodes_pid */ 0, /* core_regset_sections */ 0, /* core_xfer_shared_libraries */ 0, /* core_pid_to_str */ @@ -667,7 +665,6 @@ verify_gdbarch (struct gdbarch *gdbarch) /* Skip verify of register_reggroup_p, invalid_p == 0 */ /* Skip verify of fetch_pointer_argument, has predicate */ /* Skip verify of regset_from_core_section, has predicate */ - /* Skip verify of core_reg_section_encodes_pid, invalid_p == 0 */ /* Skip verify of core_xfer_shared_libraries, has predicate */ /* Skip verify of core_pid_to_str, has predicate */ /* Skip verify of gcore_bfd_target, has predicate */ @@ -817,9 +814,6 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) fprintf_unfiltered (file, "gdbarch_dump: core_read_description = <%s>\n", host_address_to_string (gdbarch->core_read_description)); - fprintf_unfiltered (file, - "gdbarch_dump: core_reg_section_encodes_pid = %s\n", - plongest (gdbarch->core_reg_section_encodes_pid)); fprintf_unfiltered (file, "gdbarch_dump: core_regset_sections = %s\n", host_address_to_string (gdbarch->core_regset_sections)); @@ -3095,23 +3089,6 @@ set_gdbarch_regset_from_core_section (struct gdbarch *gdbarch, gdbarch->regset_from_core_section = regset_from_core_section; } -int -gdbarch_core_reg_section_encodes_pid (struct gdbarch *gdbarch) -{ - gdb_assert (gdbarch != NULL); - /* Skip verify of core_reg_section_encodes_pid, invalid_p == 0 */ - if (gdbarch_debug >= 2) - fprintf_unfiltered (gdb_stdlog, "gdbarch_core_reg_section_encodes_pid called\n"); - return gdbarch->core_reg_section_encodes_pid; -} - -void -set_gdbarch_core_reg_section_encodes_pid (struct gdbarch *gdbarch, - int core_reg_section_encodes_pid) -{ - gdbarch->core_reg_section_encodes_pid = core_reg_section_encodes_pid; -} - struct core_regset_section * gdbarch_core_regset_sections (struct gdbarch *gdbarch) { diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h index f6c7ce81aef..443e1d5fd81 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -666,15 +666,6 @@ typedef const struct regset * (gdbarch_regset_from_core_section_ftype) (struct g extern const struct regset * gdbarch_regset_from_core_section (struct gdbarch *gdbarch, const char *sect_name, size_t sect_size); extern void set_gdbarch_regset_from_core_section (struct gdbarch *gdbarch, gdbarch_regset_from_core_section_ftype *regset_from_core_section); -/* When creating core dumps, some systems encode the PID in addition - to the LWP id in core file register section names. In those cases, the - "XXX" in ".reg/XXX" is encoded as [LWPID << 16 | PID]. This setting - is set to true for such architectures; false if "XXX" represents an LWP - or thread id with no special encoding. */ - -extern int gdbarch_core_reg_section_encodes_pid (struct gdbarch *gdbarch); -extern void set_gdbarch_core_reg_section_encodes_pid (struct gdbarch *gdbarch, int core_reg_section_encodes_pid); - /* Supported register notes in a core file. */ extern struct core_regset_section * gdbarch_core_regset_sections (struct gdbarch *gdbarch); diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index 10f9477b6fc..5b661167123 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -612,13 +612,6 @@ F:CORE_ADDR:fetch_pointer_argument:struct frame_info *frame, int argi, struct ty # name SECT_NAME and size SECT_SIZE. M:const struct regset *:regset_from_core_section:const char *sect_name, size_t sect_size:sect_name, sect_size -# When creating core dumps, some systems encode the PID in addition -# to the LWP id in core file register section names. In those cases, the -# "XXX" in ".reg/XXX" is encoded as [LWPID << 16 | PID]. This setting -# is set to true for such architectures; false if "XXX" represents an LWP -# or thread id with no special encoding. -v:int:core_reg_section_encodes_pid:::0:0::0 - # Supported register notes in a core file. v:struct core_regset_section *:core_regset_sections:const char *name, int len::::::host_address_to_string (gdbarch->core_regset_sections) diff --git a/gdb/i386-sol2-tdep.c b/gdb/i386-sol2-tdep.c index 49a338722ae..d656d87b275 100644 --- a/gdb/i386-sol2-tdep.c +++ b/gdb/i386-sol2-tdep.c @@ -136,10 +136,6 @@ i386_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); - /* Solaris encodes the pid of the inferior in regset section - names. */ - set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1); - /* How to print LWP PTIDs from core files. */ set_gdbarch_core_pid_to_str (gdbarch, sol2_core_pid_to_str); } diff --git a/gdb/sparc-sol2-tdep.c b/gdb/sparc-sol2-tdep.c index a2f3521caea..62d113cf4bc 100644 --- a/gdb/sparc-sol2-tdep.c +++ b/gdb/sparc-sol2-tdep.c @@ -232,10 +232,6 @@ sparc32_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) frame_unwind_append_unwinder (gdbarch, &sparc32_sol2_sigtramp_frame_unwind); - /* Solaris encodes the pid of the inferior in regset section - names. */ - set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1); - /* How to print LWP PTIDs from core files. */ set_gdbarch_core_pid_to_str (gdbarch, sol2_core_pid_to_str); } diff --git a/gdb/sparc64-sol2-tdep.c b/gdb/sparc64-sol2-tdep.c index 0c2b9016f29..4e57ff15f17 100644 --- a/gdb/sparc64-sol2-tdep.c +++ b/gdb/sparc64-sol2-tdep.c @@ -181,10 +181,6 @@ sparc64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) /* Solaris has kernel-assisted single-stepping support. */ set_gdbarch_software_single_step (gdbarch, NULL); - /* Solaris encodes the pid of the inferior in regset section - names. */ - set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1); - /* How to print LWP PTIDs from core files. */ set_gdbarch_core_pid_to_str (gdbarch, sol2_core_pid_to_str); } -- 2.30.2