Index: EcnlProtoTool/trunk/ntshell/ntshell/usrcmd.h
===================================================================
--- EcnlProtoTool/trunk/ntshell/ntshell/usrcmd.h	(revision 445)
+++ EcnlProtoTool/trunk/ntshell/ntshell/usrcmd.h	(revision 446)
@@ -43,4 +43,10 @@
 } cmd_table_t;
 
+typedef struct
+{
+	const cmd_table_t *table;
+	int count;
+} cmd_table_info_t;
+
 int usrcmd_cd(int argc, char **argv);
 int usrcmd_ls(int argc, char **argv);
Index: EcnlProtoTool/trunk/ntshell/src/main.c
===================================================================
--- EcnlProtoTool/trunk/ntshell/src/main.c	(revision 445)
+++ EcnlProtoTool/trunk/ntshell/src/main.c	(revision 446)
@@ -125,4 +125,5 @@
 static const Elf32_Ehdr *load_elf(const uint8_t *file);
 static void execute_elf(const Elf32_Ehdr *, long *args);
+static void read_cmdlist_from_elf(const Elf32_Ehdr *Ehdr);
 static int usrcmd_ntopt_callback(long *args, void *extobj);
 #ifndef NTSHELL_NO_SOCKET
@@ -527,6 +528,8 @@
 	{"info", "This is a description text string for info command.", usrcmd_info},
 	{"exit", "Exit Natural Tiny Shell", usrcmd_exit},
+	{"help", "This is a description text string for help command.", usrcmd_help},
 };
-cmd_table_info_t cmd_table_info = { cmdlist, sizeof(cmdlist) / sizeof(cmdlist[0]) };
+const cmd_table_info_t cmd_table_info = { cmdlist, sizeof(cmdlist) / sizeof(cmdlist[0]) };
+cmd_table_info_t elf_cmd_table_info;
 
 static int usrcmd_ntopt_callback(long *args, void *extobj)
@@ -540,4 +543,5 @@
 
 	if (strcmp((const char *)args[1], "help") == 0) {
+		found = 1;
 		result = usrcmd_help(args[0], (char **)&args[1]);
 	}
