[Sound-open-firmware] [PATCH] rimage: display ELF section names.

Liam Girdwood liam.r.girdwood at linux.intel.com
Thu Apr 12 09:59:32 CEST 2018


Display the name of each ELF section to aid build and debug.

Signed-off-by: Liam Girdwood <liam.r.girdwood at linux.intel.com>
---
 rimage/elf.c    | 36 +++++++++++++++++++++++++++++++-----
 rimage/rimage.h |  1 +
 2 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/rimage/elf.c b/rimage/elf.c
index 78f6d57d..b1a1861b 100644
--- a/rimage/elf.c
+++ b/rimage/elf.c
@@ -51,6 +51,29 @@ static int elf_read_sections(struct image *image, struct module *module)
 		return -errno;
 	}
 
+	/* read in strings */
+	module->strings = calloc(1, section[hdr->e_shstrndx].sh_size);
+	if (!module->strings) {
+		fprintf(stderr, "error: failed %s to read ELF strings for %d\n",
+				module->elf_file, -errno);
+			return -errno;
+	}
+
+	ret = fseek(module->fd, section[hdr->e_shstrndx].sh_offset, SEEK_SET);
+	if (ret < 0) {
+		fprintf(stderr, "error: can't seek to %s stringss %d\n",
+			module->elf_file, ret);
+		return ret;
+	}
+
+	count = fread(module->strings, 1, section[hdr->e_shstrndx].sh_size,
+		      module->fd);
+	if (count != section[hdr->e_shstrndx].sh_size) {
+		fprintf(stderr, "error: failed to read %s strings %d\n",
+			module->elf_file, -errno);
+		return -errno;
+	}
+
 	/* find manifest module data */
 	man_section_idx = elf_find_section(image, module, ".bss");
 	if (man_section_idx < 0) {
@@ -233,7 +256,7 @@ static void elf_module_size(struct image *image, struct module *module,
 			if (module->text_end < section->sh_addr + section->sh_size)
 				module->text_end = section->sh_addr + section->sh_size;
 
-			fprintf(stdout, "\tTEXT\n");
+			fprintf(stdout, "\tTEXT\t");
 		} else {
 			/* initialized data, also calc the writable sections */
 			if (module->data_start > section->sh_addr)
@@ -241,7 +264,7 @@ static void elf_module_size(struct image *image, struct module *module,
 			if (module->data_end < section->sh_addr + section->sh_size)
 				module->data_end = section->sh_addr + section->sh_size;
 
-			fprintf(stdout, "\tDATA\n");
+			fprintf(stdout, "\tDATA\t");
 		}
 		break;
 	case SHT_NOBITS:
@@ -250,9 +273,9 @@ static void elf_module_size(struct image *image, struct module *module,
 			/* updated the .bss segment */
 			module->bss_start = section->sh_addr;
 			module->bss_end = section->sh_addr + section->sh_size;
-			fprintf(stdout, "\tBSS\n");
+			fprintf(stdout, "\tBSS\t");
 		} else {
-			fprintf(stdout, "\tHEAP\n");
+			fprintf(stdout, "\tHEAP\t");
 		}
 		break;
 	default:
@@ -272,7 +295,7 @@ static void elf_module_limits(struct image *image, struct module *module)
 	fprintf(stdout, "  Found %d sections, listing valid sections......\n",
 		module->hdr.e_shnum);
 
-	fprintf(stdout, "\tNo\tStart\t\tEnd\t\tBytes\tType\n");
+	fprintf(stdout, "\tNo\tStart\t\tEnd\t\tBytes\tType\tName\n");
 
 	/* iterate all sections and get size of segments */
 	for (i = 0; i < module->hdr.e_shnum; i++) {
@@ -296,6 +319,8 @@ static void elf_module_limits(struct image *image, struct module *module)
 		/* text or data section */
 		elf_module_size(image, module, section, i);
 
+		/* section name */
+		fprintf(stdout, "%s\n", module->strings + section->sh_name);
 	}
 
 	fprintf(stdout, "\n");
@@ -528,5 +553,6 @@ void elf_free_module(struct image *image, int module_index)
 
 	free(module->prg);
 	free(module->section);
+	free(module->strings);
 	fclose(module->fd);
 }
diff --git a/rimage/rimage.h b/rimage/rimage.h
index 654ba90f..8b46766d 100644
--- a/rimage/rimage.h
+++ b/rimage/rimage.h
@@ -53,6 +53,7 @@ struct module {
 	Elf32_Ehdr hdr;
 	Elf32_Shdr *section;
 	Elf32_Phdr *prg;
+	char *strings;
 
 	uint32_t text_start;
 	uint32_t text_end;
-- 
2.14.1



More information about the Sound-open-firmware mailing list