diff options
author | Yao Qi <yao.qi@linaro.org> | 2017-10-23 14:50:18 +0100 |
---|---|---|
committer | Christoph Muellner <christoph.muellner@theobroma-systems.com> | 2018-04-27 14:38:50 +0200 |
commit | 4e556d512fa9014a7c68d33310171f18301236e4 (patch) | |
tree | 255e6c27a9fda8812d68890f1d5d8dfe6212ad3e /bfd/elfxx-aarch64.c | |
parent | b755db3c98137baaff8a154d936d326d9a9c72a7 (diff) |
ILP32: BFD
Rebased 2c5e2ba3ced851a18c488c630abd00ca99523bbd from linaro's
gdb-aarch64-ilp32 branch on GDB 8.1-release.
bfd:
2017-03-06 Andrew Pinski <apinski@cavium.com>
Steve Ellcey <sellcey@cavium.com>
* cpu-aarch64.c (compatible):
Don't reject different ILP32/LP64 ABI's here.
* elfnn-aarch64.c (elfNN_aarch64_merge_private_bfd_data):
Add an error message on why endianess is rejected.
Reject different ILP32/LP64 ABI settings.
* elfxx-aarch64.c (_bfd_aarch64_elf_grok_prstatus): Handle
size and offset of ILP32 executables.
(_bfd_aarch64_elf_grok_psinfo): Ditto.
Diffstat (limited to 'bfd/elfxx-aarch64.c')
-rw-r--r-- | bfd/elfxx-aarch64.c | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/bfd/elfxx-aarch64.c b/bfd/elfxx-aarch64.c index 9d4aa8fb20..83812e9c9e 100644 --- a/bfd/elfxx-aarch64.c +++ b/bfd/elfxx-aarch64.c @@ -548,7 +548,18 @@ _bfd_aarch64_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, return TRUE; } -/* Support for core dump NOTE sections. */ +/* Support for core dump NOTE sections. + + note->descsz should be the size of elf_prstatus, defined in + usr/include/linux/elfcore.h. The size is 352 in ILP32 mode + and 392 in LP64 mode. elf_tdata (abfd)->core->signal is set from the + pr_cursig field of elf_prstatus which is at an offset of 12 in the + elf_prstatus structure in both ILP32 and LP64 modes. + + elf_tdata (abfd)->core->lwpid is set from the pr_pid field of the + elf_prstatus structure. It has an offset of 24 in ILP32 mode and + 32 in LP64 mode due to two long fields in the structure that are in + front of the pr_pid field. */ bfd_boolean _bfd_aarch64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) @@ -561,14 +572,27 @@ _bfd_aarch64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) default: return FALSE; - case 392: /* sizeof(struct elf_prstatus) on Linux/arm64. */ + case 352: /* sizeof(struct elf_prstatus) on Linux/aarch64 ilp32. */ + /* pr_cursig */ + elf_tdata (abfd)->core->signal + = bfd_get_16 (abfd, note->descdata + 12); + + /* pr_pid */ + elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24); + + /* pr_reg */ + offset = 72; + size = 272; + + break; + + case 392: /* sizeof(struct elf_prstatus) on Linux/aarch64. */ /* pr_cursig */ elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12); /* pr_pid */ - elf_tdata (abfd)->core->lwpid - = bfd_get_32 (abfd, note->descdata + 32); + elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32); /* pr_reg */ offset = 112; @@ -590,12 +614,21 @@ _bfd_aarch64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) default: return FALSE; + case 124: /* sizeof(struct elf_prpsinfo) on Linux/aarch64 ilp32. */ + 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 + = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80); + break; + case 136: /* This is sizeof(struct elf_prpsinfo) on Linux/aarch64. */ 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 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80); + break; } /* Note that for some reason, a spurious space is tacked |