@@ -567,10 +571,23 @@
 int usrcmd_help(int argc, char **argv)
 {
-	const cmd_table_t *p = cmd_table_info.table;
-	for (int i = 0; i < cmd_table_info.count; i++) {
-		printf(p->cmd);
-		printf("\t:");
-		puts(p->desc);
-		p++;
+	const cmd_table_t *p, *q;
+	const Elf32_Ehdr *elf = load_elf((const uint8_t *)0x18200000);
+	if (elf != NULL) {
+		read_cmdlist_from_elf(elf);
+	}
+	else {
+		elf_cmd_table_info.count = 0;
+	}
+	p = cmd_table_info.table;
+	for (int i = 0; i < cmd_table_info.count - 3; i++, p++) {
+		printf("%s\t:%s\n", p->cmd, p->desc);
+	}
+	p = elf_cmd_table_info.table;
+	for (int i = 0; i < elf_cmd_table_info.count; i++, p++) {
+		printf("%s\t:%s\n", p->cmd, p->desc);
+	}
+	p = &cmd_table_info.table[cmd_table_info.count - 3];
+	for (int i = cmd_table_info.count - 3; i < cmd_table_info.count; i++, p++) {
+		printf("%s\t:%s\n", p->cmd, p->desc);
 	}
 	return 0;
@@ -700,12 +717,4 @@
 			Shdr.sh_size -= Shdr.sh_addr;
 
-			char *name;
-			if (Shdr.sh_name > 0) {
-				name = (char *)&file[StringShdr.sh_offset + Shdr.sh_name];
-			}
-			else {
-				name = NULL;
-			}
-
 			if ((Shdr.sh_flags & SHF_ALLOC) == 0) {
 				// skip
@@ -730,2 +739,30 @@
 	((elf_entry_t)Ehdr->e_entry)(args);
 }
+
+void read_cmdlist_from_elf(const Elf32_Ehdr *Ehdr)
+{
+	const uint8_t *file = (const uint8_t *)Ehdr;
+	Elf32_Shdr StringShdr;
+	memcpy(&StringShdr, &file[Ehdr->e_shoff + (Ehdr->e_shstrndx * Ehdr->e_shentsize)], sizeof(StringShdr));
+
+	if (Ehdr->e_shoff > 0) {
+		Elf32_Shdr Shdr;
+		for (int i = 0; i < Ehdr->e_shnum; i++) {
+			memcpy(&Shdr, (Elf32_Shdr *)&file[Ehdr->e_shoff + (i * Ehdr->e_shentsize)], sizeof(Elf32_Shdr));
+			Shdr.sh_size -= Shdr.sh_addr;
+
+			char *name;
+			if (Shdr.sh_name > 0) {
+				name = (char *)&file[StringShdr.sh_offset + Shdr.sh_name];
+			}
+			else {
+				name = NULL;
+			}
+
+			if ((name != NULL) && (strcmp(name, ".cmdlist") == 0)) {
+				elf_cmd_table_info.table = (const cmd_table_t *)Shdr.sh_addr;
+				elf_cmd_table_info.count = Shdr.sh_size / sizeof(cmd_table_t);
+			}
+		}
+	}
+}
Index: EcnlProtoTool/trunk/ntshell/src/main.h
===================================================================
--- EcnlProtoTool/trunk/ntshell/src/main.h	(revision 445)
+++ EcnlProtoTool/trunk/ntshell/src/main.h	(revision 446)
@@ -83,11 +83,5 @@
 } task_base_t;
 
-typedef struct
-{
-	const cmd_table_t *table;
-	int count;
-} cmd_table_info_t;
-
-extern cmd_table_info_t cmd_table_info;
+extern const cmd_table_info_t cmd_table_info;
 
 /* ntshellの初期化 */
Index: EcnlProtoTool/trunk/prototool/.project
===================================================================
--- EcnlProtoTool/trunk/prototool/.project	(revision 445)
+++ EcnlProtoTool/trunk/prototool/.project	(revision 446)
@@ -10,9 +10,13 @@
 		<project>ntshell</project>
 		<project>onigmo-6.1.3</project>
-		<project>openssl-1.1.0e</project>
 		<project>tcc-0.9.27</project>
 		<project>zlib-1.2.11</project>
 	</projects>
 	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
 		<buildCommand>
 			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
@@ -32,4 +36,5 @@
 		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
 		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
 	</natures>
 </projectDescription>
Index: EcnlProtoTool/trunk/prototool/src/elf.c
===================================================================
--- EcnlProtoTool/trunk/prototool/src/elf.c	(revision 445)
+++ EcnlProtoTool/trunk/prototool/src/elf.c	(revision 446)
@@ -38,4 +38,30 @@
 #include <string.h>
 #include <elf.h>
+#include <ntshell/usrcmd.h>
+
+extern int mrbc_main(int argc, char **argv);
+extern int mrdb_main(int argc, char **argv);
+extern int mruby_main(int argc, char **argv);
+extern int mirb_main(int argc, char **argv);
+extern int curl_main(int argc, char **argv);
+extern int tcc_main(int argc, char **argv);
+extern int vi_main(int argc, char **argv);
+extern int openssl_main(int argc, char *argv[]);
+extern int onitest_main(int argc, char **argv);
+extern int tcp_echo_main(int argc, char **argv);
+
+static const cmd_table_t cmdlist[] = {
+	{"mrbc", "mruby compiler executable", mrbc_main},
+	{"mrdb","mruby debugger command", mrdb_main},
+	{"mruby","mruby command", mruby_main},
+	{"mirb", "Embeddable Interactive Ruby Shell", mirb_main},
+	{"curl", "Command lines or scripts to transfer data", curl_main},
+	{"tcc", "Tiny C compiler", tcc_main},
+	{"vi", "Text editor", vi_main},
+	{"openssl", "Cryptography and SSL/TLS Toolkit", openssl_main},
+	{"onitest", "Onigumo Test", onitest_main},
+	{"tcp_echo", "TCP echo server/client", tcp_echo_main},
+};
+const cmd_table_info_t cmd_table_info = { &cmdlist, sizeof(cmdlist) / sizeof(cmdlist[0]) };
 
 #define FVECT_SECT          __attribute__ ((section (".proginf")))
@@ -50,7 +76,7 @@
 	Elf32_Ehdr ehdr;
 	Elf32_Phdr phdr[3];
-	Elf32_Shdr shdr[4];
+	Elf32_Shdr shdr[5];
 	Elf32_Shdr str_shdr;
-	char shstrtab[sizeof("\0.text\0.rodata\0.data\0.bss\0.shstrtab")];
+	char shstrtab[sizeof("\0.text\0.rodata\0.data\0.bss\0.cmdlist\0.shstrtab")];
 } TProgInf;
 
