[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v5 12/18] dump/dump: Add section string table support
From: |
Janosch Frank |
Subject: |
[PATCH v5 12/18] dump/dump: Add section string table support |
Date: |
Thu, 11 Aug 2022 12:11:05 +0000 |
As sections don't have a type like the notes do we need another way to
determine their contents. The string table allows us to assign each
section an identification string which architectures can then use to
tag their sections with.
There will be no string table if the architecture doesn't add custom
sections which are introduced in a following patch.
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
---
dump/dump.c | 71 +++++++++++++++++++++++++++++++++++++++++++
include/sysemu/dump.h | 4 +++
2 files changed, 75 insertions(+)
diff --git a/dump/dump.c b/dump/dump.c
index 31eb20108c..0d6dbf453a 100644
--- a/dump/dump.c
+++ b/dump/dump.c
@@ -103,6 +103,7 @@ static int dump_cleanup(DumpState *s)
memory_mapping_list_free(&s->list);
close(s->fd);
g_free(s->guest_note);
+ g_array_unref(s->string_table_buf);
s->guest_note = NULL;
if (s->resume) {
if (s->detached) {
@@ -156,6 +157,9 @@ static void prepare_elf64_header(DumpState *s, Elf64_Ehdr
*elf_header)
elf_header->e_shoff = cpu_to_dump64(s, s->shdr_offset);
elf_header->e_shentsize = cpu_to_dump16(s, sizeof(Elf64_Shdr));
elf_header->e_shnum = cpu_to_dump16(s, s->shdr_num);
+ if (s->string_table_usage) {
+ elf_header->e_shstrndx = cpu_to_dump16(s, s->shdr_num - 1);
+ }
}
}
@@ -184,6 +188,9 @@ static void prepare_elf32_header(DumpState *s, Elf32_Ehdr
*elf_header)
elf_header->e_shoff = cpu_to_dump32(s, s->shdr_offset);
elf_header->e_shentsize = cpu_to_dump16(s, sizeof(Elf32_Shdr));
elf_header->e_shnum = cpu_to_dump16(s, s->shdr_num);
+ if (s->string_table_usage) {
+ elf_header->e_shstrndx = cpu_to_dump16(s, s->shdr_num - 1);
+ }
}
}
@@ -393,17 +400,50 @@ static void prepare_elf_section_hdr_zero(DumpState *s)
}
}
+static void prepare_elf_section_hdr_string(DumpState *s, void *buff)
+{
+ Elf32_Shdr shdr32;
+ Elf64_Shdr shdr64;
+ int shdr_size;
+ void *shdr;
+
+ if (dump_is_64bit(s)) {
+ shdr_size = sizeof(Elf64_Shdr);
+ memset(&shdr64, 0, shdr_size);
+ shdr64.sh_type = SHT_STRTAB;
+ shdr64.sh_offset = s->section_offset + s->elf_section_data_size;
+ shdr64.sh_name = s->string_table_buf->len;
+ g_array_append_vals(s->string_table_buf, ".strtab", sizeof(".strtab"));
+ shdr64.sh_size = s->string_table_buf->len;
+ shdr = &shdr64;
+ } else {
+ shdr_size = sizeof(Elf32_Shdr);
+ memset(&shdr32, 0, shdr_size);
+ shdr32.sh_type = SHT_STRTAB;
+ shdr32.sh_offset = s->section_offset + s->elf_section_data_size;
+ shdr32.sh_name = s->string_table_buf->len;
+ g_array_append_vals(s->string_table_buf, ".strtab", sizeof(".strtab"));
+ shdr32.sh_size = s->string_table_buf->len;
+ shdr = &shdr32;
+ }
+
+ memcpy(buff, shdr, shdr_size);
+}
+
static void prepare_elf_section_hdrs(DumpState *s)
{
size_t len, sizeof_shdr;
+ void *buff_hdr;
/*
* Section ordering:
* - HDR zero
+ * - String table hdr
*/
sizeof_shdr = dump_is_64bit(s) ? sizeof(Elf64_Shdr) : sizeof(Elf32_Shdr);
len = sizeof_shdr * s->shdr_num;
s->elf_section_hdrs = g_malloc0(len);
+ buff_hdr = s->elf_section_hdrs;
/*
* The first section header is ALWAYS a special initial section
@@ -419,6 +459,17 @@ static void prepare_elf_section_hdrs(DumpState *s)
if (s->phdr_num >= PN_XNUM) {
prepare_elf_section_hdr_zero(s);
}
+ buff_hdr += sizeof_shdr;
+
+ if (s->shdr_num < 2) {
+ return;
+ }
+
+ /*
+ * String table is the last section since strings are added via
+ * arch_sections_write_hdr().
+ */
+ prepare_elf_section_hdr_string(s, buff_hdr);
}
static void write_elf_section_headers(DumpState *s, Error **errp)
@@ -1688,6 +1739,14 @@ static void dump_init(DumpState *s, int fd, bool
has_format,
s->filter_area_begin = begin;
s->filter_area_length = length;
+ /* First index is 0, it's the special null name */
+ s->string_table_buf = g_array_new(FALSE, TRUE, 1);
+ /*
+ * Allocate the null name, due to the clearing option set to true
+ * it will be 0.
+ */
+ g_array_set_size(s->string_table_buf, 1);
+
memory_mapping_list_init(&s->list);
guest_phys_blocks_init(&s->guest_phys_blocks);
@@ -1844,6 +1903,18 @@ static void dump_init(DumpState *s, int fd, bool
has_format,
}
}
+ /*
+ * calculate shdr_num and elf_section_data_size so we know the offsets and
+ * sizes of all parts.
+ *
+ * If phdr_num overflowed we have at least one section header
+ * More sections/hdrs can be added by the architectures
+ */
+ if (s->shdr_num > 1) {
+ /* Reserve the string table */
+ s->shdr_num += 1;
+ }
+
if (dump_is_64bit(s)) {
s->shdr_offset = sizeof(Elf64_Ehdr);
s->phdr_offset = s->shdr_offset + sizeof(Elf64_Shdr) * s->shdr_num;
diff --git a/include/sysemu/dump.h b/include/sysemu/dump.h
index 9ed811b313..358b038d47 100644
--- a/include/sysemu/dump.h
+++ b/include/sysemu/dump.h
@@ -180,6 +180,10 @@ typedef struct DumpState {
hwaddr note_offset;
void *elf_section_hdrs; /* Pointer to section header buffer */
+ void *elf_section_data; /* Pointer to section data buffer */
+ uint64_t elf_section_data_size; /* Size of section data */
+ GArray *string_table_buf; /* String table data buffer */
+ bool string_table_usage; /* Indicates if string table is used */
uint8_t *note_buf; /* buffer for notes */
size_t note_buf_offset; /* the writing place in note_buf */
--
2.34.1
- [PATCH v5 18/18] s390x: pv: Add dump support, (continued)
- [PATCH v5 18/18] s390x: pv: Add dump support, Janosch Frank, 2022/08/11
- [PATCH v5 02/18] dump: Rename write_elf_loads to write_elf_phdr_loads, Janosch Frank, 2022/08/11
- [PATCH v5 07/18] dump: Split elf header functions into prepare and write, Janosch Frank, 2022/08/11
- [PATCH v5 06/18] dump: Rework dump_calculate_size function, Janosch Frank, 2022/08/11
- [PATCH v5 04/18] dump: Rework get_start_block, Janosch Frank, 2022/08/11
- [PATCH v5 12/18] dump/dump: Add section string table support,
Janosch Frank <=
- [PATCH v5 11/18] dump: Swap segment and section header locations, Janosch Frank, 2022/08/11
- [PATCH v5 08/18] dump: Rename write_elf*_phdr_note to prepare_elf*_phdr_note, Janosch Frank, 2022/08/11
- [PATCH v5 01/18] dump: Replace opaque DumpState pointer with a typed one, Janosch Frank, 2022/08/11
- [PATCH v5 13/18] dump/dump: Add arch section support, Janosch Frank, 2022/08/11