readelf: add support for QNT_STACK note subsections
QNX provides some .note subsections. QNT_STACK is the one controling the stack allocation. bfd/ChangeLog: * elf.c (BFD_QNT_CORE_INFO): Delete. (BFD_QNT_CORE_STATUS): Likewise. (BFD_QNT_CORE_GREG): Likewise. (BFD_QNT_CORE_FPREG): Likewise. (elfcore_grok_nto_note): Replace BFD_QNT_* by QNT_*. binutils/ChangeLog: * readelf.c (get_qnx_elfcore_note_type): New function. (print_qnx_note): New function. (process_note): Add support for QNX support. include/ChangeLog: * elf/common.h (QNT_DEBUG_FULLPATH): New define. (QNT_DEBUG_RELOC): New define. (QNT_STACK): New define. (QNT_GENERATOR): New define. (QNT_DEFAULT_LIB): New define. (QNT_CORE_SYSINFO): New define. (QNT_CORE_INFO): New define. (QNT_CORE_STATUS): New define. (QNT_CORE_GREG): New define. (QNT_CORE_FPREG): New define. (QNT_LINK_MAP): New define.
This commit is contained in:
@@ -11543,11 +11543,6 @@ elfcore_grok_nto_regs (bfd *abfd,
|
||||
return true;
|
||||
}
|
||||
|
||||
#define BFD_QNT_CORE_INFO 7
|
||||
#define BFD_QNT_CORE_STATUS 8
|
||||
#define BFD_QNT_CORE_GREG 9
|
||||
#define BFD_QNT_CORE_FPREG 10
|
||||
|
||||
static bool
|
||||
elfcore_grok_nto_note (bfd *abfd, Elf_Internal_Note *note)
|
||||
{
|
||||
@@ -11558,13 +11553,13 @@ elfcore_grok_nto_note (bfd *abfd, Elf_Internal_Note *note)
|
||||
|
||||
switch (note->type)
|
||||
{
|
||||
case BFD_QNT_CORE_INFO:
|
||||
case QNT_CORE_INFO:
|
||||
return elfcore_make_note_pseudosection (abfd, ".qnx_core_info", note);
|
||||
case BFD_QNT_CORE_STATUS:
|
||||
case QNT_CORE_STATUS:
|
||||
return elfcore_grok_nto_status (abfd, note, &tid);
|
||||
case BFD_QNT_CORE_GREG:
|
||||
case QNT_CORE_GREG:
|
||||
return elfcore_grok_nto_regs (abfd, note, tid, ".reg");
|
||||
case BFD_QNT_CORE_FPREG:
|
||||
case QNT_CORE_FPREG:
|
||||
return elfcore_grok_nto_regs (abfd, note, tid, ".reg2");
|
||||
default:
|
||||
return true;
|
||||
|
||||
@@ -20722,6 +20722,38 @@ get_openbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
|
||||
return get_note_type (filedata, e_type);
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_qnx_elfcore_note_type (Filedata * filedata, unsigned e_type)
|
||||
{
|
||||
switch (e_type)
|
||||
{
|
||||
case QNT_DEBUG_FULLPATH:
|
||||
return _("QNX debug fullpath");
|
||||
case QNT_DEBUG_RELOC:
|
||||
return _("QNX debug relocation");
|
||||
case QNT_STACK:
|
||||
return _("QNX stack");
|
||||
case QNT_GENERATOR:
|
||||
return _("QNX generator");
|
||||
case QNT_DEFAULT_LIB:
|
||||
return _("QNX default library");
|
||||
case QNT_CORE_SYSINFO:
|
||||
return _("QNX core sysinfo");
|
||||
case QNT_CORE_INFO:
|
||||
return _("QNX core info");
|
||||
case QNT_CORE_STATUS:
|
||||
return _("QNX core status");
|
||||
case QNT_CORE_GREG:
|
||||
return _("QNX general registers");
|
||||
case QNT_CORE_FPREG:
|
||||
return _("QNX floating point registers");
|
||||
case QNT_LINK_MAP:
|
||||
return _("QNX link map");
|
||||
}
|
||||
|
||||
return get_note_type (filedata, e_type);
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_stapsdt_note_type (unsigned e_type)
|
||||
{
|
||||
@@ -21646,6 +21678,35 @@ print_amdgpu_note (Elf_Internal_Note *pnote)
|
||||
#endif
|
||||
}
|
||||
|
||||
static bool
|
||||
print_qnx_note (Elf_Internal_Note *pnote)
|
||||
{
|
||||
switch (pnote->type)
|
||||
{
|
||||
case QNT_STACK:
|
||||
if (pnote->descsz != 12)
|
||||
goto desc_size_fail;
|
||||
|
||||
printf (_(" Stack Size: 0x%" PRIx32 "\n"),
|
||||
(unsigned) byte_get ((unsigned char *) pnote->descdata, 4));
|
||||
printf (_(" Stack allocated: %" PRIx32 "\n"),
|
||||
(unsigned) byte_get ((unsigned char *) pnote->descdata + 4, 4));
|
||||
printf (_(" Executable: %s\n"),
|
||||
((unsigned) byte_get ((unsigned char *) pnote->descdata + 8, 1)) ? "no": "yes");
|
||||
break;
|
||||
|
||||
default:
|
||||
print_note_contents_hex(pnote);
|
||||
}
|
||||
return true;
|
||||
|
||||
desc_size_fail:
|
||||
printf (_(" <corrupt - data size is too small>\n"));
|
||||
error (_("corrupt QNX note: data size is too small\n"));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/* Note that by the ELF standard, the name field is already null byte
|
||||
terminated, and namesz includes the terminating null byte.
|
||||
I.E. the value of namesz for the name "FSF" is 4.
|
||||
@@ -21692,6 +21753,10 @@ process_note (Elf_Internal_Note * pnote,
|
||||
/* OpenBSD-specific core file notes. */
|
||||
nt = get_openbsd_elfcore_note_type (filedata, pnote->type);
|
||||
|
||||
else if (startswith (pnote->namedata, "QNX"))
|
||||
/* QNX-specific core file notes. */
|
||||
nt = get_qnx_elfcore_note_type (filedata, pnote->type);
|
||||
|
||||
else if (startswith (pnote->namedata, "SPU/"))
|
||||
{
|
||||
/* SPU-specific core file notes. */
|
||||
@@ -21746,6 +21811,8 @@ process_note (Elf_Internal_Note * pnote,
|
||||
else if (startswith (pnote->namedata, "AMDGPU")
|
||||
&& pnote->type == NT_AMDGPU_METADATA)
|
||||
return print_amdgpu_note (pnote);
|
||||
else if (startswith (pnote->namedata, "QNX"))
|
||||
return print_qnx_note (pnote);
|
||||
|
||||
print_note_contents_hex (pnote);
|
||||
return true;
|
||||
|
||||
@@ -768,6 +768,19 @@
|
||||
#define NT_OPENBSD_XFPREGS 22
|
||||
#define NT_OPENBSD_WCOOKIE 23
|
||||
|
||||
/* Note segments for core files on QNX systems. Note name
|
||||
must start with "QNX". */
|
||||
#define QNT_DEBUG_FULLPATH 1
|
||||
#define QNT_DEBUG_RELOC 2
|
||||
#define QNT_STACK 3
|
||||
#define QNT_GENERATOR 4
|
||||
#define QNT_DEFAULT_LIB 5
|
||||
#define QNT_CORE_SYSINFO 6
|
||||
#define QNT_CORE_INFO 7
|
||||
#define QNT_CORE_STATUS 8
|
||||
#define QNT_CORE_GREG 9
|
||||
#define QNT_CORE_FPREG 10
|
||||
#define QNT_LINK_MAP 11
|
||||
|
||||
/* Note segments for core files on Solaris systems. Note name
|
||||
must start with "CORE". */
|
||||
|
||||
Reference in New Issue
Block a user