Page MenuHomeFreeBSD

D24566.id70969.diff
No OneTemporary

D24566.id70969.diff

Index: contrib/elftoolchain/libelf/Makefile
===================================================================
--- contrib/elftoolchain/libelf/Makefile
+++ contrib/elftoolchain/libelf/Makefile
@@ -30,6 +30,7 @@
elf_update.c \
elf_version.c \
gelf_cap.c \
+ gelf_chdr.c \
gelf_checksum.c \
gelf_dyn.c \
gelf_ehdr.c \
@@ -49,6 +50,7 @@
libelf_allocate.c \
libelf_ar.c \
libelf_ar_util.c \
+ libelf_chdr.c \
libelf_checksum.c \
libelf_data.c \
libelf_ehdr.c \
Index: contrib/elftoolchain/libelf/_libelf.h
===================================================================
--- contrib/elftoolchain/libelf/_libelf.h
+++ contrib/elftoolchain/libelf/_libelf.h
@@ -220,6 +220,7 @@
size_t count);
_libelf_translator_function *_libelf_get_translator(Elf_Type _t,
int _direction, int _elfclass, int _elfmachine);
+void *_libelf_getchdr(Elf_Scn *_e, int _elfclass);
void *_libelf_getphdr(Elf *_e, int _elfclass);
void *_libelf_getshdr(Elf_Scn *_scn, int _elfclass);
void _libelf_init_elf(Elf *_e, Elf_Kind _kind);
Index: contrib/elftoolchain/libelf/elf_errmsg.c
===================================================================
--- contrib/elftoolchain/libelf/elf_errmsg.c
+++ contrib/elftoolchain/libelf/elf_errmsg.c
@@ -44,9 +44,12 @@
DEFINE_ERROR(CLASS, "ELF class mismatch"),
DEFINE_ERROR(DATA, "Invalid data buffer descriptor"),
DEFINE_ERROR(HEADER, "Missing or malformed ELF header"),
+ DEFINE_ERROR(INVALID_SECTION_FLAGS, "invalid section flags"),
+ DEFINE_ERROR(INVALID_SECTION_TYPE, "invalid section type"),
DEFINE_ERROR(IO, "I/O error"),
DEFINE_ERROR(LAYOUT, "Layout constraint violation"),
DEFINE_ERROR(MODE, "Incorrect ELF descriptor mode"),
+ DEFINE_ERROR(NOT_COMPRESSED, "section does not contain compressed data"),
DEFINE_ERROR(RANGE, "Value out of range of target"),
DEFINE_ERROR(RESOURCE, "Resource exhaustion"),
DEFINE_ERROR(SECTION, "Invalid section descriptor"),
Index: contrib/elftoolchain/libelf/gelf.h
===================================================================
--- contrib/elftoolchain/libelf/gelf.h
+++ contrib/elftoolchain/libelf/gelf.h
@@ -39,6 +39,7 @@
typedef Elf64_Word GElf_Word; /* Unsigned words (32 bit) */
typedef Elf64_Xword GElf_Xword; /* Unsigned long words (64 bit) */
+typedef Elf64_Chdr GElf_Chdr; /* Compressed section header */
typedef Elf64_Dyn GElf_Dyn; /* ".dynamic" section entries */
typedef Elf64_Ehdr GElf_Ehdr; /* ELF header */
typedef Elf64_Phdr GElf_Phdr; /* Program header */
@@ -73,6 +74,7 @@
long gelf_checksum(Elf *_elf);
size_t gelf_fsize(Elf *_elf, Elf_Type _type, size_t _count,
unsigned int _version);
+GElf_Chdr *gelf_getchdr(Elf_Scn *_scn, GElf_Chdr *_dst);
int gelf_getclass(Elf *_elf);
GElf_Dyn *gelf_getdyn(Elf_Data *_data, int _index, GElf_Dyn *_dst);
GElf_Ehdr *gelf_getehdr(Elf *_elf, GElf_Ehdr *_dst);
Index: contrib/elftoolchain/libelf/gelf_chdr.c
===================================================================
--- /dev/null
+++ contrib/elftoolchain/libelf/gelf_chdr.c
@@ -0,0 +1,83 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2018 The FreeBSD Foundation
+ *
+ * This software was developed by Tiger Gao under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <assert.h>
+#include <gelf.h>
+#include <libelf.h>
+#include <limits.h>
+#include <stdint.h>
+
+#include "_libelf.h"
+
+
+Elf32_Chdr *
+elf32_getchdr(Elf_Scn *s)
+{
+ return (_libelf_getchdr(s, ELFCLASS32));
+}
+
+Elf64_Chdr *
+elf64_getchdr(Elf_Scn *s)
+{
+ return (_libelf_getchdr(s, ELFCLASS64));
+}
+
+GElf_Chdr *
+gelf_getchdr(Elf_Scn *s, GElf_Chdr *d)
+{
+ int ec;
+ void *ch;
+ Elf32_Chdr *ch32;
+ Elf64_Chdr *ch64;
+
+ if (d == NULL) {
+ LIBELF_SET_ERROR(ARGUMENT, 0);
+ return (NULL);
+ }
+
+ if ((ch = _libelf_getchdr(s, ELFCLASSNONE)) == NULL)
+ return (NULL);
+
+ ec = s->s_elf->e_class;
+ assert(ec == ELFCLASS32 || ec == ELFCLASS64);
+
+ if (ec == ELFCLASS32) {
+ ch32 = (Elf32_Chdr *) ch;
+
+ d->ch_type = (Elf64_Word) ch32->ch_type;
+ d->ch_size = (Elf64_Xword) ch32->ch_size;
+ d->ch_addralign = (Elf64_Xword) ch32->ch_addralign;
+ } else {
+ ch64 = (Elf64_Chdr *) ch;
+ *d = *ch64;
+ }
+
+ return (d);
+}
Index: contrib/elftoolchain/libelf/libelf.h
===================================================================
--- contrib/elftoolchain/libelf/libelf.h
+++ contrib/elftoolchain/libelf/libelf.h
@@ -153,9 +153,12 @@
ELF_E_CLASS, /* Mismatched ELF class */
ELF_E_DATA, /* Invalid data descriptor */
ELF_E_HEADER, /* Missing or malformed ELF header */
+ ELF_E_INVALID_SECTION_FLAGS, /* Invalid ELF section header flags */
+ ELF_E_INVALID_SECTION_TYPE, /* Invalid ELF section header type */
ELF_E_IO, /* I/O error */
ELF_E_LAYOUT, /* Layout constraint violation */
ELF_E_MODE, /* Wrong mode for ELF descriptor */
+ ELF_E_NOT_COMPRESSED, /* Section is not compressed */
ELF_E_RANGE, /* Value out of range */
ELF_E_RESOURCE, /* Resource exhaustion */
ELF_E_SECTION, /* Invalid section descriptor */
@@ -227,6 +230,7 @@
long elf32_checksum(Elf *_elf);
size_t elf32_fsize(Elf_Type _type, size_t _count,
unsigned int _version);
+Elf32_Chdr *elf32_getchdr(Elf_Scn *_scn);
Elf32_Ehdr *elf32_getehdr(Elf *_elf);
Elf32_Phdr *elf32_getphdr(Elf *_elf);
Elf32_Shdr *elf32_getshdr(Elf_Scn *_scn);
@@ -240,6 +244,7 @@
long elf64_checksum(Elf *_elf);
size_t elf64_fsize(Elf_Type _type, size_t _count,
unsigned int _version);
+Elf64_Chdr *elf64_getchdr(Elf_Scn *_scn);
Elf64_Ehdr *elf64_getehdr(Elf *_elf);
Elf64_Phdr *elf64_getphdr(Elf *_elf);
Elf64_Shdr *elf64_getshdr(Elf_Scn *_scn);
Index: contrib/elftoolchain/libelf/libelf_chdr.c
===================================================================
--- /dev/null
+++ contrib/elftoolchain/libelf/libelf_chdr.c
@@ -0,0 +1,105 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2018 The FreeBSD Foundation
+ *
+ * This software was developed by Tiger Gao under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <gelf.h>
+#include <libelf.h>
+
+#include "_libelf.h"
+
+
+void *
+_libelf_getchdr(Elf_Scn *s, int ec)
+{
+ Elf *e;
+ void *sh;
+ Elf32_Shdr *sh32;
+ Elf64_Shdr *sh64;
+
+ sh32 = NULL;
+ sh64 = NULL;
+
+ if (s == NULL || (e = s->s_elf) == NULL ||
+ e->e_kind != ELF_K_ELF) {
+ LIBELF_SET_ERROR(ARGUMENT, 0);
+ return (NULL);
+ }
+
+ if (ec == ELFCLASSNONE)
+ ec = e->e_class;
+
+ if (ec != e->e_class) {
+ LIBELF_SET_ERROR(CLASS, 0);
+ return (NULL);
+ }
+
+ if ((sh = _libelf_getshdr(s, ec)) == NULL)
+ return (NULL);
+
+ if (ec == ELFCLASS32) {
+ sh32 = (Elf32_Shdr *) sh;
+ if ((sh32->sh_flags & SHF_ALLOC) != 0) {
+ LIBELF_SET_ERROR(INVALID_SECTION_FLAGS, 0);
+ return (NULL);
+ }
+
+ if (sh32->sh_type == SHT_NULL || sh32->sh_type == SHT_NOBITS) {
+ LIBELF_SET_ERROR(INVALID_SECTION_TYPE, 0);
+ return (NULL);
+ }
+
+ if ((sh32->sh_flags & SHF_COMPRESSED) == 0) {
+ LIBELF_SET_ERROR(NOT_COMPRESSED, 0);
+ return (NULL);
+ }
+ } else {
+ sh64 = (Elf64_Shdr *) sh;
+ if ((sh64->sh_flags & SHF_ALLOC) != 0) {
+ LIBELF_SET_ERROR(INVALID_SECTION_FLAGS, 0);
+ return (NULL);
+ }
+
+ if (sh64->sh_type == SHT_NULL || sh64->sh_type == SHT_NOBITS) {
+ LIBELF_SET_ERROR(INVALID_SECTION_TYPE, 0);
+ return (NULL);
+ }
+
+ if ((sh64->sh_flags & SHF_COMPRESSED) == 0) {
+ LIBELF_SET_ERROR(NOT_COMPRESSED, 0);
+ return (NULL);
+ }
+ }
+
+ Elf_Data *d = elf_getdata(s, NULL);
+
+ if (!d)
+ return (NULL);
+
+ return ((void *) d->d_buf);
+}
Index: contrib/elftoolchain/readelf/readelf.c
===================================================================
--- contrib/elftoolchain/readelf/readelf.c
+++ contrib/elftoolchain/readelf/readelf.c
@@ -87,6 +87,7 @@
#define RE_WW 0x00040000
#define RE_W 0x00080000
#define RE_X 0x00100000
+#define RE_Z 0x00200000
/*
* dwarf dump options.
@@ -212,6 +213,7 @@
{"version-info", no_argument, 0, 'V'},
{"version", no_argument, 0, 'v'},
{"wide", no_argument, 0, 'W'},
+ {"decompress", no_argument, 0, 'z'},
{NULL, 0, NULL, 0}
};
@@ -2567,6 +2569,7 @@
dump_shdr(struct readelf *re)
{
struct section *s;
+ GElf_Chdr chdr;
int i;
#define S_HDR "[Nr] Name", "Type", "Addr", "Off", "Size", "ES", \
@@ -2589,6 +2592,10 @@
(uintmax_t)s->addr, (uintmax_t)s->off, s->link, \
(uintmax_t)s->sz, (uintmax_t)s->entsize, s->info, \
(uintmax_t)s->align, section_flags(re, s)
+#define SZ_CT i, s->name, section_type(re->ehdr.e_machine, s->type), \
+ (uintmax_t)s->addr, (uintmax_t)s->off, s->link, \
+ (uintmax_t)s->sz, (uintmax_t)s->entsize, s->info, \
+ (uintmax_t)s->align, section_flags(re, s)
if (re->shnum == 0) {
printf("\nThere are no sections in this file.\n");
@@ -2649,6 +2656,21 @@
" %8.8jx\n %16.16jx %16.16jx "
"%3s %2u %3u %ju\n", S_CT);
}
+ if (re->options & RE_Z) {
+ if (gelf_getchdr(s, &chdr) != NULL) {
+ if (chdr.ch_type == ELFCOMPRESS_ZLIB)
+ printf(" [ELF ZLIB (1) %8.8jx %lu]\n",
+ (unsigned int) chdr.ch_size,
+ (unsigned long) chdr.ch_addralign);
+ else
+ printf(" [Unknown: %x %8.8jx %lu]\n",
+ chdr.ch_type,
+ chdr.ch_size,
+ (unsigned long) chdr.ch_addralign);
+ } else {
+ printf(" [Bad compressed section header.]\n")
+ }
+ }
}
if ((re->options & RE_T) == 0)
printf("Key to Flags:\n W (write), A (alloc),"
@@ -7698,6 +7720,12 @@
add_dumpop(re, 0, optarg, HEX_DUMP,
DUMP_BY_NAME);
break;
+ case 'z':
+ /* section content decompression is not implemented yet
+ * only displays compressed header for sections for now
+ */
+ re->options |= RE_Z;
+ break;
case OPTION_DEBUG_DUMP:
re->options |= RE_W;
parse_dwarf_op_long(re, optarg);

File Metadata

Mime Type
text/plain
Expires
Wed, Mar 11, 10:52 PM (16 h, 37 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29554467
Default Alt Text
D24566.id70969.diff (12 KB)

Event Timeline