Here is a patch that allow the elf/image view on an ELF file without section.

Celelibi
diff -Naur ht-2.0.18.orig/analyser/elf_analy.cc ht-2.0.18/analyser/elf_analy.cc
--- ht-2.0.18.orig/analyser/elf_analy.cc	2007-04-30 12:32:40.000000000 +0200
+++ ht-2.0.18/analyser/elf_analy.cc	2010-10-30 21:05:25.000000000 +0200
@@ -239,18 +239,6 @@
 			char *name = file->fgetstrz();
 			if (!name) continue;
 
-			switch (sym.st_shndx) {
-			case ELF_SHN_UNDEF:
-				break;
-			case ELF_SHN_ABS:
-				break;
-			case ELF_SHN_COMMON:
-				break;
-			default:
-				// sym.st_shndx
-				break;
-			}
-
 			const char *bind;
 			switch (ELF32_ST_BIND(sym.st_info)) {
 			case ELF_STB_LOCAL:
@@ -343,19 +331,6 @@
 			char *name = file->fgetstrz();
 			if (!name) continue;
 
-			switch (sym.st_shndx) {
-			case ELF_SHN_UNDEF:
-				break;
-			case ELF_SHN_ABS:
-				break;
-			case ELF_SHN_COMMON:
-				break;
-			default: {
-				// sym.st_shndx
-				break;
-			}
-			}
-
 			const char *bind;
 			switch (ELF64_ST_BIND(sym.st_info)) {
 			case ELF_STB_LOCAL:
@@ -550,7 +525,7 @@
 		FileOfs ofs;
 		ELFAddress ea;
 		if (!convertAddressToELFAddress(Addr, &ea)) return INVALID_FILE_OFS;
-		if (!elf_addr_to_ofs(&elf_shared->sheaders, elf_shared->ident.e_ident[ELF_EI_CLASS], ea, &ofs)) return INVALID_FILE_OFS;
+		if (!elf_addr_to_ofs(&elf_shared->sheaders, &elf_shared->pheaders, elf_shared->ident.e_ident[ELF_EI_CLASS], ea, &ofs)) return INVALID_FILE_OFS;
 		return ofs;
 	} else {
 		return INVALID_FILE_OFS;
@@ -722,47 +697,92 @@
  */
 bool ElfAnalyser::validAddress(Address *Addr, tsectype action)
 {
-	elf_section_headers *sections=&elf_shared->sheaders;
-	int sec;
+	elf_section_headers *sections = &elf_shared->sheaders;
+	elf_program_headers *segments = &elf_shared->pheaders;
+	int seg, sec;
 	byte cls = elf_shared->ident.e_ident[ELF_EI_CLASS];
 	ELFAddress ea;
 	if (!convertAddressToELFAddress(Addr, &ea)) return false;
-	if (!elf_addr_to_section(sections, cls, ea, &sec)) return false;
-	switch (cls) {
-	case ELFCLASS32: {
-		ELF_SECTION_HEADER32 *s = sections->sheaders32 + sec;
-		switch (action) {
-		case scvalid:
-			return true;
-		case scread:
-			return true;
-		case scwrite:
-		case screadwrite:
-			return s->sh_flags & ELF_SHF_WRITE;
-		case sccode:
-			return (s->sh_flags & ELF_SHF_EXECINSTR) && (s->sh_type == ELF_SHT_PROGBITS);
-		case scinitialized:
-			return s->sh_type==ELF_SHT_PROGBITS;
+
+	// Try to check address validity with respect to sections if they exists
+	// Otherwise, check with respect to segments
+	if (elf_addr_to_section(sections, cls, ea, &sec)) {
+		// FIXME Segment rights should be taken into account
+		switch (cls) {
+		case ELFCLASS32: {
+			ELF_SECTION_HEADER32 *s = sections->sheaders32 + sec;
+			switch (action) {
+			case scvalid:
+				return true;
+			case scread:
+				return true;
+			case scwrite:
+			case screadwrite:
+				return s->sh_flags & ELF_SHF_WRITE;
+			case sccode:
+				return (s->sh_flags & ELF_SHF_EXECINSTR) && (s->sh_type == ELF_SHT_PROGBITS);
+			case scinitialized:
+				return s->sh_type != ELF_SHT_NOBITS;
+			}
+			return false;
+		}
+		case ELFCLASS64: {
+			ELF_SECTION_HEADER64 *s = sections->sheaders64 + sec;
+			switch (action) {
+			case scvalid:
+				return true;
+			case scread:
+				return true;
+			case scwrite:
+			case screadwrite:
+				return s->sh_flags & ELF_SHF_WRITE;
+			case sccode:
+				return (s->sh_flags & ELF_SHF_EXECINSTR) && (s->sh_type == ELF_SHT_PROGBITS);
+			case scinitialized:
+				return s->sh_type != ELF_SHT_NOBITS;
+			}
+			return false;
+		}
+		}
+	} else if (elf_addr_to_segment(segments, cls, ea, &seg)) {
+		switch (cls) {
+		case ELFCLASS32: {
+			ELF_PROGRAM_HEADER32 *p = segments->pheaders32 + seg;
+			switch (action) {
+			case scvalid:
+				return true;
+			case scread:
+				return p->p_flags & ELF_PF_R;
+			case scwrite:
+				return p->p_flags & ELF_PF_W;
+			case screadwrite:
+				return (p->p_flags & ELF_PF_R) && (p->p_flags & ELF_PF_W);
+			case sccode:
+				return (p->p_flags & ELF_PF_X) && (ea.a32 < (p->p_vaddr + p->p_filesz));
+			case scinitialized:
+				return ea.a32 < (p->p_vaddr + p->p_filesz);
+			}
+			return false;
+		}
+		case ELFCLASS64: {
+			ELF_PROGRAM_HEADER64 *p = segments->pheaders64 + seg;
+			switch (action) {
+			case scvalid:
+				return true;
+			case scread:
+				return p->p_flags & ELF_PF_R;
+			case scwrite:
+				return p->p_flags & ELF_PF_W;
+			case screadwrite:
+				return (p->p_flags & ELF_PF_R) && (p->p_flags & ELF_PF_W);
+			case sccode:
+				return (p->p_flags & ELF_PF_X) && (ea.a64 < (p->p_vaddr + p->p_filesz));
+			case scinitialized:
+				return ea.a64 < (p->p_vaddr + p->p_filesz);
+			}
+			return false;
 		}
-		return false;
-	}
-	case ELFCLASS64: {
-		ELF_SECTION_HEADER64 *s = sections->sheaders64 + sec;
-		switch (action) {
-		case scvalid:
-			return true;
-		case scread:
-			return true;
-		case scwrite:
-		case screadwrite:
-			return s->sh_flags & ELF_SHF_WRITE;
-		case sccode:
-			return (s->sh_flags & ELF_SHF_EXECINSTR) && (s->sh_type == ELF_SHT_PROGBITS);
-		case scinitialized:
-			return s->sh_type==ELF_SHT_PROGBITS;
 		}
-		return false;
-	}
 	}
 	return false;
 }
diff -Naur ht-2.0.18.orig/elfstruc.h ht-2.0.18/elfstruc.h
--- ht-2.0.18.orig/elfstruc.h	2008-10-08 18:02:24.000000000 +0200
+++ ht-2.0.18/elfstruc.h	2010-10-04 06:12:19.000000000 +0200
@@ -362,7 +362,11 @@
 #define ELF_PT_GNU_EH_FRAME	0x6474e550 /* GCC .eh_frame_hdr segment     */
 #define ELF_PT_GNU_STACK	0x6474e551 /* Indicates stack executability */
 #define ELF_PT_GNU_RELRO	0x6474e552 /* Read-only after relocation    */ 
-#define ELF_PT_PAX_FLAGS	0x65041580 /* Indicates PaX flag markings */
+#define ELF_PT_PAX_FLAGS	0x65041580 /* Indicates PaX flag markings   */
+
+#define ELF_PF_X	1
+#define ELF_PF_W	2
+#define ELF_PF_R	4
 
 struct ELF_PROGRAM_HEADER32 {
 	elf32_word p_type;
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-30 20:17:01.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 */
@@ -495,7 +503,25 @@
 	}
 	case ELFCLASS64: {
 		ELF_SECTION_HEADER64 *s = &sh->sheaders64;
-		return s->sh_type==ELF_SHT_PROGBITS && s->sh_addr;
+		return s->sh_type == ELF_SHT_PROGBITS && s->sh_addr;
+	}
+	}
+	return false;
+}
+
+/*
+ *	Tell whether the section will probably be loaded in memory
+ */
+bool elf_in_mem_section(elf_section_header *sh, uint elfclass)
+{
+	switch (elfclass) {
+	case ELFCLASS32: {
+		ELF_SECTION_HEADER32 *s = &sh->sheaders32;
+		return (s->sh_type == ELF_SHT_PROGBITS || s->sh_type == ELF_SHT_NOBITS) && s->sh_addr;
+	}
+	case ELFCLASS64: {
+		ELF_SECTION_HEADER64 *s = &sh->sheaders64;
+		return (s->sh_type == ELF_SHT_PROGBITS || s->sh_type == ELF_SHT_NOBITS) && s->sh_addr;
 	}
 	}
 	return false;
@@ -506,39 +532,86 @@
 	switch (elfclass) {
 	case ELFCLASS32: {
 		ELF_SECTION_HEADER32 *s = &sh->sheaders32;
-		return (s->sh_type==ELF_SHT_PROGBITS || s->sh_type==ELF_SHT_NOBITS) && s->sh_addr;
+		return (s->sh_type != ELF_SHT_NULL) && s->sh_addr;
 	}
 	case ELFCLASS64: {
 		ELF_SECTION_HEADER64 *s = &sh->sheaders64;
-		return (s->sh_type==ELF_SHT_PROGBITS || s->sh_type==ELF_SHT_NOBITS) && s->sh_addr;
+		return (s->sh_type != ELF_SHT_NULL) && s->sh_addr;
 	}
 	}
 	return false;
 }
 
-bool elf_addr_to_ofs(elf_section_headers *section_headers, uint elfclass, ELFAddress addr, FileOfs *ofs)
+bool elf_addr_to_ofs(elf_section_headers *section_headers, elf_program_headers *segment_headers, uint elfclass, ELFAddress addr, FileOfs *ofs)
 {
 	switch (elfclass) {
 		case ELFCLASS32: {
 			ELF_SECTION_HEADER32 *s = section_headers->sheaders32;
-			for (uint i=0; i < section_headers->count; i++) {
-				if ((elf_phys_and_mem_section((elf_section_header*)s, elfclass)) && (addr.a32 >= s->sh_addr) && (addr.a32 < s->sh_addr+s->sh_size)) {
+			for (uint i = 0; i < section_headers->count; i++) {
+				if (elf_phys_and_mem_section((elf_section_header*)s, elfclass) && (addr.a32 >= s->sh_addr) && (addr.a32 < s->sh_addr+s->sh_size)) {
 					*ofs = addr.a32 - s->sh_addr + s->sh_offset;
 					return true;
 				}
 				s++;
 			}
+			// Not in section ? Falling back to segments
+			ELF_PROGRAM_HEADER32 *p = segment_headers->pheaders32;
+			for (uint i = 0; i < segment_headers->count; i++) {
+				if (p->p_type = ELF_PT_LOAD && (addr.a32 >= p->p_vaddr) && (addr.a32 < p->p_vaddr + p->p_memsz) && (addr.a32 < p->p_vaddr + p->p_filesz)) {
+					*ofs = addr.a32 - p->p_vaddr + p->p_offset;
+					return true;
+				}
+				p++;
+			}
 			break;
 		}
 		case ELFCLASS64: {
 			ELF_SECTION_HEADER64 *s = section_headers->sheaders64;
 			for (uint i=0; i < section_headers->count; i++) {
-				if ((elf_phys_and_mem_section((elf_section_header*)s, elfclass)) && addr.a64 >= s->sh_addr && (addr.a64 < s->sh_addr + s->sh_size)) {
+				if (elf_phys_and_mem_section((elf_section_header*)s, elfclass) && addr.a64 >= s->sh_addr && (addr.a64 < s->sh_addr + s->sh_size)) {
 					*ofs = addr.a64 - s->sh_addr + s->sh_offset;
 					return true;
 				}
 				s++;
 			}
+			// Not in section ? Falling back to segments
+			ELF_PROGRAM_HEADER64 *p = segment_headers->pheaders64;
+			for (uint i = 0; i < segment_headers->count; i++) {
+				if (p->p_type = ELF_PT_LOAD && (addr.a64 >= p->p_vaddr) && (addr.a64 < p->p_vaddr + p->p_memsz) && (addr.a64 < p->p_vaddr + p->p_filesz)) {
+					*ofs = addr.a64 - p->p_vaddr + p->p_offset;
+					return true;
+				}
+				p++;
+			}
+			break;
+		}
+	}
+	return false;
+}
+
+bool elf_addr_to_segment(elf_program_headers *segment_headers, uint elfclass, ELFAddress addr, int *segment)
+{
+	switch (elfclass) {
+		case ELFCLASS32: {
+			ELF_PROGRAM_HEADER32 *p = segment_headers->pheaders32;
+			for (uint i = 0; i < segment_headers->count; i++) {
+				if (p->p_type = ELF_PT_LOAD && (addr.a32 >= p->p_vaddr) && (addr.a32 < p->p_vaddr + p->p_memsz)) {
+					*segment = i;
+					return true;
+				}
+				p++;
+			}
+			break;
+		}
+		case ELFCLASS64: {
+			ELF_PROGRAM_HEADER64 *p = segment_headers->pheaders64;
+			for (uint i = 0; i < segment_headers->count; i++) {
+				if (p->p_type = ELF_PT_LOAD && (addr.a64 >= p->p_vaddr) && (addr.a64 < p->p_vaddr + p->p_memsz)) {
+					*segment = i;
+					return true;
+				}
+				p++;
+			}
 			break;
 		}
 	}
@@ -551,7 +624,7 @@
 		case ELFCLASS32: {
 			ELF_SECTION_HEADER32 *s = section_headers->sheaders32;
 			for (uint i = 0; i < section_headers->count; i++) {
-				if ((elf_valid_section((elf_section_header*)s, elfclass)) && (addr.a32 >= s->sh_addr) && (addr.a32 < s->sh_addr + s->sh_size)) {
+				if (elf_valid_section((elf_section_header*)s, elfclass) && (addr.a32 >= s->sh_addr) && (addr.a32 < s->sh_addr + s->sh_size)) {
 					*section = i;
 					return true;
 				}
@@ -562,7 +635,7 @@
 		case ELFCLASS64: {
 			ELF_SECTION_HEADER64 *s = section_headers->sheaders64;
 			for (uint i = 0; i < section_headers->count; i++) {
-				if ((elf_valid_section((elf_section_header*)s, elfclass)) && addr.a64 >= s->sh_addr && (addr.a64 < s->sh_addr + s->sh_size)) {
+				if (elf_valid_section((elf_section_header*)s, elfclass) && addr.a64 >= s->sh_addr && (addr.a64 < s->sh_addr + s->sh_size)) {
 					*section = i;
 					return true;
 				}
diff -Naur ht-2.0.18.orig/htelf.h ht-2.0.18/htelf.h
--- ht-2.0.18.orig/htelf.h	2007-04-30 12:23:10.000000000 +0200
+++ ht-2.0.18/htelf.h	2010-10-30 18:40:03.000000000 +0200
@@ -178,16 +178,18 @@
 	virtual void	reloc_apply(Object *reloc, byte *data);
 	virtual bool	reloc_unapply(Object *reloc, byte *data);
 public:
-		   	ht_elf32_reloc_file(File *File, bool own_streamfile, ht_elf_shared_data *data);
+			ht_elf32_reloc_file(File *File, bool own_streamfile, ht_elf_shared_data *data);
 };
 
 bool isValidELFSectionIdx(ht_elf_shared_data *elf_shared, int idx);
 
 bool elf_phys_and_mem_section(elf_section_header *s, uint elfclass);
+bool elf_in_mem_section(elf_section_header *s, uint elfclass);
 bool elf_valid_section(elf_section_header *s, uint elfclass);
 
+bool elf_addr_to_segment(elf_program_headers *segment_headers, uint elfclass, ELFAddress addr, int *segment);
 bool elf_addr_to_section(elf_section_headers *section_headers, uint elfclass, ELFAddress addr, int *section);
-bool elf_addr_to_ofs(elf_section_headers *section_headers, uint elfclass, ELFAddress addr, FileOfs *ofs);
+bool elf_addr_to_ofs(elf_section_headers *section_headers, elf_program_headers *segment_headers, uint elfclass, ELFAddress addr, FileOfs *ofs);
 bool elf_addr_is_valid(elf_section_headers *section_headers, uint elfclass, ELFAddress addr);
 
 bool elf_ofs_to_addr(elf_section_headers *section_headers, uint elfclass, FileOfs ofs, ELFAddress *addr);
diff -Naur ht-2.0.18.orig/htelfimg.cc ht-2.0.18/htelfimg.cc
--- ht-2.0.18.orig/htelfimg.cc	2009-08-27 16:30:57.000000000 +0200
+++ ht-2.0.18/htelfimg.cc	2010-10-30 18:44:50.000000000 +0200
@@ -64,13 +64,26 @@
 		ELFAddress l, h;
 		l.a32 = (uint32)-1;
 		h.a32 = 0;
-		ELF_SECTION_HEADER32 *s = elf_shared->sheaders.sheaders32;
-		for (uint i=0; i<elf_shared->sheaders.count; i++) {
-			if (elf_valid_section((elf_section_header*)s, elf_shared->ident.e_ident[ELF_EI_CLASS])) {
-				if (s->sh_addr < l.a32) l.a32=s->sh_addr;
-				if ((s->sh_addr + s->sh_size > h.a32) && s->sh_size) h.a32=s->sh_addr + s->sh_size - 1;
+		// Use program headers first since we represent in-memory state.
+		// But fallback on sections if no program header.
+		if (elf_shared->pheaders.count) {
+			ELF_PROGRAM_HEADER32 *p = elf_shared->pheaders.pheaders32;
+			for (uint i = 0; i < elf_shared->pheaders.count; i++) {
+				if (p->p_type == ELF_PT_LOAD && p->p_memsz != 0) {
+					if (p->p_vaddr < l.a32) l.a32 = p->p_vaddr;
+					if (p->p_vaddr + p->p_memsz > h.a32) h.a32 = p->p_vaddr + p->p_memsz - 1;
+				}
+				p++;
+			}
+		} else if (elf_shared->sheaders.count) {
+			ELF_SECTION_HEADER32 *s = elf_shared->sheaders.sheaders32;
+			for (uint i = 0; i < elf_shared->sheaders.count; i++) {
+				if (elf_in_mem_section((elf_section_header*)s, elf_shared->ident.e_ident[ELF_EI_CLASS])) {
+					if (s->sh_addr < l.a32) l.a32 = s->sh_addr;
+					if ((s->sh_addr + s->sh_size > h.a32) && s->sh_size) h.a32 = s->sh_addr + s->sh_size - 1;
+				}
+				s++;
 			}
-			s++;
 		}
 		low = p->createAddress32(l.a32);
 		high = p->createAddress32(h.a32);
@@ -80,16 +93,29 @@
 		ELFAddress l, h;
 		l.a64 = (uint64)-1;
 		h.a64 = 0;
-		ELF_SECTION_HEADER64 *s = elf_shared->sheaders.sheaders64;
-		for (uint i=0; i<elf_shared->sheaders.count; i++) {
-			if (elf_valid_section((elf_section_header*)s, elf_shared->ident.e_ident[ELF_EI_CLASS])) {
-				if (s->sh_addr < l.a64) l.a64 = s->sh_addr;
-				if ((s->sh_addr + s->sh_size > h.a64)
-				&& s->sh_size != 0) {
-					h.a64 = s->sh_addr + s->sh_size - 1;
+		// Use program headers first since we represent in-memory state.
+		// But fallback on sections if no program header.
+		if (elf_shared->pheaders.count) {
+			ELF_PROGRAM_HEADER64 *p = elf_shared->pheaders.pheaders64;
+			for (uint i = 0; i < elf_shared->pheaders.count; i++) {
+				if (p->p_type == ELF_PT_LOAD && p->p_memsz != 0) {
+					if (p->p_vaddr < l.a64) l.a64 = p->p_vaddr;
+					if (p->p_vaddr + p->p_memsz > h.a64) h.a64 = p->p_vaddr + p->p_memsz - 1;
 				}
+				p++;
+			}
+		} else if (elf_shared->sheaders.count) {
+			ELF_SECTION_HEADER64 *s = elf_shared->sheaders.sheaders64;
+			for (uint i=0; i<elf_shared->sheaders.count; i++) {
+				if (elf_valid_section((elf_section_header*)s, elf_shared->ident.e_ident[ELF_EI_CLASS])) {
+					if (s->sh_addr < l.a64) l.a64 = s->sh_addr;
+					if ((s->sh_addr + s->sh_size > h.a64)
+					    && s->sh_size != 0) {
+						h.a64 = s->sh_addr + s->sh_size - 1;
+					}
+				}
+				s++;
 			}
-			s++;
 		}
 		low = p->createAddress64(l.a64);
 		high = p->createAddress64(h.a64);
@@ -115,7 +141,7 @@
 		delete low;
 		return NULL;
 	}
-	
+
 	delete high;
 	delete low;
 
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);
 
diff -Naur ht-2.0.18.orig/htformat.cc ht-2.0.18/htformat.cc
--- ht-2.0.18.orig/htformat.cc	2009-04-07 01:35:39.000000000 +0200
+++ ht-2.0.18/htformat.cc	2010-10-03 22:27:07.000000000 +0200
@@ -322,7 +322,7 @@
 		init_if(*i);
 		i++;
 	}
-	ifs=i;
+	ifs=i; // Lol what ?
 }
 
 void ht_format_group::insert(ht_view *view)
diff -Naur ht-2.0.18.orig/tools.cc ht-2.0.18/tools.cc
--- ht-2.0.18.orig/tools.cc	2007-04-30 12:23:16.000000000 +0200
+++ ht-2.0.18/tools.cc	2010-10-03 02:39:54.000000000 +0200
@@ -49,18 +49,13 @@
 {
 	if (!max) return NULL;
 	int *table= ht_malloc(max * sizeof(int));
-	int i,j,k,l,m;
+	int i, j, k;
 	for (i=0; i<max; i++) table[i] = i;
 	for (i=0; i<max; i++) {
-		k=rand()%(max);
-		l=rand()%(max);
-		m=rand()%(max);
-		j=table[k];
-		table[k]=table[l];
-		table[l]=j;
-		j=table[i];
-		table[i]=table[m];
-		table[m]=j;
+		k = i + (rand() % (max - i));
+		j = table[i];
+		table[i] = table[k];
+		table[k] = j;
 	}
 	return table;
 }

Reply via email to