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