diff options
-rw-r--r-- | bfd/ChangeLog | 14 | ||||
-rw-r--r-- | bfd/config.bfd | 2 | ||||
-rw-r--r-- | bfd/config.in | 3 | ||||
-rwxr-xr-x | bfd/configure | 8 | ||||
-rw-r--r-- | bfd/configure.in | 1 | ||||
-rw-r--r-- | bfd/elf.c | 83 |
6 files changed, 109 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 063dbce..ddec593 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,17 @@ +2000-01-10 Egor Duda <deo@logos-m.ru> + + * config.bfd: Include elf32_i386 vector to target list for cygwin + and mingw. + + * config.in: Undefine HAVE_WIN32_PSTATUS_T. + * configure.in: Test for structure win32_pstatus_t in + <sys/procfs.h> + * configure: Regenerate. + + * elf.c (elfcore_grok_win32pstatus): New function: process + win32_pstatus_t notes in elf core file. + (elfcore_grok_note): Detect win32_pstatus notes. + 2000-01-03 Martin v. Loewis <loewis@informatik.hu-berlin.de> * elflink.c (_bfd_elf_link_record_dynamic_symbol): Process symbol diff --git a/bfd/config.bfd b/bfd/config.bfd index b5f08a3..e844bf1 100644 --- a/bfd/config.bfd +++ b/bfd/config.bfd @@ -316,7 +316,7 @@ case "${targ}" in ;; i[3456]86-*-mingw32* | i[3456]86-*-cygwin* | i[3456]86-*-winnt | i[3456]86-*-pe) targ_defvec=i386pe_vec - targ_selvecs="i386pe_vec i386pei_vec" + targ_selvecs="i386pe_vec i386pei_vec bfd_elf32_i386_vec" ;; i[3456]86-none-*) targ_defvec=i386coff_vec diff --git a/bfd/config.in b/bfd/config.in index abb2c78..7383656 100644 --- a/bfd/config.in +++ b/bfd/config.in @@ -232,6 +232,9 @@ /* Define if <sys/procfs.h> has lwpstatus_t.pr_reg. */ #undef HAVE_LWPSTATUS_T_PR_REG +/* Define if <sys/procfs.h> has win32_pstatus_t. */ +#undef HAVE_WIN32_PSTATUS_T + /* Name of host specific header file to include in trad-core.c. */ #undef TRAD_HEADER diff --git a/bfd/configure b/bfd/configure index adc316d..53c7b3f 100755 --- a/bfd/configure +++ b/bfd/configure @@ -5267,6 +5267,14 @@ EOF fi fi + if test $bfd_cv_have_sys_procfs_type_lwpstatus_t = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_LWPSTATUS_T 1 +EOF + + fi + echo "$ac_t""$bfd_cv_have_sys_procfs_type_lwpstatus_t" 1>&6 + cat >> confdefs.h <<EOF #define TRAD_HEADER $TRAD_HEADER diff --git a/bfd/configure.in b/bfd/configure.in index 4976c3a..88d3731 100644 --- a/bfd/configure.in +++ b/bfd/configure.in @@ -314,6 +314,7 @@ changequote([,])dnl BFD_HAVE_SYS_PROCFS_TYPE(lwpstatus_t) BFD_HAVE_SYS_PROCFS_TYPE_MEMBER(lwpstatus_t, pr_context) BFD_HAVE_SYS_PROCFS_TYPE_MEMBER(lwpstatus_t, pr_reg) + BFD_HAVE_SYS_PROCFS_TYPE(win32_pstatus_t) fi fi AC_SUBST(COREFILE) @@ -5292,7 +5292,83 @@ elfcore_grok_lwpstatus (abfd, note) } #endif /* defined (HAVE_LWPSTATUS_T) */ +#if defined (HAVE_WIN32_PSTATUS_T) +static boolean +elfcore_grok_win32pstatus (abfd, note) + bfd * abfd; + Elf_Internal_Note * note; +{ + char buf[30]; + char * name; + asection * sect; + win32_pstatus_t pstatus; + + if (note->descsz < sizeof (pstatus)) + return true; + + memcpy (& pstatus, note->descdata, note->descsz); + + switch (pstatus.data_type) + { + case NOTE_INFO_PROCESS: + /* FIXME: need to add ->core_command. */ + elf_tdata (abfd)->core_signal = pstatus.data.process_info.signal; + elf_tdata (abfd)->core_pid = pstatus.data.process_info.pid; + break ; + + case NOTE_INFO_THREAD: + /* Make a ".reg/999" section. */ + sprintf (buf, ".reg/%d", pstatus.data.thread_info.tid); + + name = bfd_alloc (abfd, strlen (buf) + 1); + if (name == NULL) + return false; + + strcpy (name, buf); + + sect = bfd_make_section (abfd, name); + if (sect == NULL) + return false; + + sect->_raw_size = sizeof (pstatus.data.thread_info.thread_context); + sect->filepos = note->descpos + offsetof (struct win32_pstatus, + data.thread_info.thread_context); + sect->flags = SEC_HAS_CONTENTS; + sect->alignment_power = 2; + + if (pstatus.data.thread_info.is_active_thread) + if (! elfcore_maybe_make_sect (abfd, ".reg", sect)) + return false; + break; + + case NOTE_INFO_MODULE: + /* Make a ".module/xxxxxxxx" section. */ + sprintf (buf, ".module/%08x" , pstatus.data.module_info.base_address); + + name = bfd_alloc (abfd, strlen (buf) + 1); + if (name == NULL) + return false; + + strcpy (name, buf); + sect = bfd_make_section (abfd, name); + + if (sect == NULL) + return false; + + sect->_raw_size = note->descsz; + sect->filepos = note->descpos; + sect->flags = SEC_HAS_CONTENTS; + sect->alignment_power = 2; + break; + + default: + return true; + } + + return true; +} +#endif /* HAVE_WIN32_PSTATUS_T */ static boolean elfcore_grok_note (abfd, note) @@ -5322,7 +5398,12 @@ elfcore_grok_note (abfd, note) case NT_FPREGSET: /* FIXME: rename to NT_PRFPREG */ return elfcore_grok_prfpreg (abfd, note); - case NT_PRXFPREG: /* Linux SSE extension */ +#if defined (HAVE_WIN32_PSTATUS_T) + case NT_WIN32PSTATUS: + return elfcore_grok_win32pstatus (abfd, note); +#endif + + case NT_PRXFPREG: /* Linux SSE extension */ if (note->namesz == 5 && ! strcmp (note->namedata, "LINUX")) return elfcore_grok_prxfpreg (abfd, note); |