/* Print contents of core note. Copyright (C) 2002, 2004 Red Hat, Inc. Written by Ulrich Drepper <drepper@redhat.com>, 2002. This program is Open Source software; you can redistribute it and/or modify it under the terms of the Open Software License version 1.0 as published by the Open Source Initiative. You should have received a copy of the Open Software License along with this program; if not, you may obtain a copy of the Open Software License version 1.0 from http://www.opensource.org/licenses/osl.php or by writing the Open Source Initiative c/o Lawrence Rosen, Esq., 3001 King Ranch Road, Ukiah, CA 95482. */ #ifdef HAVE_CONFIG_H # include <config.h> #endif #include <inttypes.h> #include <stdio.h> #include <stddef.h> #include <libeblP.h> void ebl_core_note (ebl, name, type, descsz, desc) Ebl *ebl; const char *name; uint32_t type; uint32_t descsz; const char *desc; { int class = gelf_getclass (ebl->elf); if (! ebl->core_note (name, type, descsz, desc)) /* The machine specific function did not know this type. */ switch (type) { case NT_PLATFORM: printf (gettext (" Platform: %.*s\n"), (int) descsz, desc); break; case NT_AUXV: ; size_t cnt; size_t elsize = (class == ELFCLASS32 ? sizeof (Elf32_auxv_t) : sizeof (Elf64_auxv_t)); for (cnt = 0; (cnt + 1) * elsize <= descsz; ++cnt) { unsigned long int atype; unsigned long int val; if (class == ELFCLASS32) { Elf32_auxv_t *auxv = &((Elf32_auxv_t *) desc)[cnt]; atype = auxv->a_type; val = auxv->a_un.a_val; } else { Elf64_auxv_t *auxv = &((Elf64_auxv_t *) desc)[cnt]; atype = auxv->a_type; val = auxv->a_un.a_val; } /* XXX Do we need the auxiliary vector info anywhere else? If yes, move code into a separate function. */ const char *at; switch (atype) { #define NEW_AT(name) case AT_##name: at = #name; break NEW_AT (NULL); NEW_AT (IGNORE); NEW_AT (EXECFD); NEW_AT (PHDR); NEW_AT (PHENT); NEW_AT (PHNUM); NEW_AT (PAGESZ); NEW_AT (BASE); NEW_AT (FLAGS); NEW_AT (ENTRY); NEW_AT (NOTELF); NEW_AT (UID); NEW_AT (EUID); NEW_AT (GID); NEW_AT (EGID); NEW_AT (CLKTCK); NEW_AT (PLATFORM); NEW_AT (HWCAP); NEW_AT (FPUCW); NEW_AT (DCACHEBSIZE); NEW_AT (ICACHEBSIZE); NEW_AT (UCACHEBSIZE); NEW_AT (IGNOREPPC); default: at = "???"; break; } switch (atype) { case AT_NULL: case AT_IGNORE: case AT_IGNOREPPC: case AT_NOTELF: default: printf (" %s\n", at); break; case AT_EXECFD: case AT_PHENT: case AT_PHNUM: case AT_PAGESZ: case AT_UID: case AT_EUID: case AT_GID: case AT_EGID: case AT_CLKTCK: case AT_FPUCW: case AT_DCACHEBSIZE: case AT_ICACHEBSIZE: case AT_UCACHEBSIZE: printf (" %s: %" PRId64 "\n", at, (int64_t) val); break; case AT_PHDR: case AT_BASE: case AT_FLAGS: /* XXX Print flags? */ case AT_ENTRY: case AT_PLATFORM: /* XXX Get string? */ case AT_HWCAP: /* XXX Print flags? */ printf (" %s: %" PRIx64 "\n", at, (uint64_t) val); break; } if (atype == AT_NULL) /* Reached the end. */ break; } break; default: /* Unknown type. */ break; } }