| /* 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; |
| } |
| } |