diff options
Diffstat (limited to 'src/readelf.c')
-rw-r--r-- | src/readelf.c | 44 |
1 files changed, 28 insertions, 16 deletions
diff --git a/src/readelf.c b/src/readelf.c index 5f425c974e762..3df0836d7029e 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -27,7 +27,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: readelf.c,v 1.138 2017/08/27 07:55:02 christos Exp $") +FILE_RCSID("@(#)$File: readelf.c,v 1.141 2018/04/12 16:50:52 christos Exp $") #endif #ifdef BUILTIN_ELF @@ -310,18 +310,19 @@ private const char os_style_names[][8] = { "NetBSD", }; -#define FLAGS_CORE_STYLE 0x003 +#define FLAGS_CORE_STYLE 0x0003 -#define FLAGS_DID_CORE 0x004 -#define FLAGS_DID_OS_NOTE 0x008 -#define FLAGS_DID_BUILD_ID 0x010 -#define FLAGS_DID_CORE_STYLE 0x020 -#define FLAGS_DID_NETBSD_PAX 0x040 -#define FLAGS_DID_NETBSD_MARCH 0x080 -#define FLAGS_DID_NETBSD_CMODEL 0x100 -#define FLAGS_DID_NETBSD_UNKNOWN 0x200 -#define FLAGS_IS_CORE 0x400 -#define FLAGS_DID_AUXV 0x800 +#define FLAGS_DID_CORE 0x0004 +#define FLAGS_DID_OS_NOTE 0x0008 +#define FLAGS_DID_BUILD_ID 0x0010 +#define FLAGS_DID_CORE_STYLE 0x0020 +#define FLAGS_DID_NETBSD_PAX 0x0040 +#define FLAGS_DID_NETBSD_MARCH 0x0080 +#define FLAGS_DID_NETBSD_CMODEL 0x0100 +#define FLAGS_DID_NETBSD_EMULATION 0x0200 +#define FLAGS_DID_NETBSD_UNKNOWN 0x0400 +#define FLAGS_IS_CORE 0x0800 +#define FLAGS_DID_AUXV 0x1000 private int dophn_core(struct magic_set *ms, int clazz, int swap, int fd, off_t off, @@ -726,11 +727,11 @@ do_core_note(struct magic_set *ms, unsigned char *nbuf, uint32_t type, "gid=%u, nlwps=%u, lwp=%u (signal %u/code %u)", file_printable(sbuf, sizeof(sbuf), CAST(char *, pi.cpi_name)), - elf_getu32(swap, pi.cpi_pid), + elf_getu32(swap, (uint32_t)pi.cpi_pid), elf_getu32(swap, pi.cpi_euid), elf_getu32(swap, pi.cpi_egid), elf_getu32(swap, pi.cpi_nlwps), - elf_getu32(swap, pi.cpi_siglwp), + elf_getu32(swap, (uint32_t)pi.cpi_siglwp), elf_getu32(swap, pi.cpi_signo), elf_getu32(swap, pi.cpi_sigcode)) == -1) return 1; @@ -908,6 +909,7 @@ get_string_on_virtaddr(struct magic_set *ms, } +/*ARGSUSED*/ private int do_auxv_note(struct magic_set *ms, unsigned char *nbuf, uint32_t type, int swap, uint32_t namesz __attribute__((__unused__)), @@ -1134,6 +1136,14 @@ donote(struct magic_set *ms, void *vbuf, size_t offset, size_t size, (int)descsz, (const char *)&nbuf[doff]) == -1) return offset; break; + case NT_NETBSD_EMULATION: + if (*flags & FLAGS_DID_NETBSD_EMULATION) + return offset; + *flags |= FLAGS_DID_NETBSD_EMULATION; + if (file_printf(ms, ", emulation: %.*s", + (int)descsz, (const char *)&nbuf[doff]) == -1) + return offset; + break; default: if (*flags & FLAGS_DID_NETBSD_UNKNOWN) return offset; @@ -1570,9 +1580,11 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off, protected int -file_tryelf(struct magic_set *ms, int fd, const unsigned char *buf, - size_t nbytes) +file_tryelf(struct magic_set *ms, const struct buffer *b) { + int fd = b->fd; + const unsigned char *buf = b->fbuf; + size_t nbytes = b->flen; union { int32_t l; char c[sizeof (int32_t)]; |