diff --git a/binfmt/libnxflat/libnxflat_bind.c b/binfmt/libnxflat/libnxflat_bind.c index 84ef3a9a32d..4e89a76ecbe 100644 --- a/binfmt/libnxflat/libnxflat_bind.c +++ b/binfmt/libnxflat/libnxflat_bind.c @@ -54,17 +54,15 @@ * Pre-processor Definitions ****************************************************************************/ -#undef NXFLAT_DUMPBUFFER /* Define to enable very verbose buffer dumping */ - /* CONFIG_DEBUG, CONFIG_DEBUG_VERBOSE, and CONFIG_DEBUG_BINFMT have to be - * defined or NXFLAT_DUMPBUFFER does nothing. + * defined or CONFIG_NXFLAT_DUMPBUFFER does nothing. */ #if !defined(CONFIG_DEBUG_VERBOSE) || !defined (CONFIG_DEBUG_BINFMT) -# undef NXFLAT_DUMPBUFFER +# undef CONFIG_NXFLAT_DUMPBUFFER #endif -#ifdef NXFLAT_DUMPBUFFER +#ifdef CONFIG_NXFLAT_DUMPBUFFER # define nxflat_dumpbuffer(m,b,n) bvdbgdumpbuffer(m,b,n) #else # define nxflat_dumpbuffer(m,b,n) @@ -319,7 +317,7 @@ static inline int nxflat_gotrelocs(FAR struct nxflat_loadinfo_s *loadinfo) /* Dump the relocation got */ -#ifdef NXFLAT_DUMPBUFFER +#ifdef CONFIG_NXFLAT_DUMPBUFFER if (ret == OK && nrelocs > 0) { relocs = (FAR struct nxflat_reloc_s*)(offset - loadinfo->isize + loadinfo->dspace->region); @@ -421,14 +419,14 @@ static inline int nxflat_bindimports(FAR struct nxflat_loadinfo_s *loadinfo, imports[i].i_funcaddress = (uint32)symbol->sym_value; - bvdbg("Bound import %d (%08p) to export 's' (%08x)\n", + bvdbg("Bound import %d (%08p) to export '%s' (%08x)\n", i, &imports[i], symname, imports[i].i_funcaddress); } } /* Dump the relocation import table */ -#ifdef NXFLAT_DUMPBUFFER +#ifdef CONFIG_NXFLAT_DUMPBUFFER if (nimports > 0) { nxflat_dumpbuffer("Imports", (FAR const ubyte*)imports, nimports * sizeof(struct nxflat_import_s)); diff --git a/binfmt/libnxflat/libnxflat_init.c b/binfmt/libnxflat/libnxflat_init.c index 6a7a987482a..321c90e51c3 100644 --- a/binfmt/libnxflat/libnxflat_init.c +++ b/binfmt/libnxflat/libnxflat_init.c @@ -54,6 +54,20 @@ * Pre-Processor Definitions ****************************************************************************/ +/* CONFIG_DEBUG, CONFIG_DEBUG_VERBOSE, and CONFIG_DEBUG_BINFMT have to be + * defined or CONFIG_NXFLAT_DUMPBUFFER does nothing. + */ + +#if !defined(CONFIG_DEBUG_VERBOSE) || !defined (CONFIG_DEBUG_BINFMT) +# undef CONFIG_NXFLAT_DUMPBUFFER +#endif + +#ifdef CONFIG_NXFLAT_DUMPBUFFER +# define nxflat_dumpbuffer(m,b,n) bvdbgdumpbuffer(m,b,n) +#else +# define nxflat_dumpbuffer(m,b,n) +#endif + /**************************************************************************** * Private Constant Data ****************************************************************************/ @@ -79,8 +93,7 @@ * ****************************************************************************/ -int nxflat_init(const char *filename, struct nxflat_hdr_s *header, - struct nxflat_loadinfo_s *loadinfo) +int nxflat_init(const char *filename, struct nxflat_loadinfo_s *loadinfo) { uint32 datastart; uint32 dataend; @@ -88,7 +101,7 @@ int nxflat_init(const char *filename, struct nxflat_hdr_s *header, uint32 bssend; int ret; - bvdbg("filename: %s header: %p loadinfo: %p\n", filename, header, loadinfo); + bvdbg("filename: %s loadinfo: %p\n", filename, loadinfo); /* Clear the load info structure */ @@ -105,16 +118,19 @@ int nxflat_init(const char *filename, struct nxflat_hdr_s *header, /* Read the NXFLAT header from offset 0 */ - ret = nxflat_read(loadinfo, (char*)header, sizeof(struct nxflat_hdr_s), 0); + ret = nxflat_read(loadinfo, (char*)&loadinfo->header, + sizeof(struct nxflat_hdr_s), 0); if (ret < 0) { bdbg("Failed to read NXFLAT header: %d\n", ret); return ret; } - + nxflat_dumpbuffer("NXFLAT header", (FAR const ubyte*)&loadinfo->header, + sizeof(struct nxflat_hdr_s)); + /* Verify the NXFLAT header */ - if (nxflat_verifyheader(header) != 0) + if (nxflat_verifyheader(&loadinfo->header) != 0) { /* This is not an error because we will be called to attempt loading * EVERY binary. Returning -ENOEXEC simply informs the system that @@ -127,19 +143,16 @@ int nxflat_init(const char *filename, struct nxflat_hdr_s *header, return -ENOEXEC; } - /* Save all of the input values in the loadinfo structure */ - - loadinfo->header = header; - - /* And extract some additional information from the xflat + /* Save all of the input values in the loadinfo structure + * and extract some additional information from the xflat * header. Note that the information in the xflat header is in * network order. */ - datastart = ntohl(header->h_datastart); - dataend = ntohl(header->h_dataend); + datastart = ntohl(loadinfo->header.h_datastart); + dataend = ntohl(loadinfo->header.h_dataend); bssstart = dataend; - bssend = ntohl(header->h_bssend); + bssend = ntohl(loadinfo->header.h_bssend); /* And put this information into the loadinfo structure as well. * @@ -150,12 +163,12 @@ int nxflat_init(const char *filename, struct nxflat_hdr_s *header, * bsssize = the address range from dataend up to bssend. */ - loadinfo->entryoffs = ntohl(header->h_entry); + loadinfo->entryoffs = ntohl(loadinfo->header.h_entry); loadinfo->isize = datastart; loadinfo->datasize = dataend - datastart; loadinfo->bsssize = bssend - dataend; - loadinfo->stacksize = ntohl(header->h_stacksize); + loadinfo->stacksize = ntohl(loadinfo->header.h_stacksize); /* This is the initial dspace size. We'll re-calculate this later * after the memory has been allocated. @@ -167,8 +180,8 @@ int nxflat_init(const char *filename, struct nxflat_hdr_s *header, * this later). */ - loadinfo->relocstart = ntohl(header->h_relocstart); - loadinfo->reloccount = ntohs(header->h_reloccount); + loadinfo->relocstart = ntohl(loadinfo->header.h_relocstart); + loadinfo->reloccount = ntohs(loadinfo->header.h_reloccount); return 0; } diff --git a/binfmt/nxflat.c b/binfmt/nxflat.c index 8b3677df5e8..f4eac0fcf3a 100644 --- a/binfmt/nxflat.c +++ b/binfmt/nxflat.c @@ -55,17 +55,15 @@ * Pre-processor Definitions ****************************************************************************/ -#undef NXFLAT_DUMPBUFFER /* Define to enable very verbose buffer dumping */ - /* CONFIG_DEBUG, CONFIG_DEBUG_VERBOSE, and CONFIG_DEBUG_BINFMT have to be - * defined or NXFLAT_DUMPBUFFER does nothing. + * defined or CONFIG_NXFLAT_DUMPBUFFER does nothing. */ #if !defined(CONFIG_DEBUG_VERBOSE) || !defined (CONFIG_DEBUG_BINFMT) -# undef NXFLAT_DUMPBUFFER +# undef CONFIG_NXFLAT_DUMPBUFFER #endif -#ifdef NXFLAT_DUMPBUFFER +#ifdef CONFIG_NXFLAT_DUMPBUFFER # define nxflat_dumpbuffer(m,b,n) bvdbgdumpbuffer(m,b,n) #else # define nxflat_dumpbuffer(m,b,n) @@ -132,9 +130,6 @@ static void nxflat_dumploadinfo(struct nxflat_loadinfo_s *loadinfo) bdbg(" HANDLES:\n"); bdbg(" filfd: %d\n", loadinfo->filfd); - - bdbg(" NXFLT HEADER:\n"); - bdbg(" header: %p\n", loadinfo->header); } #else # define nxflat_dumploadinfo(i) @@ -151,7 +146,6 @@ static void nxflat_dumploadinfo(struct nxflat_loadinfo_s *loadinfo) static int nxflat_loadbinary(struct binary_s *binp) { - struct nxflat_hdr_s header; /* Just allocated memory */ struct nxflat_loadinfo_s loadinfo; /* Contains globals for libnxflat */ int ret; @@ -159,7 +153,7 @@ static int nxflat_loadbinary(struct binary_s *binp) /* Initialize the xflat library to load the program binary. */ - ret = nxflat_init(binp->filename, &header, &loadinfo); + ret = nxflat_init(binp->filename, &loadinfo); nxflat_dumploadinfo(&loadinfo); if (ret != 0) { @@ -196,7 +190,8 @@ static int nxflat_loadbinary(struct binary_s *binp) binp->isize = loadinfo.isize; binp->stacksize = loadinfo.stacksize; - nxflat_dumpbuffer("Entry code", (FAR const ubyte*)binp->entrypt, MIN(binp->isize,512)); + nxflat_dumpbuffer("Entry code", (FAR const ubyte*)binp->entrypt, + MIN(binp->isize - loadinfo.entryoffs,512)); nxflat_uninit(&loadinfo); return OK; } diff --git a/configs/eagle100/nxflat/defconfig b/configs/eagle100/nxflat/defconfig index c04156e28c0..e76b7feeed9 100644 --- a/configs/eagle100/nxflat/defconfig +++ b/configs/eagle100/nxflat/defconfig @@ -276,10 +276,15 @@ CONFIG_SDCLONE_DISABLE=y # CONFIG_NXFLAT. Enable support for the NXFLAT binary format. # This format will support execution of NuttX binaries located # in a ROMFS filesystem (see examples/nxflat). +# CONFIG_NXFLAT_DUMPBUFFER. Dump a most buffers that NXFFLAT deals +# with. CONFIG_DEBUG, CONFIG_DEBUG_VERBOSE, and +# CONFIG_DEBUG_BINFMT have to be defined or +# CONFIG_NXFLAT_DUMPBUFFER does nothing. # CONFIG_SYMTAB_ORDEREDBYNAME. Select if the system symbol table # is ordered by symbol name # CONFIG_NXFLAT=y +CONFIG_NXFLAT_DUMPBUFFER=n CONFIG_SYMTAB_ORDEREDBYNAME=y # diff --git a/include/nuttx/nxflat.h b/include/nuttx/nxflat.h index 8c43917ce30..a90dd572d3a 100644 --- a/include/nuttx/nxflat.h +++ b/include/nuttx/nxflat.h @@ -87,7 +87,9 @@ struct nxflat_loadinfo_s int filfd; /* Descriptor for the file being loaded */ - const struct nxflat_hdr_s *header; /* A reference to the flat file header */ + /* This is a copy of the NXFLAT header (still in network order) */ + + struct nxflat_hdr_s header; }; /**************************************************************************** @@ -134,7 +136,7 @@ EXTERN int nxflat_verifyheader(const struct nxflat_hdr_s *header); * ***********************************************************************/ -EXTERN int nxflat_init(const char *filename, struct nxflat_hdr_s *header, +EXTERN int nxflat_init(const char *filename, struct nxflat_loadinfo_s *loadinfo); /***********************************************************************