@@ -152,8 +178,20 @@
 			.sh_addralign = (Elf32_Word)8,
 			.sh_entsize = (Elf32_Word)0,
+		},
+		{
+			.sh_name = (Elf32_Word)26,
+			.sh_type = (Elf32_Word)SHT_PROGBITS,
+			.sh_flags = (Elf32_Word)(SHF_ALLOC),
+			.sh_addr = (Elf32_Addr)&cmdlist,
+			.sh_offset = (Elf32_Off)&cmdlist/* - (Elf32_Off)&ProgInf*/,
+			.sh_size = (Elf32_Word)&cmdlist[sizeof(cmdlist) / sizeof(cmdlist[0])]/* - (Elf32_Off)&cmdlist*/,
+			.sh_link = (Elf32_Word)0,
+			.sh_info = (Elf32_Word)0,
+			.sh_addralign = (Elf32_Word)8,
+			.sh_entsize = (Elf32_Word)0,
 		}
 	},
 	{
-		.sh_name = (Elf32_Word)26,
+		.sh_name = (Elf32_Word)35,
 		.sh_type = (Elf32_Word)SHT_STRTAB,
 		.sh_flags = (Elf32_Word)0,
@@ -166,4 +204,4 @@
 		.sh_entsize = (Elf32_Word)0,
 	},
-	"\0.text\0.rodata\0.data\0.bss\0.shstrtab"
+	"\0.text\0.rodata\0.data\0.bss\0.cmdlist\0.shstrtab"
 };
Index: EcnlProtoTool/trunk/prototool/src/main.c
===================================================================
--- EcnlProtoTool/trunk/prototool/src/main.c	(revision 445)
+++ EcnlProtoTool/trunk/prototool/src/main.c	(revision 446)
@@ -78,37 +78,5 @@
 };
 
-typedef struct
-{
-	cmd_table_t *table;
-	cmd_table_t *count;
-} cmd_table_info_t;
-
-extern int mrbc_main(int argc, char **argv);
-extern int mrdb_main(int argc, char **argv);
-extern int mruby_main(int argc, char **argv);
-extern int mirb_main(int argc, char **argv);
-extern int curl_main(int argc, char **argv);
-extern int tcc_main(int argc, char **argv);
-extern int vi_main(int argc, char **argv);
-extern int openssl_main(int argc, char *argv[]);
-extern int onitest_main(int argc, char **argv);
-extern int tcp_echo_main(int argc, char **argv);
-extern int echo_client_main(int argc, char **argv);
-extern int mrdb_break(void);
-
-static const cmd_table_t cmdlist[] = {
-	{"mrbc", "mruby compiler executable", mrbc_main},
-	{"mrdb","mruby debugger command", mrdb_main},
-	{"mruby","mruby command", mruby_main},
-	{"mirb", "Embeddable Interactive Ruby Shell", mirb_main},
-	{"curl", "Command lines or scripts to transfer data", curl_main},
-	{"tcc", "Tiny C compiler", tcc_main},
-	{"vi", "Text editor", vi_main},
-	{"openssl", "Cryptography and SSL/TLS Toolkit", openssl_main},
-	{"onitest", "Onigumo Test", onitest_main},
-	{"tcp_echo", "TCP echo server/client", tcp_echo_main},
-	{"help", "This is a description text string for help command.", usrcmd_help},
-};
-cmd_table_info_t cmd_table_info = { &cmdlist, sizeof(cmdlist) / sizeof(cmdlist[0]) };
+extern const cmd_table_info_t cmd_table_info;
 
 int echonet = 1;
@@ -199,17 +167,4 @@
 	printf("tcp_echo -c ipaddr port\n");
 
-	return 0;
-}
-
-int usrcmd_help(int argc, char **argv)
-{
-	const cmd_table_t *p = cmd_table_info.table;
-	for (int i = 0; i < cmd_table_info.count; i++) {
-		printf(p->cmd);
-		printf("\t:");
-		printf(p->desc);
-		printf("\n");
-		p++;
-	}
 	return 0;
 }
