summaryrefslogtreecommitdiff
path: root/nuttx/binfmt/libelf
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
parent6cafdad8d539bbfbe2a516e46fe41549b8a6b68a (diff)
downloadpx4-nuttx-f1c2ce14060e4442dd59f6fa89e02b23c2d3989d.tar.gz
px4-nuttx-f1c2ce14060e4442dd59f6fa89e02b23c2d3989d.tar.bz2
px4-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')
-rw-r--r--nuttx/binfmt/libelf/libelf_init.c57
-rw-r--r--nuttx/binfmt/libelf/libelf_load.c52
2 files changed, 56 insertions, 53 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)
diff --git a/nuttx/binfmt/libelf/libelf_load.c b/nuttx/binfmt/libelf/libelf_load.c
index 9378661e3..6526004f7 100644
--- a/nuttx/binfmt/libelf/libelf_load.c
+++ b/nuttx/binfmt/libelf/libelf_load.c
@@ -40,7 +40,6 @@
#include <nuttx/config.h>
#include <sys/types.h>
-#include <sys/stat.h>
#include <stdint.h>
#include <stdlib.h>
@@ -77,49 +76,6 @@
****************************************************************************/
/****************************************************************************
- * 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)
-{
- struct stat buf;
- int ret;
-
- /* Get the file stats */
-
- ret = fstat(loadinfo->filfd, &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 */
-
- /* Return the size of the file in the loadinfo structure */
-
- loadinfo->filelen = buf.st_size;
- return OK;
-}
-
-/****************************************************************************
* Name: elf_loadshdrs
*
* Description:
@@ -323,14 +279,6 @@ int elf_load(FAR struct elf_loadinfo_s *loadinfo)
bvdbg("loadinfo: %p\n", loadinfo);
DEBUGASSERT(loadinfo && loadinfo->filfd >= 0);
- /* Get the length of the file. */
-
- ret = elf_filelen(loadinfo);
- {
- bdbg("elf_filelen failed: %d\n", ret);
- return ret;
- }
-
/* Load section headers into memory */
ret = elf_loadshdrs(loadinfo);