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);