Changeset 446 for EcnlProtoTool/trunk


Ignore:
Timestamp:
Jul 21, 2020, 8:38:44 AM (4 years ago)
Author:
coas-nagasima
Message:

プログラムテーブルのセクションを追加しntshellで読みだしてHELPを表示するよう変更

Location:
EcnlProtoTool/trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/ntshell/ntshell/usrcmd.h

    r441 r446  
    4343} cmd_table_t;
    4444
     45typedef struct
     46{
     47        const cmd_table_t *table;
     48        int count;
     49} cmd_table_info_t;
     50
    4551int usrcmd_cd(int argc, char **argv);
    4652int usrcmd_ls(int argc, char **argv);
  • EcnlProtoTool/trunk/ntshell/src/main.c

    r443 r446  
    125125static const Elf32_Ehdr *load_elf(const uint8_t *file);
    126126static void execute_elf(const Elf32_Ehdr *, long *args);
     127static void read_cmdlist_from_elf(const Elf32_Ehdr *Ehdr);
    127128static int usrcmd_ntopt_callback(long *args, void *extobj);
    128129#ifndef NTSHELL_NO_SOCKET
     
    527528        {"info", "This is a description text string for info command.", usrcmd_info},
    528529        {"exit", "Exit Natural Tiny Shell", usrcmd_exit},
     530        {"help", "This is a description text string for help command.", usrcmd_help},
    529531};
    530 cmd_table_info_t cmd_table_info = { cmdlist, sizeof(cmdlist) / sizeof(cmdlist[0]) };
     532const cmd_table_info_t cmd_table_info = { cmdlist, sizeof(cmdlist) / sizeof(cmdlist[0]) };
     533cmd_table_info_t elf_cmd_table_info;
    531534
    532535static int usrcmd_ntopt_callback(long *args, void *extobj)
     
    540543
    541544        if (strcmp((const char *)args[1], "help") == 0) {
     545                found = 1;
    542546                result = usrcmd_help(args[0], (char **)&args[1]);
    543547        }
     
    567571int usrcmd_help(int argc, char **argv)
    568572{
    569         const cmd_table_t *p = cmd_table_info.table;
    570         for (int i = 0; i < cmd_table_info.count; i++) {
    571                 printf(p->cmd);
    572                 printf("\t:");
    573                 puts(p->desc);
    574                 p++;
     573        const cmd_table_t *p, *q;
     574        const Elf32_Ehdr *elf = load_elf((const uint8_t *)0x18200000);
     575        if (elf != NULL) {
     576                read_cmdlist_from_elf(elf);
     577        }
     578        else {
     579                elf_cmd_table_info.count = 0;
     580        }
     581        p = cmd_table_info.table;
     582        for (int i = 0; i < cmd_table_info.count - 3; i++, p++) {
     583                printf("%s\t:%s\n", p->cmd, p->desc);
     584        }
     585        p = elf_cmd_table_info.table;
     586        for (int i = 0; i < elf_cmd_table_info.count; i++, p++) {
     587                printf("%s\t:%s\n", p->cmd, p->desc);
     588        }
     589        p = &cmd_table_info.table[cmd_table_info.count - 3];
     590        for (int i = cmd_table_info.count - 3; i < cmd_table_info.count; i++, p++) {
     591                printf("%s\t:%s\n", p->cmd, p->desc);
    575592        }
    576593        return 0;
     
    700717                        Shdr.sh_size -= Shdr.sh_addr;
    701718
    702                         char *name;
    703                         if (Shdr.sh_name > 0) {
    704                                 name = (char *)&file[StringShdr.sh_offset + Shdr.sh_name];
    705                         }
    706                         else {
    707                                 name = NULL;
    708                         }
    709 
    710719                        if ((Shdr.sh_flags & SHF_ALLOC) == 0) {
    711720                                // skip
     
    730739        ((elf_entry_t)Ehdr->e_entry)(args);
    731740}
     741
     742void read_cmdlist_from_elf(const Elf32_Ehdr *Ehdr)
     743{
     744        const uint8_t *file = (const uint8_t *)Ehdr;
     745        Elf32_Shdr StringShdr;
     746        memcpy(&StringShdr, &file[Ehdr->e_shoff + (Ehdr->e_shstrndx * Ehdr->e_shentsize)], sizeof(StringShdr));
     747
     748        if (Ehdr->e_shoff > 0) {
     749                Elf32_Shdr Shdr;
     750                for (int i = 0; i < Ehdr->e_shnum; i++) {
     751                        memcpy(&Shdr, (Elf32_Shdr *)&file[Ehdr->e_shoff + (i * Ehdr->e_shentsize)], sizeof(Elf32_Shdr));
     752                        Shdr.sh_size -= Shdr.sh_addr;
     753
     754                        char *name;
     755                        if (Shdr.sh_name > 0) {
     756                                name = (char *)&file[StringShdr.sh_offset + Shdr.sh_name];
     757                        }
     758                        else {
     759                                name = NULL;
     760                        }
     761
     762                        if ((name != NULL) && (strcmp(name, ".cmdlist") == 0)) {
     763                                elf_cmd_table_info.table = (const cmd_table_t *)Shdr.sh_addr;
     764                                elf_cmd_table_info.count = Shdr.sh_size / sizeof(cmd_table_t);
     765                        }
     766                }
     767        }
     768}
  • EcnlProtoTool/trunk/ntshell/src/main.h

    r443 r446  
    8383} task_base_t;
    8484
    85 typedef struct
    86 {
    87         const cmd_table_t *table;
    88         int count;
    89 } cmd_table_info_t;
    90 
    91 extern cmd_table_info_t cmd_table_info;
     85extern const cmd_table_info_t cmd_table_info;
    9286
    9387/* ntshellの初期化 */
  • EcnlProtoTool/trunk/prototool/.project

    r444 r446  
    1010                <project>ntshell</project>
    1111                <project>onigmo-6.1.3</project>
    12                 <project>openssl-1.1.0e</project>
    1312                <project>tcc-0.9.27</project>
    1413                <project>zlib-1.2.11</project>
    1514        </projects>
    1615        <buildSpec>
     16                <buildCommand>
     17                        <name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
     18                        <arguments>
     19                        </arguments>
     20                </buildCommand>
    1721                <buildCommand>
    1822                        <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
     
    3236                <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
    3337                <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
     38                <nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
    3439        </natures>
    3540</projectDescription>
  • EcnlProtoTool/trunk/prototool/src/elf.c

    r443 r446  
    3838#include <string.h>
    3939#include <elf.h>
     40#include <ntshell/usrcmd.h>
     41
     42extern int mrbc_main(int argc, char **argv);
     43extern int mrdb_main(int argc, char **argv);
     44extern int mruby_main(int argc, char **argv);
     45extern int mirb_main(int argc, char **argv);
     46extern int curl_main(int argc, char **argv);
     47extern int tcc_main(int argc, char **argv);
     48extern int vi_main(int argc, char **argv);
     49extern int openssl_main(int argc, char *argv[]);
     50extern int onitest_main(int argc, char **argv);
     51extern int tcp_echo_main(int argc, char **argv);
     52
     53static const cmd_table_t cmdlist[] = {
     54        {"mrbc", "mruby compiler executable", mrbc_main},
     55        {"mrdb","mruby debugger command", mrdb_main},
     56        {"mruby","mruby command", mruby_main},
     57        {"mirb", "Embeddable Interactive Ruby Shell", mirb_main},
     58        {"curl", "Command lines or scripts to transfer data", curl_main},
     59        {"tcc", "Tiny C compiler", tcc_main},
     60        {"vi", "Text editor", vi_main},
     61        {"openssl", "Cryptography and SSL/TLS Toolkit", openssl_main},
     62        {"onitest", "Onigumo Test", onitest_main},
     63        {"tcp_echo", "TCP echo server/client", tcp_echo_main},
     64};
     65const cmd_table_info_t cmd_table_info = { &cmdlist, sizeof(cmdlist) / sizeof(cmdlist[0]) };
    4066
    4167#define FVECT_SECT          __attribute__ ((section (".proginf")))
     
    5076        Elf32_Ehdr ehdr;
    5177        Elf32_Phdr phdr[3];
    52         Elf32_Shdr shdr[4];
     78        Elf32_Shdr shdr[5];
    5379        Elf32_Shdr str_shdr;
    54         char shstrtab[sizeof("\0.text\0.rodata\0.data\0.bss\0.shstrtab")];
     80        char shstrtab[sizeof("\0.text\0.rodata\0.data\0.bss\0.cmdlist\0.shstrtab")];
    5581} TProgInf;
    5682
     
    152178                        .sh_addralign = (Elf32_Word)8,
    153179                        .sh_entsize = (Elf32_Word)0,
     180                },
     181                {
     182                        .sh_name = (Elf32_Word)26,
     183                        .sh_type = (Elf32_Word)SHT_PROGBITS,
     184                        .sh_flags = (Elf32_Word)(SHF_ALLOC),
     185                        .sh_addr = (Elf32_Addr)&cmdlist,
     186                        .sh_offset = (Elf32_Off)&cmdlist/* - (Elf32_Off)&ProgInf*/,
     187                        .sh_size = (Elf32_Word)&cmdlist[sizeof(cmdlist) / sizeof(cmdlist[0])]/* - (Elf32_Off)&cmdlist*/,
     188                        .sh_link = (Elf32_Word)0,
     189                        .sh_info = (Elf32_Word)0,
     190                        .sh_addralign = (Elf32_Word)8,
     191                        .sh_entsize = (Elf32_Word)0,
    154192                }
    155193        },
    156194        {
    157                 .sh_name = (Elf32_Word)26,
     195                .sh_name = (Elf32_Word)35,
    158196                .sh_type = (Elf32_Word)SHT_STRTAB,
    159197                .sh_flags = (Elf32_Word)0,
     
    166204                .sh_entsize = (Elf32_Word)0,
    167205        },
    168         "\0.text\0.rodata\0.data\0.bss\0.shstrtab"
     206        "\0.text\0.rodata\0.data\0.bss\0.cmdlist\0.shstrtab"
    169207};
  • EcnlProtoTool/trunk/prototool/src/main.c

    r443 r446  
    7878};
    7979
    80 typedef struct
    81 {
    82         cmd_table_t *table;
    83         cmd_table_t *count;
    84 } cmd_table_info_t;
    85 
    86 extern int mrbc_main(int argc, char **argv);
    87 extern int mrdb_main(int argc, char **argv);
    88 extern int mruby_main(int argc, char **argv);
    89 extern int mirb_main(int argc, char **argv);
    90 extern int curl_main(int argc, char **argv);
    91 extern int tcc_main(int argc, char **argv);
    92 extern int vi_main(int argc, char **argv);
    93 extern int openssl_main(int argc, char *argv[]);
    94 extern int onitest_main(int argc, char **argv);
    95 extern int tcp_echo_main(int argc, char **argv);
    96 extern int echo_client_main(int argc, char **argv);
    97 extern int mrdb_break(void);
    98 
    99 static const cmd_table_t cmdlist[] = {
    100         {"mrbc", "mruby compiler executable", mrbc_main},
    101         {"mrdb","mruby debugger command", mrdb_main},
    102         {"mruby","mruby command", mruby_main},
    103         {"mirb", "Embeddable Interactive Ruby Shell", mirb_main},
    104         {"curl", "Command lines or scripts to transfer data", curl_main},
    105         {"tcc", "Tiny C compiler", tcc_main},
    106         {"vi", "Text editor", vi_main},
    107         {"openssl", "Cryptography and SSL/TLS Toolkit", openssl_main},
    108         {"onitest", "Onigumo Test", onitest_main},
    109         {"tcp_echo", "TCP echo server/client", tcp_echo_main},
    110         {"help", "This is a description text string for help command.", usrcmd_help},
    111 };
    112 cmd_table_info_t cmd_table_info = { &cmdlist, sizeof(cmdlist) / sizeof(cmdlist[0]) };
     80extern const cmd_table_info_t cmd_table_info;
    11381
    11482int echonet = 1;
     
    199167        printf("tcp_echo -c ipaddr port\n");
    200168
    201         return 0;
    202 }
    203 
    204 int usrcmd_help(int argc, char **argv)
    205 {
    206         const cmd_table_t *p = cmd_table_info.table;
    207         for (int i = 0; i < cmd_table_info.count; i++) {
    208                 printf(p->cmd);
    209                 printf("\t:");
    210                 printf(p->desc);
    211                 printf("\n");
    212                 p++;
    213         }
    214169        return 0;
    215170}
Note: See TracChangeset for help on using the changeset viewer.