summaryrefslogtreecommitdiff
path: root/nuttx/binfmt/libelf/libelf_init.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-10-26 19:53:20 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-10-26 19:53:20 +0000
commitf1c2ce14060e4442dd59f6fa89e02b23c2d3989d (patch)
treeaa81a018000664e46a2c0cf81c6d71cf42c1e9aa /nuttx/binfmt/libelf/libelf_init.c
parent6cafdad8d539bbfbe2a516e46fe41549b8a6b68a (diff)
downloadnuttx-f1c2ce14060e4442dd59f6fa89e02b23c2d3989d.tar.gz
nuttx-f1c2ce14060e4442dd59f6fa89e02b23c2d3989d.tar.bz2
nuttx-f1c2ce14060e4442dd59f6fa89e02b23c2d3989d.zip
ARM and ARMv7-M ELF support; STM32F4Discovery ELF loader test configuration
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5264 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/binfmt/libelf/libelf_init.c')
-rw-r--r--nuttx/binfmt/libelf/libelf_init.c57
1 files changed, 56 insertions, 1 deletions
diff --git a/nuttx/binfmt/libelf/libelf_init.c b/nuttx/binfmt/libelf/libelf_init.c
index f2744eae7..e1b9f73d6 100644
--- a/nuttx/binfmt/libelf/libelf_init.c
+++ b/nuttx/binfmt/libelf/libelf_init.c
@@ -40,6 +40,7 @@
#include <nuttx/config.h>
#include <sys/stat.h>
+
#include <stdint.h>
#include <string.h>
#include <fcntl.h>
@@ -78,6 +79,52 @@
****************************************************************************/
/****************************************************************************
+ * Name: elf_filelen
+ *
+ * Description:
+ * Get the size of the ELF file
+ *
+ * Returned Value:
+ * 0 (OK) is returned on success and a negated errno is returned on
+ * failure.
+ *
+ ****************************************************************************/
+
+static inline int elf_filelen(FAR struct elf_loadinfo_s *loadinfo,
+ FAR const char *filename)
+{
+ struct stat buf;
+ int ret;
+
+ /* Get the file stats */
+
+ ret = stat(filename, &buf);
+ if (ret < 0)
+ {
+ int errval = errno;
+ bdbg("Failed to fstat file: %d\n", errval);
+ return -errval;
+ }
+
+ /* Verify that it is a regular file */
+
+ if (!S_ISREG(buf.st_mode))
+ {
+ bdbg("Not a regular file. mode: %d\n", buf.st_mode);
+ return -ENOENT;
+ }
+
+ /* TODO: Verify that the file is readable. Not really important because
+ * we will detect this when we try to open the file read-only.
+ */
+
+ /* Return the size of the file in the loadinfo structure */
+
+ loadinfo->filelen = buf.st_size;
+ return OK;
+}
+
+/****************************************************************************
* Public Functions
****************************************************************************/
@@ -104,7 +151,15 @@ int elf_init(FAR const char *filename, FAR struct elf_loadinfo_s *loadinfo)
memset(loadinfo, 0, sizeof(struct elf_loadinfo_s));
- /* Open the binary file */
+ /* Get the length of the file. */
+
+ ret = elf_filelen(loadinfo, filename);
+ {
+ bdbg("elf_filelen failed: %d\n", ret);
+ return ret;
+ }
+
+ /* Open the binary file for reading (only) */
loadinfo->filfd = open(filename, O_RDONLY);
if (loadinfo->filfd < 0)