diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2011-06-16 22:08:12 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2011-06-16 22:08:12 +0000 |
commit | 8fd79e71a13726d33285c696f019be5010a332d5 (patch) | |
tree | 71515fce7292d32e646f4835509c3f29c6ee66e4 /bfd/elf64-x86-64.c | |
parent | 9d3b06987a9f8e6c40bf90f502f57d1c2b6b10ed (diff) | |
download | gdb-8fd79e71a13726d33285c696f019be5010a332d5.zip gdb-8fd79e71a13726d33285c696f019be5010a332d5.tar.gz gdb-8fd79e71a13726d33285c696f019be5010a332d5.tar.bz2 |
Suport x32 gcore.
2011-06-16 H.J. Lu <hongjiu.lu@intel.com>
* elf64-x86-64.c: Include <stdarg.h> and CORE_HEADER if
CORE_HEADER is defined.
(elf_x86_64_write_core_note): New.
(elf_backend_write_core_note): Likewise.
* hosts/x86-64linux.h (uint64_t): New.
(user_regsx32_struct): Likewise.
(elf_gregx32_t): Likewise.
(ELF_NGREGX32): Likewise.
(elf_gregsetx32_t): Likewise.
(elf_prstatusx32): Likewise.
(prstatusx32_t): Likewise.
(user_fpregs32_struct): Removed.
(user_fpxregs32_struct): Likewise.
(user32): Likewise.
(elf_fpregset32_t): Likewise.
(elf_fpxregset32_t): Likewise.
(prgregset32_t): Likewise.
(prfpregset32_t): Likewise.
Diffstat (limited to 'bfd/elf64-x86-64.c')
-rw-r--r-- | bfd/elf64-x86-64.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index de65197..23b5559 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -32,6 +32,11 @@ #include "elf/x86-64.h" +#ifdef CORE_HEADER +#include <stdarg.h> +#include CORE_HEADER +#endif + /* In case we're on a 32-bit machine, construct a 64-bit "-1" value. */ #define MINUS_ONE (~ (bfd_vma) 0) @@ -385,6 +390,99 @@ elf_x86_64_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) return TRUE; } + +#ifdef CORE_HEADER +static char * +elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz, + int note_type, ...) +{ + const struct elf_backend_data *bed = get_elf_backend_data (abfd); + const void *p; + int size; + va_list ap; + const char *fname, *psargs; + long pid; + int cursig; + const void *gregs; + + switch (note_type) + { + default: + return NULL; + + case NT_PRPSINFO: + va_start (ap, note_type); + fname = va_arg (ap, const char *); + psargs = va_arg (ap, const char *); + va_end (ap); + + if (bed->s->elfclass == ELFCLASS32) + { + prpsinfo32_t data; + memset (&data, 0, sizeof (data)); + strncpy (data.pr_fname, fname, sizeof (data.pr_fname)); + strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs)); + p = (const void *) &data; + size = sizeof (data); + } + else + { + prpsinfo_t data; + memset (&data, 0, sizeof (data)); + strncpy (data.pr_fname, fname, sizeof (data.pr_fname)); + strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs)); + p = (const void *) &data; + size = sizeof (data); + } + break; + + case NT_PRSTATUS: + va_start (ap, note_type); + pid = va_arg (ap, long); + cursig = va_arg (ap, int); + gregs = va_arg (ap, const void *); + va_end (ap); + + if (bed->s->elfclass == ELFCLASS32) + { + if (bed->elf_machine_code == EM_X86_64) + { + prstatusx32_t prstat; + memset (&prstat, 0, sizeof (prstat)); + prstat.pr_pid = pid; + prstat.pr_cursig = cursig; + memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg)); + p = (const void *) &prstat; + size = sizeof (prstat); + } + else + { + prstatus32_t prstat; + memset (&prstat, 0, sizeof (prstat)); + prstat.pr_pid = pid; + prstat.pr_cursig = cursig; + memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg)); + p = (const void *) &prstat; + size = sizeof (prstat); + } + } + else + { + prstatus_t prstat; + memset (&prstat, 0, sizeof (prstat)); + prstat.pr_pid = pid; + prstat.pr_cursig = cursig; + memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg)); + p = (const void *) &prstat; + size = sizeof (prstat); + } + break; + } + + return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type, p, + size); +} +#endif /* Functions for the x86-64 ELF linker. */ @@ -4711,6 +4809,9 @@ static const struct bfd_elf_special_section #define elf_backend_gc_sweep_hook elf_x86_64_gc_sweep_hook #define elf_backend_grok_prstatus elf_x86_64_grok_prstatus #define elf_backend_grok_psinfo elf_x86_64_grok_psinfo +#ifdef CORE_HEADER +#define elf_backend_write_core_note elf_x86_64_write_core_note +#endif #define elf_backend_reloc_type_class elf_x86_64_reloc_type_class #define elf_backend_relocate_section elf_x86_64_relocate_section #define elf_backend_size_dynamic_sections elf_x86_64_size_dynamic_sections |