Here is a patch (a bit more clean than just commenting out the check)
that will allow ht to work on ELF files without sections.


Regards,
Celelibi
diff -Naur ht-2.0.18.orig/htelf.cc ht-2.0.18/htelf.cc
--- ht-2.0.18.orig/htelf.cc	2009-04-18 00:39:58.000000000 +0200
+++ ht-2.0.18/htelf.cc	2010-10-03 00:53:00.000000000 +0200
@@ -152,13 +152,17 @@
 
 		/* read section headers */
 		elf_shared->sheaders.count = elf_shared->header32.e_shnum;
-		if (!elf_shared->sheaders.count) throw MsgException("Zero count for section headers");
-		elf_shared->sheaders.sheaders32 = ht_malloc(elf_shared->sheaders.count*sizeof *elf_shared->sheaders.sheaders32);
-		file->seek(header_ofs+elf_shared->header32.e_shoff);
-		file->readx(elf_shared->sheaders.sheaders32, elf_shared->sheaders.count*sizeof *elf_shared->sheaders.sheaders32);
-		for (uint i=0; i < elf_shared->sheaders.count; i++) {
-			ELF_SECTION_HEADER32 a = elf_shared->sheaders.sheaders32[i];
-			createHostStruct(elf_shared->sheaders.sheaders32+i, ELF_SECTION_HEADER32_struct, elf_shared->byte_order);
+//		if (!elf_shared->sheaders.count) throw MsgException("Zero count for section headers");
+		if (!elf_shared->sheaders.count) {
+			elf_shared->sheaders.sheaders32 = NULL;
+		} else {
+			elf_shared->sheaders.sheaders32 = ht_malloc(elf_shared->sheaders.count*sizeof *elf_shared->sheaders.sheaders32);
+			file->seek(header_ofs+elf_shared->header32.e_shoff);
+			file->readx(elf_shared->sheaders.sheaders32, elf_shared->sheaders.count*sizeof *elf_shared->sheaders.sheaders32);
+			for (uint i=0; i < elf_shared->sheaders.count; i++) {
+				ELF_SECTION_HEADER32 a = elf_shared->sheaders.sheaders32[i];
+				createHostStruct(elf_shared->sheaders.sheaders32+i, ELF_SECTION_HEADER32_struct, elf_shared->byte_order);
+			}
 		}
 
 		/* read program headers */
@@ -198,13 +202,17 @@
 
 		/* read section headers */
 		elf_shared->sheaders.count=elf_shared->header64.e_shnum;
-		if (!elf_shared->sheaders.count) throw MsgException("Zero count for section headers");
-		elf_shared->sheaders.sheaders64 = ht_malloc(elf_shared->sheaders.count*sizeof *elf_shared->sheaders.sheaders64);
-		file->seek(header_ofs+elf_shared->header64.e_shoff);
-		file->readx(elf_shared->sheaders.sheaders64, elf_shared->sheaders.count*sizeof *elf_shared->sheaders.sheaders64);
-		for (uint i=0; i<elf_shared->sheaders.count; i++) {
-			ELF_SECTION_HEADER64 a = elf_shared->sheaders.sheaders64[i];
-			createHostStruct(elf_shared->sheaders.sheaders64+i, ELF_SECTION_HEADER64_struct, elf_shared->byte_order);
+//		if (!elf_shared->sheaders.count) throw MsgException("Zero count for section headers");
+		if (!elf_shared->sheaders.count) {
+			elf_shared->sheaders.sheaders64 = NULL;
+		} else {
+			elf_shared->sheaders.sheaders64 = ht_malloc(elf_shared->sheaders.count*sizeof *elf_shared->sheaders.sheaders64);
+			file->seek(header_ofs+elf_shared->header64.e_shoff);
+			file->readx(elf_shared->sheaders.sheaders64, elf_shared->sheaders.count*sizeof *elf_shared->sheaders.sheaders64);
+			for (uint i=0; i<elf_shared->sheaders.count; i++) {
+				ELF_SECTION_HEADER64 a = elf_shared->sheaders.sheaders64[i];
+				createHostStruct(elf_shared->sheaders.sheaders64+i, ELF_SECTION_HEADER64_struct, elf_shared->byte_order);
+			}
 		}
 
 		/* read program headers */
diff -Naur ht-2.0.18.orig/htelfshs.cc ht-2.0.18/htelfshs.cc
--- ht-2.0.18.orig/htelfshs.cc	2009-04-18 00:39:58.000000000 +0200
+++ ht-2.0.18/htelfshs.cc	2010-10-03 01:01:58.000000000 +0200
@@ -98,6 +98,10 @@
 	ht_uformat_viewer *v = NULL;
 	bool elf_bigendian = elf_shared->ident.e_ident[ELF_EI_DATA]==ELFDATA2MSB;
 	if (elf_shared->ident.e_ident[ELF_EI_CLASS] == ELFCLASS32) {
+		// Nothing to do if no section header
+		if (!elf_shared->sheaders.count)
+			return NULL;
+
 		v = new ht_uformat_viewer();
 		v->init(b, DESC_ELF_SECTION_HEADERS, VC_EDIT, file, group);
 
@@ -144,6 +148,10 @@
 			v->insertsub(cn);
 		}
 	} else if (elf_shared->ident.e_ident[ELF_EI_CLASS]==ELFCLASS64) {
+		// Nothing to do if no section header
+		if (!elf_shared->sheaders.count)
+			return NULL;
+
 		v = new ht_uformat_viewer();
 		v->init(b, DESC_ELF_SECTION_HEADERS, VC_EDIT, file, group);
 

Reply via email to