You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2024/10/12 04:29:26 UTC
(nuttx) 13/20: binfmt/libelf:Remove libelf implementation [2/2]
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit e5f9b42ea0bb58ae0bae111ea23b7cc8bb10a0e8
Author: anjiahao <an...@xiaomi.com>
AuthorDate: Wed Jul 10 12:08:27 2024 +0800
binfmt/libelf:Remove libelf implementation [2/2]
this commit is part two, all logic move to modlib, so we can remove it.
and change all use defconfig
Signed-off-by: anjiahao <an...@xiaomi.com>
---
arch/arm/src/common/Toolchain.defs | 2 +-
arch/arm64/src/Toolchain.defs | 2 +-
arch/avr/src/avr/Toolchain.defs | 2 +-
arch/avr/src/avr32/Toolchain.defs | 2 +-
arch/ceva/src/xc5/Toolchain.defs | 2 +-
arch/ceva/src/xm6/Toolchain.defs | 2 +-
arch/mips/src/mips32/Toolchain.defs | 2 +-
arch/misoc/src/lm32/Toolchain.defs | 2 +-
arch/misoc/src/minerva/Toolchain.defs | 2 +-
arch/or1k/src/mor1kx/Toolchain.defs | 2 +-
arch/risc-v/src/common/Toolchain.defs | 2 +-
arch/sparc/src/sparc_v8/Toolchain.defs | 2 +-
.../src/minerva => x86/src/common}/Toolchain.defs | 62 +-
arch/x86_64/src/common/Toolchain.defs | 2 +-
arch/xtensa/src/lx6/Toolchain.defs | 2 +-
arch/xtensa/src/lx7/Toolchain.defs | 2 +-
arch/z16/src/z16f/Toolchain.defs | 2 +-
arch/z80/src/ez80/Toolchain.defs | 2 +-
arch/z80/src/z180/Toolchain.defs | 2 +-
arch/z80/src/z8/Toolchain.defs | 2 +-
arch/z80/src/z80/Toolchain.defs | 2 +-
binfmt/elf.c | 3 -
binfmt/libelf/CMakeLists.txt | 48 --
binfmt/libelf/Kconfig | 72 ---
binfmt/libelf/Make.defs | 41 --
binfmt/libelf/gnu-elf.ld | 118 ----
binfmt/libelf/libelf.h | 345 ----------
binfmt/libelf/libelf_addrenv.c | 354 -----------
binfmt/libelf/libelf_bind.c | 703 ---------------------
binfmt/libelf/libelf_ctors.c | 193 ------
binfmt/libelf/libelf_dtors.c | 194 ------
binfmt/libelf/libelf_init.c | 178 ------
binfmt/libelf/libelf_iobuffer.c | 122 ----
binfmt/libelf/libelf_load.c | 552 ----------------
binfmt/libelf/libelf_read.c | 188 ------
binfmt/libelf/libelf_sections.c | 342 ----------
binfmt/libelf/libelf_symbols.c | 340 ----------
binfmt/libelf/libelf_uninit.c | 119 ----
binfmt/libelf/libelf_unload.c | 102 ---
binfmt/libelf/libelf_verify.c | 109 ----
boards/arm/mps/mps2-an500/scripts/Make.defs | 2 +-
boards/arm/mps/mps3-an547/scripts/Make.defs | 2 +-
.../arm/sama5/sama5d3-xplained/scripts/Make.defs | 2 +-
boards/sim/sim/sim/scripts/Make.defs | 2 +-
tools/mkexport.sh | 2 +-
45 files changed, 46 insertions(+), 4189 deletions(-)
diff --git a/arch/arm/src/common/Toolchain.defs b/arch/arm/src/common/Toolchain.defs
index dc1a2b2ccc..22a35be0ec 100644
--- a/arch/arm/src/common/Toolchain.defs
+++ b/arch/arm/src/common/Toolchain.defs
@@ -510,7 +510,7 @@ CELFFLAGS = $(CFLAGS) -fvisibility=hidden -mlong-calls # --target1-abs
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
# Zig toolchain
diff --git a/arch/arm64/src/Toolchain.defs b/arch/arm64/src/Toolchain.defs
index 58970f4fa5..3cfc20ab5d 100644
--- a/arch/arm64/src/Toolchain.defs
+++ b/arch/arm64/src/Toolchain.defs
@@ -211,4 +211,4 @@ CELFFLAGS = $(CFLAGS) -fvisibility=hidden -mlong-calls # --target1-abs
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -mlong-calls # --target1-abs
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/avr/src/avr/Toolchain.defs b/arch/avr/src/avr/Toolchain.defs
index bf18342c7e..76e236cc3b 100644
--- a/arch/avr/src/avr/Toolchain.defs
+++ b/arch/avr/src/avr/Toolchain.defs
@@ -179,4 +179,4 @@ CELFFLAGS = $(CFLAGS) -fvisibility=hidden
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/avr/src/avr32/Toolchain.defs b/arch/avr/src/avr32/Toolchain.defs
index eb45a46bc9..b2e785ac08 100644
--- a/arch/avr/src/avr32/Toolchain.defs
+++ b/arch/avr/src/avr32/Toolchain.defs
@@ -109,4 +109,4 @@ CELFFLAGS = $(CFLAGS) -fvisibility=hidden
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/ceva/src/xc5/Toolchain.defs b/arch/ceva/src/xc5/Toolchain.defs
index a9fe9f0338..e299f400e8 100644
--- a/arch/ceva/src/xc5/Toolchain.defs
+++ b/arch/ceva/src/xc5/Toolchain.defs
@@ -98,4 +98,4 @@ CELFFLAGS = $(CFLAGS) -fvisibility=hidden
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/ceva/src/xm6/Toolchain.defs b/arch/ceva/src/xm6/Toolchain.defs
index 96ac99dfe5..b43708da12 100644
--- a/arch/ceva/src/xm6/Toolchain.defs
+++ b/arch/ceva/src/xm6/Toolchain.defs
@@ -103,4 +103,4 @@ CELFFLAGS = $(CFLAGS) -fvisibility=hidden
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/mips/src/mips32/Toolchain.defs b/arch/mips/src/mips32/Toolchain.defs
index 5d725f99ae..819cb1ad1f 100644
--- a/arch/mips/src/mips32/Toolchain.defs
+++ b/arch/mips/src/mips32/Toolchain.defs
@@ -324,4 +324,4 @@ CELFFLAGS = $(CFLAGS) -fvisibility=hidden
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/misoc/src/lm32/Toolchain.defs b/arch/misoc/src/lm32/Toolchain.defs
index 678ca17f87..01a926d326 100644
--- a/arch/misoc/src/lm32/Toolchain.defs
+++ b/arch/misoc/src/lm32/Toolchain.defs
@@ -140,4 +140,4 @@ CELFFLAGS = $(CFLAGS) -fvisibility=hidden
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/misoc/src/minerva/Toolchain.defs b/arch/misoc/src/minerva/Toolchain.defs
index 09cf8875e2..efbf92a3d9 100644
--- a/arch/misoc/src/minerva/Toolchain.defs
+++ b/arch/misoc/src/minerva/Toolchain.defs
@@ -88,4 +88,4 @@ CELFFLAGS = $(CFLAGS) -fvisibility=hidden
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/or1k/src/mor1kx/Toolchain.defs b/arch/or1k/src/mor1kx/Toolchain.defs
index 151932c9c9..346c6b7147 100644
--- a/arch/or1k/src/mor1kx/Toolchain.defs
+++ b/arch/or1k/src/mor1kx/Toolchain.defs
@@ -126,4 +126,4 @@ CELFFLAGS = $(CFLAGS) -fvisibility=hidden
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/risc-v/src/common/Toolchain.defs b/arch/risc-v/src/common/Toolchain.defs
index a6fddffd8e..4de10db89c 100644
--- a/arch/risc-v/src/common/Toolchain.defs
+++ b/arch/risc-v/src/common/Toolchain.defs
@@ -417,7 +417,7 @@ else
LDELFFLAGS += --oformat elf64-littleriscv
endif
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
# Zig toolchain
diff --git a/arch/sparc/src/sparc_v8/Toolchain.defs b/arch/sparc/src/sparc_v8/Toolchain.defs
index a97af2fb47..60d0f9a39c 100644
--- a/arch/sparc/src/sparc_v8/Toolchain.defs
+++ b/arch/sparc/src/sparc_v8/Toolchain.defs
@@ -135,4 +135,4 @@ CELFFLAGS = $(CFLAGS) -fvisibility=hidden
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/misoc/src/minerva/Toolchain.defs b/arch/x86/src/common/Toolchain.defs
similarity index 53%
copy from arch/misoc/src/minerva/Toolchain.defs
copy to arch/x86/src/common/Toolchain.defs
index 09cf8875e2..2c7a1ce9c9 100644
--- a/arch/misoc/src/minerva/Toolchain.defs
+++ b/arch/x86/src/common/Toolchain.defs
@@ -1,5 +1,5 @@
############################################################################
-# arch/misoc/src/minerva/Toolchain.defs
+# arch/x86/src/common/Toolchain.defs
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
@@ -18,42 +18,34 @@
#
############################################################################
-CROSSDEV = riscv32-unknown-elf-
-ARCHCPUFLAGS = -march=rv32i
-
-ifeq ($(CONFIG_DEBUG_CUSTOMOPT),y)
- ARCHOPTIMIZATION += $(CONFIG_DEBUG_OPTLEVEL)
-else ifeq ($(CONFIG_DEBUG_FULLOPT),y)
- ARCHOPTIMIZATION += -Os
+ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
+ ARCHOPTIMIZATION = -g3
endif
ifneq ($(CONFIG_DEBUG_NOOPT),y)
- ARCHOPTIMIZATION += -fno-strict-aliasing
+ ARCHOPTIMIZATION += -O2
endif
-ifeq ($(CONFIG_FRAME_POINTER),y)
- ARCHOPTIMIZATION += -fno-omit-frame-pointer -fno-optimize-sibling-calls
-else
- ARCHOPTIMIZATION += -fomit-frame-pointer
-endif
+ARCHCPUFLAGS = -march=i486 -mtune=i486 -fno-stack-protector
+ARCHPICFLAGS = -fpic
+ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow -Wundef
-LDFLAGS += -nostdlib
+# Check if building a 32-bit target with a 64-bit toolchain
-ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
- ARCHOPTIMIZATION += $(CONFIG_DEBUG_SYMBOLS_LEVEL)
+ifeq ($(CONFIG_ARCH_X86_M32),y)
+ARCHCPUFLAGS += -m32
+LDFLAGS += -m elf_i386
endif
-ARCHCFLAGS += -fno-common
-ARCHCXXFLAGS += -fno-common
+# We have to use a cross-development toolchain under Cygwin because the native
+# Cygwin toolchains don't generate ELF binaries.
-ARCHCFLAGS += -Wall -Wstrict-prototypes -Wshadow -Wundef -Wno-attributes -Wno-unknown-pragmas
-ARCHCXXFLAGS += -Wall -Wshadow -Wundef -Wno-attributes -Wno-unknown-pragmas
-
-# Default toolchain
+ifeq ($(CONFIG_WINDOWS_CYGWIN),y)
+CROSSDEV = i486-nuttx-elf-
+endif
CC = $(CROSSDEV)gcc
-CXX = $(CROSSDEV)g++
-CPP = $(CROSSDEV)gcc -E -P -x c
+CPP = $(CROSSDEV)gcc -E -x c
LD = $(CROSSDEV)ld
STRIP = $(CROSSDEV)strip --strip-unneeded
AR = $(CROSSDEV)ar rcs
@@ -61,21 +53,9 @@ NM = $(CROSSDEV)nm
OBJCOPY = $(CROSSDEV)objcopy
OBJDUMP = $(CROSSDEV)objdump
-# Add the builtin library
-
-EXTRA_LIBS += $(wildcard $(shell $(CC) $(ARCHCPUFLAGS) --print-libgcc-file-name))
-
-ifneq ($(CONFIG_LIBCXXTOOLCHAIN),y)
- ARCHCXXFLAGS += -nostdinc++
-endif
-
-ifeq ($(CONFIG_LIBM_TOOLCHAIN),y)
- EXTRA_LIBS += $(wildcard $(shell $(CC) $(ARCHCPUFLAGS) --print-file-name=libm.a))
-endif
-
-ifeq ($(CONFIG_LIBSUPCXX),y)
- EXTRA_LIBS += $(wildcard $(shell $(CC) $(ARCHCPUFLAGS) --print-file-name=libsupc++.a))
-endif
+CFLAGS := $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe
+CPPFLAGS := $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS)
+AFLAGS := $(CFLAGS) -D__ASSEMBLY__
# Loadable module definitions
@@ -88,4 +68,4 @@ CELFFLAGS = $(CFLAGS) -fvisibility=hidden
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/x86_64/src/common/Toolchain.defs b/arch/x86_64/src/common/Toolchain.defs
index fb4b4a93d3..3d7a06fdeb 100644
--- a/arch/x86_64/src/common/Toolchain.defs
+++ b/arch/x86_64/src/common/Toolchain.defs
@@ -195,7 +195,7 @@ CELFFLAGS = $(CFLAGS) -fvisibility=hidden
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
LDELFFLAGS = -r -e main --gc-sections
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
# -fno-pic to avoid GOT relocations
# -mcmodel=large to avoid out-of-range 32-bit relocations
diff --git a/arch/xtensa/src/lx6/Toolchain.defs b/arch/xtensa/src/lx6/Toolchain.defs
index 9f8eb9620e..c70eeb8edc 100644
--- a/arch/xtensa/src/lx6/Toolchain.defs
+++ b/arch/xtensa/src/lx6/Toolchain.defs
@@ -206,4 +206,4 @@ CELFFLAGS = $(CFLAGS) -fvisibility=hidden -mtext-section-literals
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -mtext-section-literals
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/xtensa/src/lx7/Toolchain.defs b/arch/xtensa/src/lx7/Toolchain.defs
index 071ccd9d05..5ad3e768a2 100644
--- a/arch/xtensa/src/lx7/Toolchain.defs
+++ b/arch/xtensa/src/lx7/Toolchain.defs
@@ -210,4 +210,4 @@ CELFFLAGS = $(CFLAGS) -fvisibility=hidden -mtext-section-literals
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden -mtext-section-literals
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/z16/src/z16f/Toolchain.defs b/arch/z16/src/z16f/Toolchain.defs
index 262c59bb56..9da2fb7869 100644
--- a/arch/z16/src/z16f/Toolchain.defs
+++ b/arch/z16/src/z16f/Toolchain.defs
@@ -117,4 +117,4 @@ CELFFLAGS = $(CFLAGS) -fvisibility=hidden
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/z80/src/ez80/Toolchain.defs b/arch/z80/src/ez80/Toolchain.defs
index 75812bcdb2..930066db7e 100644
--- a/arch/z80/src/ez80/Toolchain.defs
+++ b/arch/z80/src/ez80/Toolchain.defs
@@ -221,4 +221,4 @@ CELFFLAGS = $(CFLAGS) -fvisibility=hidden
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/z80/src/z180/Toolchain.defs b/arch/z80/src/z180/Toolchain.defs
index 3e82d73c3c..8ecbdeaae5 100644
--- a/arch/z80/src/z180/Toolchain.defs
+++ b/arch/z80/src/z180/Toolchain.defs
@@ -119,4 +119,4 @@ CELFFLAGS = $(CFLAGS) -fvisibility=hidden
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/z80/src/z8/Toolchain.defs b/arch/z80/src/z8/Toolchain.defs
index 571dca9fa5..bf12ac950d 100644
--- a/arch/z80/src/z8/Toolchain.defs
+++ b/arch/z80/src/z8/Toolchain.defs
@@ -144,4 +144,4 @@ CELFFLAGS = $(CFLAGS) -fvisibility=hidden
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/arch/z80/src/z80/Toolchain.defs b/arch/z80/src/z80/Toolchain.defs
index 09ab0e4763..3d2cecc1ff 100644
--- a/arch/z80/src/z80/Toolchain.defs
+++ b/arch/z80/src/z80/Toolchain.defs
@@ -119,4 +119,4 @@ CELFFLAGS = $(CFLAGS) -fvisibility=hidden
CXXELFFLAGS = $(CXXFLAGS) -fvisibility=hidden
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)binfmt$(DELIM)libelf$(DELIM)gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)$(DELIM)libs$(DELIM)libc$(DELIM)modlib$(DELIM)gnu-elf.ld)
diff --git a/binfmt/elf.c b/binfmt/elf.c
index 1d531bfb66..d95557ef36 100644
--- a/binfmt/elf.c
+++ b/binfmt/elf.c
@@ -33,9 +33,6 @@
#include <nuttx/arch.h>
#include <nuttx/binfmt/binfmt.h>
-#include <nuttx/binfmt/elf.h>
-
-#include "libelf/libelf.h"
#ifdef CONFIG_ELF
diff --git a/binfmt/libelf/CMakeLists.txt b/binfmt/libelf/CMakeLists.txt
deleted file mode 100644
index 8df1a0bd52..0000000000
--- a/binfmt/libelf/CMakeLists.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-# ##############################################################################
-# binfmt/libelf/CMakeLists.txt
-#
-# SPDX-License-Identifier: Apache-2.0
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more contributor
-# license agreements. See the NOTICE file distributed with this work for
-# additional information regarding copyright ownership. The ASF licenses this
-# file to you under the Apache License, Version 2.0 (the "License"); you may not
-# use this file except in compliance with the License. You may obtain a copy of
-# the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations under
-# the License.
-#
-# ##############################################################################
-
-if(CONFIG_ELF)
- set(SRCS)
-
- # ELF library
-
- list(
- APPEND
- SRCS
- libelf_bind.c
- libelf_init.c
- libelf_addrenv.c
- libelf_iobuffer.c
- libelf_load.c
- libelf_read.c
- libelf_sections.c
- libelf_symbols.c
- libelf_uninit.c
- libelf_unload.c
- libelf_verify.c)
-
- if(CONFIG_BINFMT_CONSTRUCTORS)
- list(APPEND SRCS libelf_ctors.c libelf_dtors.c)
- endif()
-
- target_sources(binfmt PRIVATE ${SRCS})
-endif()
diff --git a/binfmt/libelf/Kconfig b/binfmt/libelf/Kconfig
deleted file mode 100644
index f33d737021..0000000000
--- a/binfmt/libelf/Kconfig
+++ /dev/null
@@ -1,72 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see the file kconfig-language.txt in the NuttX tools repository.
-#
-
-config ELF_ALIGN_LOG2
- int "Log2 Section Alignment"
- default 2
- ---help---
- Align all sections to this Log2 value: 0->1, 1->2, 2->4, etc.
-
-config ELF_STACKSIZE
- int "ELF Stack Size"
- default DEFAULT_TASK_STACKSIZE
- ---help---
- This is the default stack size that will be used when starting ELF binaries.
-
-config ELF_BUFFERSIZE
- int "ELF I/O Buffer Size"
- default 32
- ---help---
- This is an I/O buffer that is used to access the ELF file. Variable length items
- will need to be read (such as symbol names). This is really just this initial
- size of the buffer; it will be reallocated as necessary to hold large symbol
- names. Default: 32
-
-config ELF_BUFFERINCR
- int "ELF I/O Buffer Realloc Increment"
- default 32
- ---help---
- This is an I/O buffer that is used to access the ELF file. Variable length items
- will need to be read (such as symbol names). This value specifies the size
- increment to use each time the buffer is reallocated. Default: 32
-
-config ELF_DUMPBUFFER
- bool "Dump ELF buffers"
- default n
- depends on DEBUG_INFO
- ---help---
- Dump various ELF buffers for debug purposes
-
-config ELF_EXIDX_SECTNAME
- string "ELF Section Name for Exception Index"
- default ".ARM.exidx"
- depends on CXX_EXCEPTION && ARCH_ARM
- ---help---
- Set the name string for the exception index section on the ELF modules to
- be loaded by the ELF binary loader.
-
- This is needed to support exception handling on loadable ELF modules.
-
-config ELF_RELOCATION_BUFFERCOUNT
- int "ELF Relocation Table Buffer Count"
- default 256
- ---help---
- This is a relocation buffer that is used to store elf relocation table to
- reduce access fs. Default: 256
-
-config ELF_SYMBOL_CACHECOUNT
- int "ELF SYMBOL Table Cache Count"
- default 256
- ---help---
- This is a cache that is used to store elf symbol table to
- reduce access fs. Default: 256
-
-config ELF_LOADTO_LMA
- bool "ELF load sections to LMA"
- default n
- ---help---
- Load all section to LMA not VMA, so the startup code(e.g. start.S) need
- relocate .data section to the final address(VMA) and zero .bss section
- by self.
diff --git a/binfmt/libelf/Make.defs b/binfmt/libelf/Make.defs
deleted file mode 100644
index 8c1a53182d..0000000000
--- a/binfmt/libelf/Make.defs
+++ /dev/null
@@ -1,41 +0,0 @@
-############################################################################
-# binfmt/libelf/Make.defs
-#
-# SPDX-License-Identifier: Apache-2.0
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership. The
-# ASF licenses this file to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance with the
-# License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-#
-############################################################################
-
-ifeq ($(CONFIG_ELF),y)
-
-# ELF library
-
-CSRCS += libelf_bind.c libelf_init.c libelf_addrenv.c libelf_iobuffer.c
-CSRCS += libelf_load.c libelf_read.c libelf_sections.c libelf_symbols.c
-CSRCS += libelf_uninit.c libelf_unload.c libelf_verify.c
-
-ifeq ($(CONFIG_BINFMT_CONSTRUCTORS),y)
-CSRCS += libelf_ctors.c libelf_dtors.c
-endif
-
-# Hook the libelf subdirectory into the build
-
-VPATH += libelf
-SUBDIRS += libelf
-DEPPATH += --dep-path libelf
-
-endif
diff --git a/binfmt/libelf/gnu-elf.ld b/binfmt/libelf/gnu-elf.ld
deleted file mode 100644
index 55e689e9fe..0000000000
--- a/binfmt/libelf/gnu-elf.ld
+++ /dev/null
@@ -1,118 +0,0 @@
-/****************************************************************************
- * binfmt/libelf/gnu-elf.ld
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-SECTIONS
-{
- .text 0x00000000 :
- {
- _stext = . ;
- *(.text)
- *(.text.*)
- *(.gnu.warning)
- *(.stub)
- *(.glue_7)
- *(.glue_7t)
- *(.jcr)
-
- /* C++ support: The .init and .fini sections contain specific logic
- * to manage static constructors and destructors.
- */
-
- *(.gnu.linkonce.t.*)
- *(.init) /* Old ABI */
- *(.fini) /* Old ABI */
- _etext = . ;
- }
-
- .rodata :
- {
- _srodata = . ;
- *(.rodata)
- *(.rodata1)
- *(.rodata.*)
- *(.gnu.linkonce.r*)
- _erodata = . ;
- }
-
- .data :
- {
- _sdata = . ;
- *(.data)
- *(.data1)
- *(.data.*)
- *(.gnu.linkonce.d*)
- . = ALIGN(4);
- _edata = . ;
- }
-
- /* C++ support. For each global and static local C++ object,
- * GCC creates a small subroutine to construct the object. Pointers
- * to these routines (not the routines themselves) are stored as
- * simple, linear arrays in the .ctors section of the object file.
- * Similarly, pointers to global/static destructor routines are
- * stored in .dtors.
- */
-
- .ctors :
- {
- _sctors = . ;
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
- KEEP(*(.init_array EXCLUDE_FILE(*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o) .ctors))
- _ectors = . ;
- }
-
- .dtors :
- {
- _sdtors = . ;
- *(.dtors) /* Old ABI: Unallocated */
- *(.fini_array) /* New ABI: Allocated */
- *(SORT(.fini_array.*))
- _edtors = . ;
- }
-
- .bss :
- {
- _sbss = . ;
- *(.bss)
- *(.bss.*)
- *(.sbss)
- *(.sbss.*)
- *(.gnu.linkonce.b*)
- *(COMMON)
- _ebss = . ;
- }
-
- /* Stabs debugging sections. */
-
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
- .comment 0 : { *(.comment) }
- .debug_abbrev 0 : { *(.debug_abbrev) }
- .debug_info 0 : { *(.debug_info) }
- .debug_line 0 : { *(.debug_line) }
- .debug_pubnames 0 : { *(.debug_pubnames) }
- .debug_aranges 0 : { *(.debug_aranges) }
-}
diff --git a/binfmt/libelf/libelf.h b/binfmt/libelf/libelf.h
deleted file mode 100644
index 57d3b525b8..0000000000
--- a/binfmt/libelf/libelf.h
+++ /dev/null
@@ -1,345 +0,0 @@
-/****************************************************************************
- * binfmt/libelf/libelf.h
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-#ifndef __BINFMT_LIBELF_LIBELF_H
-#define __BINFMT_LIBELF_LIBELF_H
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/binfmt/elf.h>
-
-/****************************************************************************
- * Public Function Prototypes
- ****************************************************************************/
-
-/****************************************************************************
- * Name: elf_verifyheader
- *
- * Description:
- * Given the header from a possible ELF executable, verify that it is
- * an ELF executable.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_verifyheader(FAR const Elf_Ehdr *header);
-
-/****************************************************************************
- * Name: elf_read
- *
- * Description:
- * Read 'readsize' bytes from the object file at 'offset'. The data is
- * read into 'buffer.' If 'buffer' is part of the ELF address environment,
- * then the caller is responsible for assuring that that address
- * environment is in place before calling this function (i.e., that
- * elf_addrenv_select() has been called if CONFIG_ARCH_ADDRENV=y).
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_read(FAR struct elf_loadinfo_s *loadinfo, FAR uint8_t *buffer,
- size_t readsize, off_t offset);
-
-/****************************************************************************
- * Name: elf_loadphdrs
- *
- * Description:
- * Loads program headers into memory.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_loadphdrs(FAR struct elf_loadinfo_s *loadinfo);
-
-/****************************************************************************
- * Name: elf_loadshdrs
- *
- * Description:
- * Loads section headers into memory.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_loadshdrs(FAR struct elf_loadinfo_s *loadinfo);
-
-/****************************************************************************
- * Name: elf_findsection
- *
- * Description:
- * A section by its name.
- *
- * Input Parameters:
- * loadinfo - Load state information
- * sectname - Name of the section to find
- *
- * Returned Value:
- * On success, the index to the section is returned; A negated errno value
- * is returned on failure.
- *
- ****************************************************************************/
-
-int elf_findsection(FAR struct elf_loadinfo_s *loadinfo,
- FAR const char *sectname);
-
-/****************************************************************************
- * Name: elf_findsymtab
- *
- * Description:
- * Find the symbol table section.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_findsymtab(FAR struct elf_loadinfo_s *loadinfo);
-
-/****************************************************************************
- * Name: elf_readsym
- *
- * Description:
- * Read the ELF symbol structure at the specified index into memory.
- *
- * Input Parameters:
- * loadinfo - Load state information
- * index - Symbol table index
- * sym - Location to return the table entry
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_readsym(FAR struct elf_loadinfo_s *loadinfo, int index,
- FAR Elf_Sym *sym);
-
-/****************************************************************************
- * Name: elf_symvalue
- *
- * Description:
- * Get the value of a symbol. The updated value of the symbol is returned
- * in the st_value field of the symbol table entry.
- *
- * Input Parameters:
- * loadinfo - Load state information
- * sym - Symbol table entry (value might be undefined)
- * exports - The symbol table to use for resolving undefined symbols.
- * nexports - Number of symbols in the symbol table.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- * EINVAL - There is something inconsistent in the symbol table (should
- * only happen if the file is corrupted)
- * ENOSYS - Symbol lies in common
- * ESRCH - Symbol has no name
- * ENOENT - Symbol undefined and not provided via a symbol table
- *
- ****************************************************************************/
-
-int elf_symvalue(FAR struct elf_loadinfo_s *loadinfo, FAR Elf_Sym *sym,
- FAR const struct symtab_s *exports, int nexports);
-
-/****************************************************************************
- * Name: elf_freebuffers
- *
- * Description:
- * Release all working buffers.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_freebuffers(FAR struct elf_loadinfo_s *loadinfo);
-
-/****************************************************************************
- * Name: elf_allocbuffer
- *
- * Description:
- * Perform the initial allocation of the I/O buffer, if it has not already
- * been allocated.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_allocbuffer(FAR struct elf_loadinfo_s *loadinfo);
-
-/****************************************************************************
- * Name: elf_reallocbuffer
- *
- * Description:
- * Increase the size of I/O buffer by the specified buffer increment.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_reallocbuffer(FAR struct elf_loadinfo_s *loadinfo, size_t increment);
-
-/****************************************************************************
- * Name: elf_findctors
- *
- * Description:
- * Find C++ static constructors.
- *
- * Input Parameters:
- * loadinfo - Load state information
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-#ifdef CONFIG_BINFMT_CONSTRUCTORS
-int elf_loadctors(FAR struct elf_loadinfo_s *loadinfo);
-#endif
-
-/****************************************************************************
- * Name: elf_loaddtors
- *
- * Description:
- * Load pointers to static destructors into an in-memory array.
- *
- * Input Parameters:
- * loadinfo - Load state information
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-#ifdef CONFIG_BINFMT_CONSTRUCTORS
-int elf_loaddtors(FAR struct elf_loadinfo_s *loadinfo);
-#endif
-
-/****************************************************************************
- * Name: elf_addrenv_alloc
- *
- * Description:
- * Allocate memory for the ELF image (textalloc and dataalloc).
- * If CONFIG_ARCH_ADDRENV=n, textalloc will be allocated using kmm_zalloc()
- * and dataalloc will be a offset from textalloc.
- * If CONFIG_ARCH_ADDRENV=y, then textalloc and dataalloc will be allocated
- * using up_addrenv_create().
- * In either case, there will be a unique instance of textalloc and
- * dataalloc (and stack) for each instance of a process.
- *
- * Input Parameters:
- * loadinfo - Load state information
- * textsize - The size (in bytes) of the .text address environment needed
- * for the ELF image (read/execute).
- * datasize - The size (in bytes) of the .bss/.data address environment
- * needed for the ELF image (read/write).
- * heapsize - The initial size (in bytes) of the heap address environment
- * needed by the task. This region may be read/write only.
- *
- * Returned Value:
- * Zero (OK) on success; a negated errno value on failure.
- *
- ****************************************************************************/
-
-int elf_addrenv_alloc(FAR struct elf_loadinfo_s *loadinfo, size_t textsize,
- size_t datasize, size_t heapsize);
-
-/****************************************************************************
- * Name: elf_addrenv_select
- *
- * Description:
- * Temporarily select the task's address environment.
- *
- * Input Parameters:
- * loadinfo - Load state information
- *
- * Returned Value:
- * Zero (OK) on success; a negated errno value on failure.
- *
- ****************************************************************************/
-
-#ifdef CONFIG_ARCH_ADDRENV
-int elf_addrenv_select(FAR struct elf_loadinfo_s *loadinfo);
-#endif
-
-/****************************************************************************
- * Name: elf_addrenv_restore
- *
- * Description:
- * Restore the address environment before elf_addrenv_select() was called..
- *
- * Input Parameters:
- * loadinfo - Load state information
- *
- * Returned Value:
- * Zero (OK) on success; a negated errno value on failure.
- *
- ****************************************************************************/
-
-#ifdef CONFIG_ARCH_ADDRENV
-int elf_addrenv_restore(FAR struct elf_loadinfo_s *loadinfo);
-#endif
-
-/****************************************************************************
- * Name: elf_addrenv_free
- *
- * Description:
- * Release the address environment previously created by
- * elf_addrenv_alloc(). This function is called only under certain error
- * conditions after the module has been loaded but not yet started.
- * After the module has been started, the address environment will
- * automatically be freed when the module exits.
- *
- * Input Parameters:
- * loadinfo - Load state information
- *
- * Returned Value:
- * None.
- *
- ****************************************************************************/
-
-void elf_addrenv_free(FAR struct elf_loadinfo_s *loadinfo);
-
-#endif /* __BINFMT_LIBELF_LIBELF_H */
diff --git a/binfmt/libelf/libelf_addrenv.c b/binfmt/libelf/libelf_addrenv.c
deleted file mode 100644
index 3f2ebe3b66..0000000000
--- a/binfmt/libelf/libelf_addrenv.c
+++ /dev/null
@@ -1,354 +0,0 @@
-/****************************************************************************
- * binfmt/libelf/libelf_addrenv.c
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <errno.h>
-#include <debug.h>
-
-#include <nuttx/addrenv.h>
-#include <nuttx/arch.h>
-#include <nuttx/kmalloc.h>
-
-#include <sys/mman.h>
-
-#include "libelf.h"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-#define ELF_TEXT_WRE (PROT_READ | PROT_WRITE | PROT_EXEC)
-#define ELF_TEXT_RE (PROT_READ | PROT_EXEC)
-
-/****************************************************************************
- * Private Constant Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: elf_addrenv_alloc
- *
- * Description:
- * Allocate memory for the ELF image (textalloc and dataalloc). If
- * CONFIG_ARCH_ADDRENV=n, textalloc will be allocated using kmm_zalloc()
- * and dataalloc will be a offset from textalloc. If
- * CONFIG_ARCH_ADDRENV=y, then textalloc and dataalloc will be allocated
- * using up_addrenv_create(). In either case, there will be a unique
- * instance of textalloc and dataalloc (and stack) for each instance of a
- * process.
- *
- * Input Parameters:
- * loadinfo - Load state information
- * textsize - The size (in bytes) of the .text address environment needed
- * for the ELF image (read/execute).
- * datasize - The size (in bytes) of the .bss/.data address environment
- * needed for the ELF image (read/write).
- * heapsize - The initial size (in bytes) of the heap address environment
- * needed by the task. This region may be read/write only.
- *
- * Returned Value:
- * Zero (OK) on success; a negated errno value on failure.
- *
- ****************************************************************************/
-
-int elf_addrenv_alloc(FAR struct elf_loadinfo_s *loadinfo, size_t textsize,
- size_t datasize, size_t heapsize)
-{
-#ifdef CONFIG_ARCH_ADDRENV
- FAR struct arch_addrenv_s *addrenv;
- FAR void *vtext;
- FAR void *vdata;
- int ret;
-
- /* Create an address environment for the new ELF task */
-
- loadinfo->addrenv = addrenv_allocate();
- if (!loadinfo->addrenv)
- {
- return -ENOMEM;
- }
-
- /* Start creating the address environment sections */
-
- addrenv = &loadinfo->addrenv->addrenv;
-
- ret = up_addrenv_create(textsize, datasize, heapsize, addrenv);
- if (ret < 0)
- {
- berr("ERROR: up_addrenv_create failed: %d\n", ret);
- goto errout_with_addrenv;
- }
-
- /* Get the virtual address associated with the start of the address
- * environment. This is the base address that we will need to use to
- * access the ELF image (but only if the address environment has been
- * selected.
- */
-
- ret = up_addrenv_vtext(addrenv, &vtext);
- if (ret < 0)
- {
- berr("ERROR: up_addrenv_vtext failed: %d\n", ret);
- goto errout_with_addrenv;
- }
-
- ret = up_addrenv_vdata(addrenv, textsize, &vdata);
- if (ret < 0)
- {
- berr("ERROR: up_addrenv_vdata failed: %d\n", ret);
- goto errout_with_addrenv;
- }
-
- loadinfo->textalloc = (uintptr_t)vtext;
- loadinfo->dataalloc = (uintptr_t)vdata;
-
- return OK;
-
-errout_with_addrenv:
- addrenv_drop(loadinfo->addrenv, false);
- return ret;
-#else
- if (loadinfo->ehdr.e_type == ET_EXEC)
- {
- return OK;
- }
-
- /* Allocate memory to hold the ELF image */
-
-# ifndef CONFIG_ARCH_USE_SEPARATED_SECTION
-# if defined(CONFIG_ARCH_USE_TEXT_HEAP)
- loadinfo->textalloc = (uintptr_t)
- up_textheap_memalign(loadinfo->textalign,
- textsize);
-# else
- loadinfo->textalloc = (uintptr_t)
- kumm_memalign(loadinfo->textalign, textsize);
-# endif
-
- if (!loadinfo->textalloc)
- {
- return -ENOMEM;
- }
-
- if (loadinfo->datasize > 0)
- {
-# ifdef CONFIG_ARCH_USE_DATA_HEAP
- loadinfo->dataalloc = (uintptr_t)
- up_dataheap_memalign(loadinfo->dataalign,
- datasize);
-# else
- loadinfo->dataalloc = (uintptr_t)
- kumm_memalign(loadinfo->dataalign, datasize);
-# endif
- if (!loadinfo->dataalloc)
- {
- return -ENOMEM;
- }
- }
-# endif
-
- return OK;
-#endif
-}
-
-/****************************************************************************
- * Name: elf_addrenv_select
- *
- * Description:
- * Temporarily select the task's address environment.
- *
- * Input Parameters:
- * loadinfo - Load state information
- *
- * Returned Value:
- * Zero (OK) on success; a negated errno value on failure.
- *
- ****************************************************************************/
-
-#ifdef CONFIG_ARCH_ADDRENV
-int elf_addrenv_select(FAR struct elf_loadinfo_s *loadinfo)
-{
- int ret;
-
- /* Instantiate the new address environment */
-
- ret = addrenv_select(loadinfo->addrenv, &loadinfo->oldenv);
- if (ret < 0)
- {
- berr("ERROR: addrenv_select failed: %d\n", ret);
- return ret;
- }
-
- /* Allow write access to .text */
-
- ret = up_addrenv_mprot(&loadinfo->addrenv->addrenv, loadinfo->textalloc,
- loadinfo->textsize, ELF_TEXT_WRE);
- if (ret < 0)
- {
- berr("ERROR: up_addrenv_text_enable_write failed: %d\n", ret);
- return ret;
- }
-
- return OK;
-}
-#endif
-
-/****************************************************************************
- * Name: elf_addrenv_restore
- *
- * Description:
- * Restore the address environment before elf_addrenv_select() was called..
- *
- * Input Parameters:
- * loadinfo - Load state information
- *
- * Returned Value:
- * Zero (OK) on success; a negated errno value on failure.
- *
- ****************************************************************************/
-
-#ifdef CONFIG_ARCH_ADDRENV
-int elf_addrenv_restore(FAR struct elf_loadinfo_s *loadinfo)
-{
- int ret;
-
- /* Remove write access to .text */
-
- ret = up_addrenv_mprot(&loadinfo->addrenv->addrenv, loadinfo->textalloc,
- loadinfo->textsize, ELF_TEXT_RE);
- if (ret < 0)
- {
- berr("ERROR: up_addrenv_text_disable_write failed: %d\n", ret);
- return ret;
- }
-
- /* Restore the old address environment */
-
- ret = addrenv_restore(loadinfo->oldenv);
- if (ret < 0)
- {
- berr("ERROR: addrenv_restore failed: %d\n", ret);
- return ret;
- }
-
- return OK;
-}
-#endif
-
-/****************************************************************************
- * Name: elf_addrenv_free
- *
- * Description:
- * Release the address environment previously created by
- * elf_addrenv_alloc(). This function is called only under certain error
- * conditions after the module has been loaded but not yet started.
- * After the module has been started, the address environment will
- * automatically be freed when the module exits.
- *
- * Input Parameters:
- * loadinfo - Load state information
- *
- * Returned Value:
- * None.
- *
- ****************************************************************************/
-
-void elf_addrenv_free(FAR struct elf_loadinfo_s *loadinfo)
-{
-#ifdef CONFIG_ARCH_ADDRENV
-
- /* Free the address environment */
-
- addrenv_drop(loadinfo->addrenv, false);
-#else
-
-# ifndef CONFIG_ARCH_USE_SEPARATED_SECTION
- if (loadinfo->textalloc != 0)
- {
-# if defined(CONFIG_ARCH_USE_TEXT_HEAP)
- up_textheap_free((FAR void *)loadinfo->textalloc);
-# else
- kumm_free((FAR void *)loadinfo->textalloc);
-# endif
- }
-
- if (loadinfo->dataalloc != 0)
- {
-# if defined(CONFIG_ARCH_USE_DATA_HEAP)
- up_dataheap_free((FAR void *)loadinfo->dataalloc);
-# else
- kumm_free((FAR void *)loadinfo->dataalloc);
-# endif
- }
-# else
- int i;
-
- for (i = 0; loadinfo->ehdr.e_type == ET_REL && i < loadinfo->ehdr.e_shnum;
- i++)
- {
- if (loadinfo->sectalloc[i] == 0)
- {
- continue;
- }
-
- if ((loadinfo->shdr[i].sh_flags & SHF_WRITE) != 0)
- {
-# if defined(CONFIG_ARCH_USE_DATA_HEAP)
- up_dataheap_free((FAR void *)loadinfo->sectalloc[i]);
-# else
- kumm_free((FAR void *)loadinfo->sectalloc[i]);
-# endif
- }
- else
- {
-# if defined(CONFIG_ARCH_USE_TEXT_HEAP)
- up_textheap_free((FAR void *)loadinfo->sectalloc[i]);
-# else
- kumm_free((FAR void *)loadinfo->sectalloc[i]);
-# endif
- }
- }
-
- kmm_free(loadinfo->sectalloc);
- loadinfo->sectalloc = 0;
-# endif
-#endif
-
- /* Clear out all indications of the allocated address environment */
-
- loadinfo->textalloc = 0;
- loadinfo->dataalloc = 0;
- loadinfo->textsize = 0;
- loadinfo->datasize = 0;
-}
diff --git a/binfmt/libelf/libelf_bind.c b/binfmt/libelf/libelf_bind.c
deleted file mode 100644
index 57ec52dcb2..0000000000
--- a/binfmt/libelf/libelf_bind.c
+++ /dev/null
@@ -1,703 +0,0 @@
-/****************************************************************************
- * binfmt/libelf/libelf_bind.c
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <inttypes.h>
-#include <stdint.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <debug.h>
-
-#include <nuttx/elf.h>
-#include <nuttx/kmalloc.h>
-#include <nuttx/binfmt/elf.h>
-
-#include "libelf.h"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/* CONFIG_DEBUG_FEATURES, CONFIG_DEBUG_INFO, and CONFIG_DEBUG_BINFMT have to
- * be defined or CONFIG_ELF_DUMPBUFFER does nothing.
- */
-
-#if !defined(CONFIG_DEBUG_INFO) || !defined (CONFIG_DEBUG_BINFMT)
-# undef CONFIG_ELF_DUMPBUFFER
-#endif
-
-#ifdef CONFIG_ELF_DUMPBUFFER
-# define elf_dumpbuffer(m,b,n) binfodumpbuffer(m,b,n)
-#else
-# define elf_dumpbuffer(m,b,n)
-#endif
-
-#ifdef ARCH_ELFDATA
-# define ARCH_ELFDATA_DEF arch_elfdata_t arch_data; \
- memset(&arch_data, 0, sizeof(arch_elfdata_t))
-# define ARCH_ELFDATA_PARM &arch_data
-#else
-# define ARCH_ELFDATA_DEF
-# define ARCH_ELFDATA_PARM NULL
-#endif
-
-/****************************************************************************
- * Private Types
- ****************************************************************************/
-
-struct elf_symcache_s
-{
- dq_entry_t entry;
- Elf_Sym sym;
- int idx;
-};
-
-typedef struct elf_symcache_s elf_symcache_t;
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: elf_readrels
- *
- * Description:
- * Read the (ELF_Rel structure * buffer count) into memory.
- *
- ****************************************************************************/
-
-static inline int elf_readrels(FAR struct elf_loadinfo_s *loadinfo,
- FAR const Elf_Shdr *relsec,
- int index, FAR Elf_Rel *rels,
- int count)
-{
- off_t offset;
- int size;
-
- /* Verify that the symbol table index lies within symbol table */
-
- if (index < 0 || index > (relsec->sh_size / sizeof(Elf_Rel)))
- {
- berr("Bad relocation symbol index: %d\n", index);
- return -EINVAL;
- }
-
- /* Get the file offset to the symbol table entry */
-
- offset = sizeof(Elf_Rel) * index;
- size = sizeof(Elf_Rel) * count;
-
- if (offset + size > relsec->sh_size)
- {
- size = relsec->sh_size - offset;
- }
-
- /* And, finally, read the symbol table entry into memory */
-
- return elf_read(loadinfo, (FAR uint8_t *)rels, size,
- relsec->sh_offset + offset);
-}
-
-/****************************************************************************
- * Name: elf_readrelas
- *
- * Description:
- * Read the (ELF_Rela structure * buffer count) into memory.
- *
- ****************************************************************************/
-
-static inline int elf_readrelas(FAR struct elf_loadinfo_s *loadinfo,
- FAR const Elf_Shdr *relsec,
- int index, FAR Elf_Rela *relas,
- int count)
-{
- off_t offset;
- int size;
-
- /* Verify that the symbol table index lies within symbol table */
-
- if (index < 0 || index > (relsec->sh_size / sizeof(Elf_Rela)))
- {
- berr("Bad relocation symbol index: %d\n", index);
- return -EINVAL;
- }
-
- /* Get the file offset to the symbol table entry */
-
- offset = sizeof(Elf_Rela) * index;
- size = sizeof(Elf_Rela) * count;
-
- if (offset + size > relsec->sh_size)
- {
- size = relsec->sh_size - offset;
- }
-
- /* And, finally, read the symbol table entry into memory */
-
- return elf_read(loadinfo, (FAR uint8_t *)relas, size,
- relsec->sh_offset + offset);
-}
-
-/****************************************************************************
- * Name: elf_relocate and elf_relocateadd
- *
- * Description:
- * Perform all relocations associated with a section.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-static int elf_relocate(FAR struct elf_loadinfo_s *loadinfo, int relidx,
- FAR const struct symtab_s *exports, int nexports)
-{
- FAR Elf_Shdr *relsec = &loadinfo->shdr[relidx];
- FAR Elf_Shdr *dstsec = &loadinfo->shdr[relsec->sh_info];
- FAR Elf_Rel *rels;
- FAR Elf_Rel *rel;
- FAR elf_symcache_t *cache;
- FAR Elf_Sym *sym;
- FAR dq_entry_t *e;
- dq_queue_t q;
- uintptr_t addr;
- int symidx;
- int ret;
- int i;
- int j;
-
- /* Define potential architecture specific elf data container */
-
- ARCH_ELFDATA_DEF;
-
- rels = kmm_malloc(CONFIG_ELF_RELOCATION_BUFFERCOUNT * sizeof(Elf_Rel));
- if (rels == NULL)
- {
- berr("Failed to allocate memory for elf relocation\n");
- return -ENOMEM;
- }
-
- dq_init(&q);
-
- /* Examine each relocation in the section. 'relsec' is the section
- * containing the relations. 'dstsec' is the section containing the data
- * to be relocated.
- */
-
- ret = OK;
-
- for (i = j = 0; i < relsec->sh_size / sizeof(Elf_Rel); i++)
- {
- /* Read the relocation entry into memory */
-
- rel = &rels[i % CONFIG_ELF_RELOCATION_BUFFERCOUNT];
-
- if (!(i % CONFIG_ELF_RELOCATION_BUFFERCOUNT))
- {
- ret = elf_readrels(loadinfo, relsec, i, rels,
- CONFIG_ELF_RELOCATION_BUFFERCOUNT);
- if (ret < 0)
- {
- berr("Section %d reloc %d: "
- "Failed to read relocation entry: %d\n",
- relidx, i, ret);
- break;
- }
- }
-
- /* Get the symbol table index for the relocation. This is contained
- * in a bit-field within the r_info element.
- */
-
- symidx = ELF_R_SYM(rel->r_info);
-
- /* First try the cache */
-
- sym = NULL;
- for (e = dq_peek(&q); e; e = dq_next(e))
- {
- cache = (FAR elf_symcache_t *)e;
- if (cache->idx == symidx)
- {
- dq_rem(&cache->entry, &q);
- dq_addfirst(&cache->entry, &q);
- sym = &cache->sym;
- break;
- }
- }
-
- /* If the symbol was not found in the cache, we will need to read the
- * symbol from the file.
- */
-
- if (sym == NULL)
- {
- if (j < CONFIG_ELF_SYMBOL_CACHECOUNT)
- {
- cache = kmm_malloc(sizeof(elf_symcache_t));
- if (!cache)
- {
- berr("Failed to allocate memory for elf symbols\n");
- ret = -ENOMEM;
- break;
- }
-
- j++;
- }
- else
- {
- cache = (FAR elf_symcache_t *)dq_remlast(&q);
- }
-
- sym = &cache->sym;
-
- /* Read the symbol table entry into memory */
-
- ret = elf_readsym(loadinfo, symidx, sym);
- if (ret < 0)
- {
- berr("Section %d reloc %d: Failed to read symbol[%d]: %d\n",
- relidx, i, symidx, ret);
- kmm_free(cache);
- break;
- }
-
- /* Get the value of the symbol (in sym.st_value) */
-
- ret = elf_symvalue(loadinfo, sym, exports, nexports);
- if (ret < 0)
- {
- /* The special error -ESRCH is returned only in one condition:
- * The symbol has no name.
- *
- * There are a few relocations for a few architectures that do
- * no depend upon a named symbol. We don't know if that is the
- * case here, but we will use a NULL symbol pointer to indicate
- * that case to up_relocate(). That function can then do what
- * is best.
- */
-
- if (ret == -ESRCH)
- {
- berr("Section %d reloc %d: "
- "Undefined symbol[%d] has no name: %d\n",
- relidx, i, symidx, ret);
- }
- else
- {
- berr("Section %d reloc %d: "
- "Failed to get value of symbol[%d]: %d\n",
- relidx, i, symidx, ret);
- kmm_free(cache);
- break;
- }
- }
-
- cache->idx = symidx;
- dq_addfirst(&cache->entry, &q);
- }
-
- if (sym->st_shndx == SHN_UNDEF && sym->st_name == 0)
- {
- sym = NULL;
- }
-
- /* Calculate the relocation address. */
-
- if (rel->r_offset < 0 ||
- rel->r_offset > dstsec->sh_size - sizeof(uint32_t))
- {
- berr("Section %d reloc %d: Relocation address out of range, "
- "offset %" PRIdPTR " size %jd\n",
- relidx, i, (uintptr_t)rel->r_offset,
- (uintmax_t)dstsec->sh_size);
- ret = -EINVAL;
- break;
- }
-
- addr = dstsec->sh_addr + rel->r_offset;
-
- /* Now perform the architecture-specific relocation */
-
- ret = up_relocate(rel, sym, addr, ARCH_ELFDATA_PARM);
- if (ret < 0)
- {
- berr("ERROR: Section %d reloc %d: Relocation failed: %d\n",
- relidx, i, ret);
- break;
- }
- }
-
- kmm_free(rels);
- while ((e = dq_peek(&q)))
- {
- dq_rem(e, &q);
- kmm_free(e);
- }
-
- return ret;
-}
-
-static int elf_relocateadd(FAR struct elf_loadinfo_s *loadinfo, int relidx,
- FAR const struct symtab_s *exports, int nexports)
-{
- FAR Elf_Shdr *relsec = &loadinfo->shdr[relidx];
- FAR Elf_Shdr *dstsec = &loadinfo->shdr[relsec->sh_info];
- FAR Elf_Rela *relas;
- FAR Elf_Rela *rela;
- FAR elf_symcache_t *cache;
- FAR Elf_Sym *sym;
- FAR dq_entry_t *e;
- dq_queue_t q;
- uintptr_t addr;
- int symidx;
- int ret;
- int i;
- int j;
-
- /* Define potential architecture specific elf data container */
-
- ARCH_ELFDATA_DEF;
-
- relas = kmm_malloc(CONFIG_ELF_RELOCATION_BUFFERCOUNT * sizeof(Elf_Rela));
- if (relas == NULL)
- {
- berr("Failed to allocate memory for elf relocation\n");
- return -ENOMEM;
- }
-
- dq_init(&q);
-
- /* Examine each relocation in the section. 'relsec' is the section
- * containing the relations. 'dstsec' is the section containing the data
- * to be relocated.
- */
-
- ret = OK;
-
- for (i = j = 0; i < relsec->sh_size / sizeof(Elf_Rela); i++)
- {
- /* Read the relocation entry into memory */
-
- rela = &relas[i % CONFIG_ELF_RELOCATION_BUFFERCOUNT];
-
- if (!(i % CONFIG_ELF_RELOCATION_BUFFERCOUNT))
- {
- ret = elf_readrelas(loadinfo, relsec, i, relas,
- CONFIG_ELF_RELOCATION_BUFFERCOUNT);
- if (ret < 0)
- {
- berr("Section %d reloc %d: "
- "Failed to read relocation entry: %d\n",
- relidx, i, ret);
- break;
- }
- }
-
- /* Get the symbol table index for the relocation. This is contained
- * in a bit-field within the r_info element.
- */
-
- symidx = ELF_R_SYM(rela->r_info);
-
- /* First try the cache */
-
- sym = NULL;
- for (e = dq_peek(&q); e; e = dq_next(e))
- {
- cache = (FAR elf_symcache_t *)e;
- if (cache->idx == symidx)
- {
- dq_rem(&cache->entry, &q);
- dq_addfirst(&cache->entry, &q);
- sym = &cache->sym;
- break;
- }
- }
-
- /* If the symbol was not found in the cache, we will need to read the
- * symbol from the file.
- */
-
- if (sym == NULL)
- {
- if (j < CONFIG_ELF_SYMBOL_CACHECOUNT)
- {
- cache = kmm_malloc(sizeof(elf_symcache_t));
- if (!cache)
- {
- berr("Failed to allocate memory for elf symbols\n");
- ret = -ENOMEM;
- break;
- }
-
- j++;
- }
- else
- {
- cache = (FAR elf_symcache_t *)dq_remlast(&q);
- }
-
- sym = &cache->sym;
-
- /* Read the symbol table entry into memory */
-
- ret = elf_readsym(loadinfo, symidx, sym);
- if (ret < 0)
- {
- berr("Section %d reloc %d: Failed to read symbol[%d]: %d\n",
- relidx, i, symidx, ret);
- kmm_free(cache);
- break;
- }
-
- /* Get the value of the symbol (in sym.st_value) */
-
- ret = elf_symvalue(loadinfo, sym, exports, nexports);
- if (ret < 0)
- {
- /* The special error -ESRCH is returned only in one condition:
- * The symbol has no name.
- *
- * There are a few relocations for a few architectures that do
- * no depend upon a named symbol. We don't know if that is the
- * case here, but we will use a NULL symbol pointer to indicate
- * that case to up_relocate(). That function can then do what
- * is best.
- */
-
- if (ret == -ESRCH)
- {
- bwarn("Section %d reloc %d: "
- "Undefined symbol[%d] has no name: %d\n",
- relidx, i, symidx, ret);
- }
- else
- {
- berr("Section %d reloc %d: "
- "Failed to get value of symbol[%d]: %d\n",
- relidx, i, symidx, ret);
- kmm_free(cache);
- break;
- }
- }
-
- cache->idx = symidx;
- dq_addfirst(&cache->entry, &q);
- }
-
- if (sym->st_shndx == SHN_UNDEF && sym->st_name == 0)
- {
- sym = NULL;
- }
-
- /* Calculate the relocation address. */
-
- if (rela->r_offset < 0 ||
- rela->r_offset > dstsec->sh_size)
- {
- berr("Section %d reloc %d: Relocation address out of range, "
- "offset %" PRIdPTR " size %jd\n",
- relidx, i, (uintptr_t)rela->r_offset,
- (uintmax_t)dstsec->sh_size);
- ret = -EINVAL;
- break;
- }
-
- addr = dstsec->sh_addr + rela->r_offset;
-
- /* Now perform the architecture-specific relocation */
-
- ret = up_relocateadd(rela, sym, addr, ARCH_ELFDATA_PARM);
- if (ret < 0)
- {
- berr("ERROR: Section %d reloc %d: Relocation failed: %d\n",
- relidx, i, ret);
- break;
- }
- }
-
- kmm_free(relas);
- while ((e = dq_peek(&q)))
- {
- dq_rem(e, &q);
- kmm_free(e);
- }
-
- return ret;
-}
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: elf_bind
- *
- * Description:
- * Bind the imported symbol names in the loaded module described by
- * 'loadinfo' using the exported symbol values provided by 'symtab'.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_bind(FAR struct elf_loadinfo_s *loadinfo,
- FAR const struct symtab_s *exports, int nexports)
-{
-#ifdef CONFIG_ARCH_ADDRENV
- int status;
-#endif
- int ret;
- int i;
-
- /* Find the symbol and string tables */
-
- ret = elf_findsymtab(loadinfo);
- if (ret < 0)
- {
- return ret;
- }
-
-#ifdef CONFIG_ARCH_ADDRENV
- /* If CONFIG_ARCH_ADDRENV=y, then the loaded ELF lies in a virtual address
- * space that may not be in place now. elf_addrenv_select() will
- * temporarily instantiate that address space.
- */
-
- ret = elf_addrenv_select(loadinfo);
- if (ret < 0)
- {
- berr("ERROR: elf_addrenv_select() failed: %d\n", ret);
- return ret;
- }
-#endif
-
- /* Process relocations in every allocated section */
-
- for (i = 1; i < loadinfo->ehdr.e_shnum; i++)
- {
- /* Get the index to the relocation section */
-
- int infosec = loadinfo->shdr[i].sh_info;
- if (infosec >= loadinfo->ehdr.e_shnum)
- {
- continue;
- }
-
- /* Make sure that the section is allocated. We can't relocated
- * sections that were not loaded into memory.
- */
-
- if ((loadinfo->shdr[infosec].sh_flags & SHF_ALLOC) == 0)
- {
- continue;
- }
-
- /* Process the relocations by type */
-
- if (loadinfo->shdr[i].sh_type == SHT_REL)
- {
- ret = elf_relocate(loadinfo, i, exports, nexports);
- }
- else if (loadinfo->shdr[i].sh_type == SHT_RELA)
- {
- ret = elf_relocateadd(loadinfo, i, exports, nexports);
- }
-
- if (ret < 0)
- {
- break;
- }
- }
-
-#if defined(CONFIG_ARCH_ADDRENV)
- /* Ensure that the I and D caches are coherent before starting the newly
- * loaded module by cleaning the D cache (i.e., flushing the D cache
- * contents to memory and invalidating the I cache).
- */
-
-#if 0 /* REVISIT... has some problems */
- up_addrenv_coherent(&loadinfo->addrenv.addrenv);
-#else
- up_coherent_dcache(loadinfo->textalloc, loadinfo->textsize);
- up_coherent_dcache(loadinfo->dataalloc, loadinfo->datasize);
-#endif
-
- /* Restore the original address environment */
-
- status = elf_addrenv_restore(loadinfo);
- if (status < 0)
- {
- berr("ERROR: elf_addrenv_restore() failed: %d\n", status);
- if (ret == OK)
- {
- ret = status;
- }
- }
-
-#else
- /* Ensure that the I and D caches are coherent before starting the newly
- * loaded module by cleaning the D cache (i.e., flushing the D cache
- * contents to memory and invalidating the I cache).
- */
-
- if (loadinfo->textsize > 0)
- {
- up_coherent_dcache(loadinfo->textalloc, loadinfo->textsize);
- }
-
- if (loadinfo->datasize > 0)
- {
- up_coherent_dcache(loadinfo->dataalloc, loadinfo->datasize);
- }
-
-# ifdef CONFIG_ARCH_USE_SEPARATED_SECTION
- for (i = 0; loadinfo->ehdr.e_type == ET_REL && i < loadinfo->ehdr.e_shnum;
- i++)
- {
- if (loadinfo->sectalloc[i] == 0)
- {
- continue;
- }
-
- up_coherent_dcache(loadinfo->sectalloc[i], loadinfo->shdr[i].sh_size);
- }
-# endif
-
-#endif
-
- return ret;
-}
diff --git a/binfmt/libelf/libelf_ctors.c b/binfmt/libelf/libelf_ctors.c
deleted file mode 100644
index 129f61cd99..0000000000
--- a/binfmt/libelf/libelf_ctors.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/****************************************************************************
- * binfmt/libelf/libelf_ctors.c
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <inttypes.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <debug.h>
-
-#include <nuttx/kmalloc.h>
-#include <nuttx/binfmt/elf.h>
-
-#include "libelf.h"
-
-#ifdef CONFIG_BINFMT_CONSTRUCTORS
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Constant Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: elf_loadctors
- *
- * Description:
- * Load pointers to static constructors into an in-memory array.
- *
- * Input Parameters:
- * loadinfo - Load state information
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_loadctors(FAR struct elf_loadinfo_s *loadinfo)
-{
- FAR Elf_Shdr *shdr;
- size_t ctorsize;
- int ctoridx;
- int ret;
- int i;
-
- DEBUGASSERT(loadinfo->ctors == NULL);
-
- /* Find the index to the section named ".ctors." NOTE: On old ABI system,
- * .ctors is the name of the section containing the list of constructors;
- * On newer systems, the similar section is called .init_array. It is
- * expected that the linker script will force the section name to be
- * ".ctors" in either case.
- */
-
- ctoridx = elf_findsection(loadinfo, ".ctors");
- if (ctoridx < 0)
- {
- /* This may not be a failure. -ENOENT indicates that the file has no
- * static constructor section.
- */
-
- binfo("elf_findsection .ctors section failed: %d\n", ctoridx);
- return ctoridx == -ENOENT ? OK : ctoridx;
- }
-
- /* Now we can get a pointer to the .ctor section in the section header
- * table.
- */
-
- shdr = &loadinfo->shdr[ctoridx];
-
- /* Get the size of the .ctor section and the number of constructors that
- * will need to be called.
- */
-
- ctorsize = shdr->sh_size;
- loadinfo->nctors = ctorsize / sizeof(binfmt_ctor_t);
-
- binfo("ctoridx=%d ctorsize=%zd sizeof(binfmt_ctor_t)=%zd nctors=%d\n",
- ctoridx, ctorsize, sizeof(binfmt_ctor_t), loadinfo->nctors);
-
- /* Check if there are any constructors. It is not an error if there
- * are none.
- */
-
- if (loadinfo->nctors > 0)
- {
- /* Check an assumption that we made above */
-
- DEBUGASSERT(shdr->sh_size == loadinfo->nctors * sizeof(binfmt_ctor_t));
-
- /* In the old ABI, the .ctors section is not allocated. In that case,
- * we need to allocate memory to hold the .ctors and then copy the
- * from the file into the allocated memory.
- *
- * SHF_ALLOC indicates that the section requires memory during
- * execution.
- */
-
- if ((shdr->sh_flags & SHF_ALLOC) == 0)
- {
- /* Allocate memory to hold a copy of the .ctor section */
-
- loadinfo->ctoralloc = kumm_malloc(ctorsize);
- if (!loadinfo->ctoralloc)
- {
- berr("Failed to allocate memory for .ctors\n");
- return -ENOMEM;
- }
-
- loadinfo->ctors = (binfmt_ctor_t *)loadinfo->ctoralloc;
-
- /* Read the section header table into memory */
-
- ret = elf_read(loadinfo, (FAR uint8_t *)loadinfo->ctors, ctorsize,
- shdr->sh_offset);
- if (ret < 0)
- {
- berr("Failed to allocate .ctors: %d\n", ret);
- return ret;
- }
-
- /* Fix up all of the .ctor addresses. Since the addresses
- * do not lie in allocated memory, there will be no relocation
- * section for them.
- */
-
- for (i = 0; i < loadinfo->nctors; i++)
- {
- FAR uintptr_t *ptr = (FAR uintptr_t *)
- ((FAR void *)(&loadinfo->ctors)[i]);
-
- binfo("ctor %d: "
- "%08" PRIxPTR " + %08" PRIxPTR " = %08" PRIxPTR "\n", i,
- *ptr, loadinfo->textalloc, (*ptr + loadinfo->textalloc));
-
- *ptr += loadinfo->textalloc;
- }
- }
- else
- {
- /* Save the address of the .ctors (actually, .init_array) where
- * it was loaded into memory. Since the .ctors lie in allocated
- * memory, they will be relocated via the normal mechanism.
- */
-
- loadinfo->ctors = (binfmt_ctor_t *)shdr->sh_addr;
- }
- }
-
- return OK;
-}
-
-#endif /* CONFIG_BINFMT_CONSTRUCTORS */
diff --git a/binfmt/libelf/libelf_dtors.c b/binfmt/libelf/libelf_dtors.c
deleted file mode 100644
index 8ec86982ff..0000000000
--- a/binfmt/libelf/libelf_dtors.c
+++ /dev/null
@@ -1,194 +0,0 @@
-/****************************************************************************
- * binfmt/libelf/libelf_dtors.c
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <inttypes.h>
-#include <stdint.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <debug.h>
-
-#include <nuttx/kmalloc.h>
-#include <nuttx/binfmt/elf.h>
-
-#include "libelf.h"
-
-#ifdef CONFIG_BINFMT_CONSTRUCTORS
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Constant Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: elf_loaddtors
- *
- * Description:
- * Load pointers to static destructors into an in-memory array.
- *
- * Input Parameters:
- * loadinfo - Load state information
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_loaddtors(FAR struct elf_loadinfo_s *loadinfo)
-{
- FAR Elf_Shdr *shdr;
- size_t dtorsize;
- int dtoridx;
- int ret;
- int i;
-
- DEBUGASSERT(loadinfo->dtors == NULL);
-
- /* Find the index to the section named ".dtors." NOTE: On old ABI system,
- * .dtors is the name of the section containing the list of destructors;
- * On newer systems, the similar section is called .fini_array. It is
- * expected that the linker script will force the section name to be
- * ".dtors" in either case.
- */
-
- dtoridx = elf_findsection(loadinfo, ".dtors");
- if (dtoridx < 0)
- {
- /* This may not be a failure. -ENOENT indicates that the file has no
- * static destructor section.
- */
-
- binfo("elf_findsection .dtors section failed: %d\n", dtoridx);
- return dtoridx == -ENOENT ? OK : dtoridx;
- }
-
- /* Now we can get a pointer to the .dtor section in the section header
- * table.
- */
-
- shdr = &loadinfo->shdr[dtoridx];
-
- /* Get the size of the .dtor section and the number of destructors that
- * will need to be called.
- */
-
- dtorsize = shdr->sh_size;
- loadinfo->ndtors = dtorsize / sizeof(binfmt_dtor_t);
-
- binfo("dtoridx=%d dtorsize=%d sizeof(binfmt_dtor_t)=%d ndtors=%d\n",
- dtoridx, dtorsize, sizeof(binfmt_dtor_t), loadinfo->ndtors);
-
- /* Check if there are any destructors. It is not an error if there
- * are none.
- */
-
- if (loadinfo->ndtors > 0)
- {
- /* Check an assumption that we made above */
-
- DEBUGASSERT(shdr->sh_size == loadinfo->ndtors * sizeof(binfmt_dtor_t));
-
- /* In the old ABI, the .dtors section is not allocated. In that case,
- * we need to allocate memory to hold the .dtors and then copy the
- * from the file into the allocated memory.
- *
- * SHF_ALLOC indicates that the section requires memory during
- * execution.
- */
-
- if ((shdr->sh_flags & SHF_ALLOC) == 0)
- {
- /* Allocate memory to hold a copy of the .dtor section */
-
- loadinfo->dtoralloc = kumm_malloc(dtorsize);
- if (!loadinfo->dtoralloc)
- {
- berr("Failed to allocate memory for .dtors\n");
- return -ENOMEM;
- }
-
- loadinfo->dtors = (binfmt_dtor_t *)loadinfo->dtoralloc;
-
- /* Read the section header table into memory */
-
- ret = elf_read(loadinfo, (FAR uint8_t *)loadinfo->dtors, dtorsize,
- shdr->sh_offset);
- if (ret < 0)
- {
- berr("Failed to allocate .dtors: %d\n", ret);
- return ret;
- }
-
- /* Fix up all of the .dtor addresses. Since the addresses
- * do not lie in allocated memory, there will be no relocation
- * section for them.
- */
-
- for (i = 0; i < loadinfo->ndtors; i++)
- {
- FAR uintptr_t *ptr = (FAR uintptr_t *)
- ((FAR void *)(&loadinfo->dtors)[i]);
-
- binfo("dtor %d: "
- "%08" PRIxPTR " + %08" PRIxPTR " = %08" PRIxPTR "\n", i,
- *ptr, loadinfo->textalloc, (*ptr + loadinfo->textalloc));
-
- *ptr += loadinfo->textalloc;
- }
- }
- else
- {
- /* Save the address of the .dtors (actually, .init_array) where
- * it was loaded into memory. Since the .dtors lie in allocated
- * memory, they will be relocated via the normal mechanism.
- */
-
- loadinfo->dtors = (binfmt_dtor_t *)shdr->sh_addr;
- }
- }
-
- return OK;
-}
-
-#endif /* CONFIG_BINFMT_CONSTRUCTORS */
diff --git a/binfmt/libelf/libelf_init.c b/binfmt/libelf/libelf_init.c
deleted file mode 100644
index d6e0e05d41..0000000000
--- a/binfmt/libelf/libelf_init.c
+++ /dev/null
@@ -1,178 +0,0 @@
-/****************************************************************************
- * binfmt/libelf/libelf_init.c
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <sys/stat.h>
-
-#include <stdint.h>
-#include <string.h>
-#include <fcntl.h>
-#include <debug.h>
-#include <errno.h>
-
-#include <nuttx/fs/fs.h>
-#include <nuttx/binfmt/elf.h>
-
-#include "libelf.h"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/* CONFIG_DEBUG_FEATURES, CONFIG_DEBUG_INFO, and CONFIG_DEBUG_BINFMT have to
- * be defined or CONFIG_ELF_DUMPBUFFER does nothing.
- */
-
-#if !defined(CONFIG_DEBUG_INFO) || !defined(CONFIG_DEBUG_BINFMT)
-# undef CONFIG_ELF_DUMPBUFFER
-#endif
-
-#ifdef CONFIG_ELF_DUMPBUFFER
-# define elf_dumpbuffer(m,b,n) binfodumpbuffer(m,b,n)
-#else
-# define elf_dumpbuffer(m,b,n)
-#endif
-
-/****************************************************************************
- * Private Constant Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: elf_fileinfo
- *
- * Description:
- * Get some stats info of the ELF file
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-static inline int elf_fileinfo(FAR struct elf_loadinfo_s *loadinfo)
-{
- struct stat buf;
- int ret;
-
- /* Get the file stats */
-
- ret = file_fstat(&loadinfo->file, &buf);
- if (ret < 0)
- {
- berr("Failed to stat file: %d\n", ret);
- return ret;
- }
-
- /* Return some stats info of the file in the loadinfo structure */
-
- loadinfo->filelen = buf.st_size;
- loadinfo->fileuid = buf.st_uid;
- loadinfo->filegid = buf.st_gid;
- loadinfo->filemode = buf.st_mode;
- return OK;
-}
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: elf_init
- *
- * Description:
- * This function is called to configure the library to process an ELF
- * program binary.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_init(FAR const char *filename, FAR struct elf_loadinfo_s *loadinfo)
-{
- int ret;
-
- binfo("filename: %s loadinfo: %p\n", filename, loadinfo);
-
- /* Clear the load info structure */
-
- memset(loadinfo, 0, sizeof(struct elf_loadinfo_s));
-
- /* Open the binary file for reading (only) */
-
- ret = file_open(&loadinfo->file, filename, O_RDONLY | O_CLOEXEC);
- if (ret < 0)
- {
- berr("Failed to open ELF binary %s: %d\n", filename, ret);
- return ret;
- }
-
- /* Get some stats info of the file. */
-
- ret = elf_fileinfo(loadinfo);
- if (ret < 0)
- {
- berr("elf_fileinfo failed: %d\n", ret);
- return ret;
- }
-
- /* Read the ELF ehdr from offset 0 */
-
- ret = elf_read(loadinfo, (FAR uint8_t *)&loadinfo->ehdr,
- sizeof(Elf_Ehdr), 0);
- if (ret < 0)
- {
- berr("Failed to read ELF header: %d\n", ret);
- return ret;
- }
-
- elf_dumpbuffer("ELF header", (FAR const uint8_t *)&loadinfo->ehdr,
- sizeof(Elf_Ehdr));
-
- /* Verify the ELF header */
-
- ret = elf_verifyheader(&loadinfo->ehdr);
- if (ret < 0)
- {
- /* This may not be an error because we will be called to attempt
- * loading EVERY binary. If elf_verifyheader() does not recognize
- * the ELF header, it will -ENOEXEC which simply informs the system
- * that the file is not an ELF file. elf_verifyheader() will return
- * other errors if the ELF header is not correctly formed.
- */
-
- berr("Bad ELF header: %d\n", ret);
- return ret;
- }
-
- return OK;
-}
diff --git a/binfmt/libelf/libelf_iobuffer.c b/binfmt/libelf/libelf_iobuffer.c
deleted file mode 100644
index fbdf8b89dd..0000000000
--- a/binfmt/libelf/libelf_iobuffer.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/****************************************************************************
- * binfmt/libelf/libelf_iobuffer.c
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <debug.h>
-#include <errno.h>
-
-#include <nuttx/kmalloc.h>
-#include <nuttx/binfmt/elf.h>
-
-#include "libelf.h"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Constant Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: elf_allocbuffer
- *
- * Description:
- * Perform the initial allocation of the I/O buffer, if it has not already
- * been allocated.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_allocbuffer(FAR struct elf_loadinfo_s *loadinfo)
-{
- /* Has a buffer been allocated? */
-
- if (!loadinfo->iobuffer)
- {
- /* No.. allocate one now */
-
- loadinfo->iobuffer = kmm_malloc(CONFIG_ELF_BUFFERSIZE);
- if (!loadinfo->iobuffer)
- {
- berr("Failed to allocate an I/O buffer\n");
- return -ENOMEM;
- }
-
- loadinfo->buflen = CONFIG_ELF_BUFFERSIZE;
- }
-
- return OK;
-}
-
-/****************************************************************************
- * Name: elf_reallocbuffer
- *
- * Description:
- * Increase the size of I/O buffer by the specified buffer increment.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_reallocbuffer(FAR struct elf_loadinfo_s *loadinfo, size_t increment)
-{
- FAR void *buffer;
- size_t newsize;
-
- /* Get the new size of the allocation */
-
- newsize = loadinfo->buflen + increment;
-
- /* And perform the reallocation */
-
- buffer = kmm_realloc(loadinfo->iobuffer, newsize);
- if (!buffer)
- {
- berr("Failed to reallocate the I/O buffer\n");
- return -ENOMEM;
- }
-
- /* Save the new buffer info */
-
- loadinfo->iobuffer = buffer;
- loadinfo->buflen = newsize;
- return OK;
-}
diff --git a/binfmt/libelf/libelf_load.c b/binfmt/libelf/libelf_load.c
deleted file mode 100644
index 1ffade84e2..0000000000
--- a/binfmt/libelf/libelf_load.c
+++ /dev/null
@@ -1,552 +0,0 @@
-/****************************************************************************
- * binfmt/libelf/libelf_load.c
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <sys/param.h>
-#include <sys/types.h>
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <assert.h>
-#include <errno.h>
-#include <debug.h>
-
-#include <nuttx/arch.h>
-#include <nuttx/addrenv.h>
-#include <nuttx/elf.h>
-#include <nuttx/binfmt/elf.h>
-
-#include "libelf.h"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-#define ELF_ALIGN_MASK ((1 << CONFIG_ELF_ALIGN_LOG2) - 1)
-#define ELF_ALIGNUP(a) (((unsigned long)(a) + ELF_ALIGN_MASK) & ~ELF_ALIGN_MASK)
-#define ELF_ALIGNDOWN(a) ((unsigned long)(a) & ~ELF_ALIGN_MASK)
-
-/* _ALIGN_UP: 'a' is assumed to be a power of two */
-
-#define _ALIGN_UP(v, a) (((v) + ((a) - 1)) & ~((a) - 1))
-
-/****************************************************************************
- * Private Constant Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-#if defined(CONFIG_ARCH_USE_SEPARATED_SECTION) && !defined(CONFIG_ARCH_ADDRENV)
-static int elf_section_alloc(FAR struct elf_loadinfo_s *loadinfo,
- FAR Elf_Shdr *shdr, uint8_t idx)
-{
- if (loadinfo->ehdr.e_type != ET_REL)
- {
- return -EINVAL;
- }
-
- if (loadinfo->sectalloc == NULL)
- {
- /* Allocate memory info for all sections */
-
- loadinfo->sectalloc = kmm_zalloc(sizeof(uintptr_t) *
- loadinfo->ehdr.e_shnum);
- if (loadinfo->sectalloc == NULL)
- {
- return -ENOMEM;
- }
- }
-
- elf_sectname(loadinfo, shdr);
- if ((shdr->sh_flags & SHF_WRITE) != 0)
- {
-# ifdef CONFIG_ARCH_USE_DATA_HEAP
- loadinfo->sectalloc[idx] = (uintptr_t)
- up_dataheap_memalign(
- (FAR const char *)loadinfo->iobuffer,
- shdr->sh_addralign,
- shdr->sh_size);
-# else
- loadinfo->sectalloc[idx] = (uintptr_t)kumm_memalign(shdr->sh_addralign,
- shdr->sh_size);
-# endif
-
- if (loadinfo->dataalloc == 0)
- {
- loadinfo->dataalloc = loadinfo->sectalloc[idx];
- }
- }
- else
- {
-# ifdef CONFIG_ARCH_USE_TEXT_HEAP
- loadinfo->sectalloc[idx] = (uintptr_t)
- up_textheap_memalign(
- (FAR const char *)loadinfo->iobuffer,
- shdr->sh_addralign,
- shdr->sh_size);
-# else
- loadinfo->sectalloc[idx] = (uintptr_t)kumm_memalign(shdr->sh_addralign,
- shdr->sh_size);
-# endif
-
- if (loadinfo->textalloc == 0)
- {
- loadinfo->textalloc = loadinfo->sectalloc[idx];
- }
- }
-
- return OK;
-}
-#endif
-
-/****************************************************************************
- * Name: elf_elfsize
- *
- * Description:
- * Calculate total memory allocation for the ELF file.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-static void elf_elfsize(FAR struct elf_loadinfo_s *loadinfo)
-{
- size_t textsize = 0;
- size_t datasize = 0;
- int i;
-
- /* Accumulate the size each section into memory that is marked SHF_ALLOC */
-
- for (i = 0; i < loadinfo->ehdr.e_shnum; i++)
- {
- FAR Elf_Shdr *shdr = &loadinfo->shdr[i];
-
- /* SHF_ALLOC indicates that the section requires memory during
- * execution.
- */
-
- if ((shdr->sh_flags & SHF_ALLOC) != 0)
- {
- /* SHF_WRITE indicates that the section address space is write-
- * able
- */
-
- if ((shdr->sh_flags & SHF_WRITE) != 0
-#ifdef CONFIG_ARCH_HAVE_TEXT_HEAP_WORD_ALIGNED_READ
- || (shdr->sh_flags & SHF_EXECINSTR) == 0
-#endif
- )
- {
-#if defined(CONFIG_ARCH_USE_SEPARATED_SECTION) && !defined(CONFIG_ARCH_ADDRENV)
- if (elf_section_alloc(loadinfo, shdr, i) >= 0)
- {
- continue;
- }
-#endif
-
- datasize = _ALIGN_UP(datasize, shdr->sh_addralign);
- datasize += ELF_ALIGNUP(shdr->sh_size);
- if (loadinfo->dataalign < shdr->sh_addralign)
- {
- loadinfo->dataalign = shdr->sh_addralign;
- }
- }
- else
- {
-#if defined(CONFIG_ARCH_USE_SEPARATED_SECTION) && !defined(CONFIG_ARCH_ADDRENV)
- if (elf_section_alloc(loadinfo, shdr, i) >= 0)
- {
- continue;
- }
-#endif
-
- textsize = _ALIGN_UP(textsize, shdr->sh_addralign);
- textsize += ELF_ALIGNUP(shdr->sh_size);
- if (loadinfo->textalign < shdr->sh_addralign)
- {
- loadinfo->textalign = shdr->sh_addralign;
- }
- }
- }
- }
-
- /* Save the allocation size */
-
- loadinfo->textsize = textsize;
- loadinfo->datasize = datasize;
-}
-
-#ifdef CONFIG_ELF_LOADTO_LMA
-/****************************************************************************
- * Name: elf_vma2lma
- *
- * Description:
- * Convert section`s VMA to LMA according to PhysAddr(p_paddr) of
- * Program Header.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-static int elf_vma2lma(FAR struct elf_loadinfo_s *loadinfo,
- FAR Elf_Shdr *shdr, FAR Elf_Addr *lma)
-{
- int i;
-
- for (i = 0; i < loadinfo->ehdr.e_phnum; i++)
- {
- FAR Elf_Phdr *phdr = &loadinfo->phdr[i];
-
- if (shdr->sh_addr >= phdr->p_vaddr &&
- shdr->sh_addr < phdr->p_vaddr + phdr->p_memsz)
- {
- *lma = phdr->p_paddr + shdr->sh_addr - phdr->p_vaddr;
- return 0;
- }
- }
-
- return -ENOENT;
-}
-#endif
-
-/****************************************************************************
- * Name: elf_loadfile
- *
- * Description:
- * Read the section data into memory. Section addresses in the shdr[] are
- * updated to point to the corresponding position in the memory.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-static inline int elf_loadfile(FAR struct elf_loadinfo_s *loadinfo)
-{
- FAR uint8_t *text = (FAR uint8_t *)loadinfo->textalloc;
- FAR uint8_t *data = (FAR uint8_t *)loadinfo->dataalloc;
- FAR uint8_t **pptr = NULL;
- int ret;
- int i;
-
- /* Read each section into memory that is marked SHF_ALLOC + SHT_NOBITS */
-
- binfo("Loaded sections:\n");
-
- for (i = 0; i < loadinfo->ehdr.e_shnum; i++)
- {
- FAR Elf_Shdr *shdr = &loadinfo->shdr[i];
-
-#ifdef CONFIG_ARCH_USE_SEPARATED_SECTION
- if (loadinfo->ehdr.e_type == ET_REL)
- {
- pptr = (FAR uint8_t **)&loadinfo->sectalloc[i];
- }
- else
-#endif
-
- /* SHF_WRITE indicates that the section address space is write-
- * able
- */
-
- if ((shdr->sh_flags & SHF_WRITE) != 0
-#ifdef CONFIG_ARCH_HAVE_TEXT_HEAP_WORD_ALIGNED_READ
- || (shdr->sh_flags & SHF_EXECINSTR) == 0
-#endif
- )
- {
- pptr = &data;
- }
- else
- {
- pptr = &text;
- }
-
- /* SHF_ALLOC indicates that the section requires memory during
- * execution.
- */
-
- if ((shdr->sh_flags & SHF_ALLOC) == 0)
- {
- /* Set the VMA regardless, some relocations might depend on this */
-
- shdr->sh_addr = (uintptr_t)*pptr;
- continue;
- }
-
- if (*pptr == NULL)
- {
- if (shdr->sh_type != SHT_NOBITS)
- {
- Elf_Addr addr = shdr->sh_addr;
-
-#ifdef CONFIG_ELF_LOADTO_LMA
- ret = elf_vma2lma(loadinfo, shdr, &addr);
- if (ret < 0)
- {
- berr("ERROR: Failed to convert addr %d: %d\n", i, ret);
- return ret;
- }
-#endif
-
- /* Read the section data from sh_offset to specified region */
-
- ret = elf_read(loadinfo, (FAR uint8_t *)addr,
- shdr->sh_size, shdr->sh_offset);
- if (ret < 0)
- {
- berr("ERROR: Failed to read section %d: %d\n", i, ret);
- return ret;
- }
- }
-
-#ifndef CONFIG_ELF_LOADTO_LMA
- /* If there is no data in an allocated section, then the
- * allocated section must be cleared.
- */
-
- else
- {
- memset((FAR uint8_t *)shdr->sh_addr, 0, shdr->sh_size);
- }
-#endif
-
- continue;
- }
-
-#ifndef CONFIG_ARCH_USE_SEPARATED_SECTION
- *pptr = (FAR uint8_t *)_ALIGN_UP((uintptr_t)*pptr, shdr->sh_addralign);
-#endif
-
- /* SHT_NOBITS indicates that there is no data in the file for the
- * section.
- */
-
- if (shdr->sh_type != SHT_NOBITS)
- {
- /* Read the section data from sh_offset to the memory region */
-
- ret = elf_read(loadinfo, *pptr, shdr->sh_size, shdr->sh_offset);
- if (ret < 0)
- {
- berr("ERROR: Failed to read section %d: %d\n", i, ret);
- return ret;
- }
- }
-
- /* If there is no data in an allocated section, then the allocated
- * section must be cleared.
- */
-
- else
- {
- memset(*pptr, 0, shdr->sh_size);
- }
-
- /* Update sh_addr to point to copy in memory */
-
- binfo("%d. %08lx->%08lx\n", i,
- (unsigned long)shdr->sh_addr, (unsigned long)*pptr);
-
- shdr->sh_addr = (uintptr_t)*pptr;
-
-#ifdef CONFIG_ARCH_USE_SEPARATED_SECTION
- if (loadinfo->ehdr.e_type != ET_REL)
- {
- *pptr += ELF_ALIGNUP(shdr->sh_size);
- }
-#else
- /* Setup the memory pointer for the next time through the loop */
-
- *pptr += ELF_ALIGNUP(shdr->sh_size);
-#endif
- }
-
- return OK;
-}
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: elf_load
- *
- * Description:
- * Loads the binary into memory, allocating memory, performing relocations
- * and initializing the data and bss segments.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_load(FAR struct elf_loadinfo_s *loadinfo)
-{
- /* Determine the heapsize to allocate. heapsize is ignored if there is
- * no address environment because the heap is a shared resource in that
- * case. If there is no dynamic stack then heapsize must at least as big
- * as the fixed stack size since the stack will be allocated from the heap
- * in that case.
- */
-
-#if !defined(CONFIG_ARCH_ADDRENV)
- size_t heapsize = 0;
-#elif defined(CONFIG_ARCH_STACK_DYNAMIC)
- size_t heapsize = ARCH_HEAP_SIZE;
-#else
- size_t heapsize = MAX(ARCH_HEAP_SIZE, CONFIG_ELF_STACKSIZE);
-#endif
-#ifdef CONFIG_ELF_EXIDX_SECTNAME
- int exidx;
-#endif
- int ret;
-
- binfo("loadinfo: %p\n", loadinfo);
- DEBUGASSERT(loadinfo && loadinfo->file.f_inode);
-
- /* Load program headers into memory */
-
- ret = elf_loadphdrs(loadinfo);
- if (ret < 0)
- {
- berr("ERROR: elf_loadphdrs failed: %d\n", ret);
- goto errout_with_buffers;
- }
-
- /* Load section headers into memory */
-
- ret = elf_loadshdrs(loadinfo);
- if (ret < 0)
- {
- berr("ERROR: elf_loadshdrs failed: %d\n", ret);
- goto errout_with_buffers;
- }
-
- /* Determine total size to allocate */
-
- elf_elfsize(loadinfo);
-
- /* Allocate (and zero) memory for the ELF file. */
-
- ret = elf_addrenv_alloc(loadinfo, loadinfo->textsize, loadinfo->datasize,
- heapsize);
- if (ret < 0)
- {
- berr("ERROR: elf_addrenv_alloc() failed: %d\n", ret);
- goto errout_with_buffers;
- }
-
-#ifdef CONFIG_ARCH_ADDRENV
- /* If CONFIG_ARCH_ADDRENV=y, then the loaded ELF lies in a virtual address
- * space that may not be in place now. elf_addrenv_select() will
- * temporarily instantiate that address space.
- */
-
- ret = elf_addrenv_select(loadinfo);
- if (ret < 0)
- {
- berr("ERROR: elf_addrenv_select() failed: %d\n", ret);
- goto errout_with_buffers;
- }
-#endif
-
- /* Load ELF section data into memory */
-
- ret = elf_loadfile(loadinfo);
- if (ret < 0)
- {
- berr("ERROR: elf_loadfile failed: %d\n", ret);
- goto errout_with_addrenv;
- }
-
- /* Load static constructors and destructors. */
-
-#ifdef CONFIG_BINFMT_CONSTRUCTORS
- ret = elf_loadctors(loadinfo);
- if (ret < 0)
- {
- berr("ERROR: elf_loadctors failed: %d\n", ret);
- goto errout_with_addrenv;
- }
-
- ret = elf_loaddtors(loadinfo);
- if (ret < 0)
- {
- berr("ERROR: elf_loaddtors failed: %d\n", ret);
- goto errout_with_addrenv;
- }
-#endif
-
-#ifdef CONFIG_ELF_EXIDX_SECTNAME
- exidx = elf_findsection(loadinfo, CONFIG_ELF_EXIDX_SECTNAME);
- if (exidx < 0)
- {
- binfo("elf_findsection: Exception Index section not found: %d\n",
- exidx);
- }
- else
- {
- up_init_exidx(loadinfo->shdr[exidx].sh_addr,
- loadinfo->shdr[exidx].sh_size);
- }
-#endif
-
-#ifdef CONFIG_ARCH_ADDRENV
- /* Restore the original address environment */
-
- ret = elf_addrenv_restore(loadinfo);
- if (ret < 0)
- {
- berr("ERROR: elf_addrenv_restore() failed: %d\n", ret);
- goto errout_with_buffers;
- }
-#endif
-
- return OK;
-
- /* Error exits */
-
-errout_with_addrenv:
-#ifdef CONFIG_ARCH_ADDRENV
- elf_addrenv_restore(loadinfo);
-#endif
-
-errout_with_buffers:
- elf_unload(loadinfo);
- return ret;
-}
diff --git a/binfmt/libelf/libelf_read.c b/binfmt/libelf/libelf_read.c
deleted file mode 100644
index 1ada634650..0000000000
--- a/binfmt/libelf/libelf_read.c
+++ /dev/null
@@ -1,188 +0,0 @@
-/****************************************************************************
- * binfmt/libelf/libelf_read.c
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <sys/types.h>
-#include <inttypes.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <string.h>
-#include <debug.h>
-#include <errno.h>
-
-#include <nuttx/fs/fs.h>
-#include <nuttx/binfmt/elf.h>
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-#undef ELF_DUMP_READDATA /* Define to dump all file data read */
-
-/****************************************************************************
- * Private Constant Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: elf_dumpreaddata
- ****************************************************************************/
-
-#ifdef ELF_DUMP_READDATA
-static inline void elf_dumpreaddata(FAR char *buffer, size_t buflen)
-{
- FAR uint32_t *buf32 = (FAR uint32_t *)buffer;
- size_t i;
- size_t j;
-
- for (i = 0; i < buflen; i += 32)
- {
- syslog(LOG_DEBUG, "%04zx:", i);
- for (j = 0; j < 32; j += sizeof(uint32_t))
- {
- syslog(LOG_DEBUG, " %08" PRIx32, *buf32++);
- }
-
- syslog(LOG_DEBUG, "\n");
- }
-}
-#else
-# define elf_dumpreaddata(b,n)
-#endif
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: elf_read
- *
- * Description:
- * Read 'readsize' bytes from the object file at 'offset'. The data is
- * read into 'buffer.' If 'buffer' is part of the ELF address environment,
- * then the caller is responsible for assuring that that address
- * environment is in place before calling this function (i.e., that
- * elf_addrenv_select() has been called if CONFIG_ARCH_ADDRENV=y).
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_read(FAR struct elf_loadinfo_s *loadinfo, FAR uint8_t *buffer,
- size_t readsize, off_t offset)
-{
- size_t nsize = readsize; /* Bytes to read from the object file */
- ssize_t nbytes; /* Number of bytes read */
- off_t rpos; /* Position returned by lseek */
- int ret = OK; /* Return value */
-
-#ifdef CONFIG_ARCH_USE_COPY_SECTION
- FAR uint8_t *dest = buffer; /* Destination address - `buffer` */
-
- /* Redirect `buffer` to temporary allocated memory */
-
- buffer = kmm_malloc(readsize);
- if (buffer == NULL)
- {
- berr("ERROR: Failed to allocate memory\n");
- return -ENOMEM;
- }
-#endif
-
- binfo("Read %zu bytes from offset %" PRIdOFF "\n", readsize, offset);
-
- /* Loop until all of the requested data has been read. */
-
- while (readsize > 0)
- {
- /* Seek to the next read position */
-
- rpos = file_seek(&loadinfo->file, offset, SEEK_SET);
- if (rpos != offset)
- {
- berr("Failed to seek to position %" PRIdOFF ": %" PRIdOFF "\n",
- offset, rpos);
- ret = rpos;
- goto errout;
- }
-
- /* Read the file data at offset into the user buffer */
-
- nbytes = file_read(&loadinfo->file,
- buffer + nsize - readsize, readsize);
- if (nbytes < 0)
- {
- /* EINTR just means that we received a signal */
-
- if (nbytes != -EINTR)
- {
- berr("Read from offset %" PRIdOFF " failed: %zd\n",
- offset, nbytes);
- ret = nbytes;
- goto errout;
- }
- }
- else if (nbytes == 0)
- {
- berr("Unexpected end of file\n");
- ret = -ENODATA;
- goto errout;
- }
- else
- {
- readsize -= nbytes;
- offset += nbytes;
- }
- }
-
-#ifdef CONFIG_ARCH_USE_COPY_SECTION
- /* Copy the requested data from temporary memory to destination */
-
- ret = up_copy_section(dest, buffer, nsize);
- if (ret < 0)
- {
- berr("ERROR: Failed to copy section at offset %"PRIdOFF"\n", offset);
- goto errout;
- }
-#endif
-
- elf_dumpreaddata(buffer, nsize);
-
-errout:
-#ifdef CONFIG_ARCH_USE_COPY_SECTION
- /* Free the temporary memory */
-
- kmm_free(buffer);
-#endif
-
- return ret;
-}
diff --git a/binfmt/libelf/libelf_sections.c b/binfmt/libelf/libelf_sections.c
deleted file mode 100644
index d7d5ff16e0..0000000000
--- a/binfmt/libelf/libelf_sections.c
+++ /dev/null
@@ -1,342 +0,0 @@
-/****************************************************************************
- * binfmt/libelf/libelf_sections.c
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#include <errno.h>
-#include <debug.h>
-
-#include <nuttx/kmalloc.h>
-#include <nuttx/binfmt/elf.h>
-
-#include "libelf.h"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Constant Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: elf_sectname
- *
- * Description:
- * Get the symbol name in loadinfo->iobuffer[].
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-static inline int elf_sectname(FAR struct elf_loadinfo_s *loadinfo,
- FAR const Elf_Shdr *shdr)
-{
- FAR Elf_Shdr *shstr;
- off_t offset;
- size_t bytesread = 0;
- int shstrndx;
- int ret;
-
- /* Get the section header table index of the entry associated with the
- * section name string table. If the file has no section name string table,
- * this member holds the value SH_UNDEF.
- */
-
- shstrndx = loadinfo->ehdr.e_shstrndx;
- if (shstrndx == SHN_UNDEF)
- {
- berr("No section header string table\n");
- return -EINVAL;
- }
-
- /* Allocate an I/O buffer if necessary. This buffer is used by
- * elf_sectname() to accumulate the variable length symbol name.
- */
-
- ret = elf_allocbuffer(loadinfo);
- if (ret < 0)
- {
- berr("elf_allocbuffer failed: %d\n", ret);
- return ret;
- }
-
- /* Get the section name string table section header */
-
- shstr = &loadinfo->shdr[shstrndx];
-
- /* Get the file offset to the string that is the name of the section. This
- * is the sum of:
- *
- * shstr->sh_offset: The file offset to the first byte of the section
- * header string table data.
- * shdr->sh_name: The offset to the name of the section in the section
- * name table
- */
-
- offset = shstr->sh_offset + shdr->sh_name;
-
- /* Loop until we get the entire section name into memory */
-
- for (; ; )
- {
- FAR uint8_t *buffer = &loadinfo->iobuffer[bytesread];
- size_t readlen = loadinfo->buflen - bytesread;
-
- /* Get the number of bytes to read */
-
- if (offset + readlen > loadinfo->filelen)
- {
- if (loadinfo->filelen <= offset)
- {
- berr("At end of file\n");
- return -EINVAL;
- }
-
- readlen = loadinfo->filelen - offset;
- }
-
- /* Read that number of bytes into the array */
-
- ret = elf_read(loadinfo, buffer, readlen, offset + bytesread);
- if (ret < 0)
- {
- berr("Failed to read section name\n");
- return ret;
- }
-
- bytesread += readlen;
-
- /* Did we read the NUL terminator? */
-
- if (memchr(buffer, '\0', readlen) != NULL)
- {
- /* Yes, the buffer contains a NUL terminator. */
-
- return OK;
- }
-
- /* No.. then we have to read more */
-
- ret = elf_reallocbuffer(loadinfo, CONFIG_ELF_BUFFERINCR);
- if (ret < 0)
- {
- berr("elf_reallocbuffer failed: %d\n", ret);
- return ret;
- }
- }
-
- /* We will not get here */
-
- return OK;
-}
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: elf_loadphdrs
- *
- * Description:
- * Loads program headers into memory.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_loadphdrs(FAR struct elf_loadinfo_s *loadinfo)
-{
- size_t phdrsize;
- int ret;
-
- DEBUGASSERT(loadinfo->phdr == NULL);
-
- /* Verify that there are programs */
-
- if (loadinfo->ehdr.e_phnum < 1)
- {
- binfo("No programs(?)\n");
- return 0;
- }
-
- /* Get the total size of the program header table */
-
- phdrsize = (size_t)loadinfo->ehdr.e_phentsize *
- (size_t)loadinfo->ehdr.e_phnum;
- if (loadinfo->ehdr.e_phoff + phdrsize > loadinfo->filelen)
- {
- berr("Insufficient space in file for program header table\n");
- return -ESPIPE;
- }
-
- /* Allocate memory to hold a working copy of the program header table */
-
- loadinfo->phdr = (FAR Elf_Phdr *)kmm_malloc(phdrsize);
- if (!loadinfo->phdr)
- {
- berr("Failed to allocate the program header table. Size: %ld\n",
- (long)phdrsize);
- return -ENOMEM;
- }
-
- /* Read the program header table into memory */
-
- ret = elf_read(loadinfo, (FAR uint8_t *)loadinfo->phdr, phdrsize,
- loadinfo->ehdr.e_phoff);
- if (ret < 0)
- {
- berr("Failed to read program header table: %d\n", ret);
- }
-
- return ret;
-}
-
-/****************************************************************************
- * Name: elf_loadshdrs
- *
- * Description:
- * Loads section headers into memory.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_loadshdrs(FAR struct elf_loadinfo_s *loadinfo)
-{
- size_t shdrsize;
- int ret;
-
- DEBUGASSERT(loadinfo->shdr == NULL);
-
- /* Verify that there are sections */
-
- if (loadinfo->ehdr.e_shnum < 1)
- {
- berr("No sections(?)\n");
- return -EINVAL;
- }
-
- /* Get the total size of the section header table */
-
- shdrsize = (size_t)loadinfo->ehdr.e_shentsize *
- (size_t)loadinfo->ehdr.e_shnum;
- if (loadinfo->ehdr.e_shoff + shdrsize > loadinfo->filelen)
- {
- berr("Insufficient space in file for section header table\n");
- return -ESPIPE;
- }
-
- /* Allocate memory to hold a working copy of the sector header table */
-
- loadinfo->shdr = kmm_malloc(shdrsize);
- if (!loadinfo->shdr)
- {
- berr("Failed to allocate the section header table. Size: %zu\n",
- shdrsize);
- return -ENOMEM;
- }
-
- /* Read the section header table into memory */
-
- ret = elf_read(loadinfo, (FAR uint8_t *)loadinfo->shdr, shdrsize,
- loadinfo->ehdr.e_shoff);
- if (ret < 0)
- {
- berr("Failed to read section header table: %d\n", ret);
- }
-
- return ret;
-}
-
-/****************************************************************************
- * Name: elf_findsection
- *
- * Description:
- * A section by its name.
- *
- * Input Parameters:
- * loadinfo - Load state information
- * sectname - Name of the section to find
- *
- * Returned Value:
- * On success, the index to the section is returned; A negated errno value
- * is returned on failure.
- *
- ****************************************************************************/
-
-int elf_findsection(FAR struct elf_loadinfo_s *loadinfo,
- FAR const char *sectname)
-{
- int i;
-
- /* Search through the shdr[] array in loadinfo for a section named
- * 'sectname'
- */
-
- for (i = 0; i < loadinfo->ehdr.e_shnum; i++)
- {
- FAR const Elf_Shdr *shdr = &loadinfo->shdr[i];
-
- /* Get the name of this section */
-
- int ret = elf_sectname(loadinfo, shdr);
- if (ret < 0)
- {
- berr("elf_sectname failed: %d\n", ret);
- return ret;
- }
-
- /* Check if the name of this section is 'sectname' */
-
- binfo("%d. Comparing \"%s\" and .\"%s\"\n",
- i, loadinfo->iobuffer, sectname);
-
- if (strcmp((FAR const char *)loadinfo->iobuffer, sectname) == 0)
- {
- /* We found it... return the index */
-
- return i;
- }
- }
-
- /* We failed to find a section with this name. */
-
- return -ENOENT;
-}
diff --git a/binfmt/libelf/libelf_symbols.c b/binfmt/libelf/libelf_symbols.c
deleted file mode 100644
index bc865c61d8..0000000000
--- a/binfmt/libelf/libelf_symbols.c
+++ /dev/null
@@ -1,340 +0,0 @@
-/****************************************************************************
- * binfmt/libelf/libelf_symbols.c
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <inttypes.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <debug.h>
-
-#include <nuttx/binfmt/elf.h>
-#include <nuttx/symtab.h>
-
-#include "libelf.h"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Constant Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: elf_symname
- *
- * Description:
- * Get the symbol name in loadinfo->iobuffer[].
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- * EINVAL - There is something inconsistent in the symbol table (should
- * only happen if the file is corrupted).
- * ESRCH - Symbol has no name
- *
- ****************************************************************************/
-
-static int elf_symname(FAR struct elf_loadinfo_s *loadinfo,
- FAR const Elf_Sym *sym)
-{
- off_t offset;
- size_t bytesread = 0;
- int ret;
-
- /* Get the file offset to the string that is the name of the symbol. The
- * st_name member holds an offset into the file's symbol string table.
- */
-
- if (sym->st_name == 0)
- {
- bwarn("Symbol has no name\n");
- return -ESRCH;
- }
-
- /* Allocate an I/O buffer. This buffer is used by elf_symname() to
- * accumulate the variable length symbol name.
- */
-
- ret = elf_allocbuffer(loadinfo);
- if (ret < 0)
- {
- berr("elf_allocbuffer failed: %d\n", ret);
- return ret;
- }
-
- offset = loadinfo->shdr[loadinfo->strtabidx].sh_offset + sym->st_name;
-
- /* Loop until we get the entire symbol name into memory */
-
- for (; ; )
- {
- FAR uint8_t *buffer = &loadinfo->iobuffer[bytesread];
- size_t readlen = loadinfo->buflen - bytesread;
-
- /* Get the number of bytes to read */
-
- if (offset + readlen > loadinfo->filelen)
- {
- if (loadinfo->filelen <= offset)
- {
- berr("At end of file\n");
- return -EINVAL;
- }
-
- readlen = loadinfo->filelen - offset;
- }
-
- /* Read that number of bytes into the array */
-
- ret = elf_read(loadinfo, buffer, readlen, offset + bytesread);
- if (ret < 0)
- {
- berr("elf_read failed: %d\n", ret);
- return ret;
- }
-
- bytesread += readlen;
-
- /* Did we read the NUL terminator? */
-
- if (memchr(buffer, '\0', readlen) != NULL)
- {
- /* Yes, the buffer contains a NUL terminator. */
-
- return OK;
- }
-
- /* No.. then we have to read more */
-
- ret = elf_reallocbuffer(loadinfo, CONFIG_ELF_BUFFERINCR);
- if (ret < 0)
- {
- berr("elf_reallocbuffer failed: %d\n", ret);
- return ret;
- }
- }
-
- /* We will not get here */
-
- return OK;
-}
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: elf_findsymtab
- *
- * Description:
- * Find the symbol table section.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_findsymtab(FAR struct elf_loadinfo_s *loadinfo)
-{
- int i;
-
- /* Find the symbol table section header and its associated string table */
-
- for (i = 1; i < loadinfo->ehdr.e_shnum; i++)
- {
- if (loadinfo->shdr[i].sh_type == SHT_SYMTAB)
- {
- loadinfo->symtabidx = i;
- loadinfo->strtabidx = loadinfo->shdr[i].sh_link;
- break;
- }
- }
-
- /* Verify that there is a symbol and string table */
-
- if (loadinfo->symtabidx == 0)
- {
- berr("No symbols in ELF file\n");
- return -EINVAL;
- }
-
- return OK;
-}
-
-/****************************************************************************
- * Name: elf_readsym
- *
- * Description:
- * Read the ELF symbol structure at the specified index into memory.
- *
- * Input Parameters:
- * loadinfo - Load state information
- * index - Symbol table index
- * sym - Location to return the table entry
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_readsym(FAR struct elf_loadinfo_s *loadinfo, int index,
- FAR Elf_Sym *sym)
-{
- FAR Elf_Shdr *symtab = &loadinfo->shdr[loadinfo->symtabidx];
- off_t offset;
-
- /* Verify that the symbol table index lies within symbol table */
-
- if (index < 0 || index > (symtab->sh_size / sizeof(Elf_Sym)))
- {
- berr("Bad relocation symbol index: %d\n", index);
- return -EINVAL;
- }
-
- /* Get the file offset to the symbol table entry */
-
- offset = symtab->sh_offset + sizeof(Elf_Sym) * index;
-
- /* And, finally, read the symbol table entry into memory */
-
- return elf_read(loadinfo, (FAR uint8_t *)sym, sizeof(Elf_Sym), offset);
-}
-
-/****************************************************************************
- * Name: elf_symvalue
- *
- * Description:
- * Get the value of a symbol. The updated value of the symbol is returned
- * in the st_value field of the symbol table entry.
- *
- * Input Parameters:
- * loadinfo - Load state information
- * sym - Symbol table entry (value might be undefined)
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- * EINVAL - There is something inconsistent in the symbol table (should
- * only happen if the file is corrupted).
- * ENOSYS - Symbol lies in common
- * ESRCH - Symbol has no name
- * ENOENT - Symbol undefined and not provided via a symbol table
- *
- ****************************************************************************/
-
-int elf_symvalue(FAR struct elf_loadinfo_s *loadinfo, FAR Elf_Sym *sym,
- FAR const struct symtab_s *exports, int nexports)
-{
- FAR const struct symtab_s *symbol;
- uintptr_t secbase;
- int ret;
-
- switch (sym->st_shndx)
- {
- case SHN_COMMON:
- {
- /* NuttX ELF modules should be compiled with -fno-common. */
-
- berr("SHN_COMMON: Re-compile with -fno-common\n");
- return -ENOSYS;
- }
-
- case SHN_ABS:
- {
- /* st_value already holds the correct value */
-
- binfo("SHN_ABS: st_value=%08lx\n", (long)sym->st_value);
- return OK;
- }
-
- case SHN_UNDEF:
- {
- /* Get the name of the undefined symbol */
-
- ret = elf_symname(loadinfo, sym);
- if (ret < 0)
- {
- /* There are a few relocations for a few architectures that do
- * no depend upon a named symbol. We don't know if that is the
- * case here, but return and special error to the caller to
- * indicate the nameless symbol.
- */
-
- bwarn("SHN_UNDEF: Failed to get symbol name: %d\n", ret);
- return ret;
- }
-
- /* Check if the base code exports a symbol of this name */
-
- symbol = symtab_findbyname(exports, (FAR char *)loadinfo->iobuffer,
- nexports);
- if (!symbol)
- {
- berr("SHN_UNDEF: Exported symbol \"%s\" not found\n",
- loadinfo->iobuffer);
- return -ENOENT;
- }
-
- /* Yes... add the exported symbol value to the ELF symbol table
- * entry
- */
-
- binfo("SHN_UNDEF: name=%s "
- "%08" PRIxPTR "+%08" PRIxPTR "=%08" PRIxPTR "\n",
- loadinfo->iobuffer, (uintptr_t)sym->st_value,
- (uintptr_t)symbol->sym_value,
- (uintptr_t)(sym->st_value + (uintptr_t)symbol->sym_value));
-
- sym->st_value += (uintptr_t)symbol->sym_value;
- }
- break;
-
- default:
- {
- secbase = loadinfo->shdr[sym->st_shndx].sh_addr;
-
- binfo("Other: %08" PRIxPTR "+%08" PRIxPTR "=%08" PRIxPTR "\n",
- (uintptr_t)sym->st_value, secbase,
- (uintptr_t)(sym->st_value + secbase));
-
- sym->st_value += secbase;
- }
- break;
- }
-
- return OK;
-}
diff --git a/binfmt/libelf/libelf_uninit.c b/binfmt/libelf/libelf_uninit.c
deleted file mode 100644
index 29de1d61f6..0000000000
--- a/binfmt/libelf/libelf_uninit.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/****************************************************************************
- * binfmt/libelf/libelf_uninit.c
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <unistd.h>
-#include <debug.h>
-#include <errno.h>
-
-#include <nuttx/kmalloc.h>
-#include <nuttx/binfmt/elf.h>
-
-#include "libelf.h"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Constant Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: elf_uninit
- *
- * Description:
- * Releases any resources committed by elf_init(). This essentially
- * undoes the actions of elf_init.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_uninit(struct elf_loadinfo_s *loadinfo)
-{
- /* Free all working buffers */
-
- elf_freebuffers(loadinfo);
-
- /* Close the ELF file */
-
- if (loadinfo->file.f_inode)
- {
- file_close(&loadinfo->file);
- }
-
- return OK;
-}
-
-/****************************************************************************
- * Name: elf_freebuffers
- *
- * Description:
- * Release all working buffers.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_freebuffers(FAR struct elf_loadinfo_s *loadinfo)
-{
- /* Release all working allocations */
-
- if (loadinfo->phdr)
- {
- kmm_free((FAR void *)loadinfo->phdr);
- loadinfo->phdr = NULL;
- }
-
- if (loadinfo->shdr)
- {
- kmm_free(loadinfo->shdr);
- loadinfo->shdr = NULL;
- }
-
- if (loadinfo->iobuffer)
- {
- kmm_free(loadinfo->iobuffer);
- loadinfo->iobuffer = NULL;
- loadinfo->buflen = 0;
- }
-
- return OK;
-}
diff --git a/binfmt/libelf/libelf_unload.c b/binfmt/libelf/libelf_unload.c
deleted file mode 100644
index 06bbebd365..0000000000
--- a/binfmt/libelf/libelf_unload.c
+++ /dev/null
@@ -1,102 +0,0 @@
-/****************************************************************************
- * binfmt/libelf/libelf_unload.c
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <stdlib.h>
-#include <debug.h>
-
-#include <nuttx/kmalloc.h>
-#include <nuttx/binfmt/elf.h>
-
-#include "libelf.h"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Constant Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: elf_unload
- *
- * Description:
- * This function unloads the object from memory. This essentially undoes
- * the actions of elf_load. It is called only under certain error
- * conditions after the module has been loaded but not yet started.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- ****************************************************************************/
-
-int elf_unload(FAR struct elf_loadinfo_s *loadinfo)
-{
- /* Free all working buffers */
-
- elf_freebuffers(loadinfo);
-
- /* Release memory holding the relocated ELF image */
-
- elf_addrenv_free(loadinfo);
-
- /* Release memory used to hold static constructors and destructors */
-
-#ifdef CONFIG_BINFMT_CONSTRUCTORS
-# ifndef CONFIG_ARCH_ADDRENV
- if (loadinfo->ctoralloc != 0)
- {
- kumm_free(loadinfo->ctoralloc);
- }
-
- if (loadinfo->dtoralloc != 0)
- {
- kumm_free(loadinfo->dtoralloc);
- }
-# endif
-
- loadinfo->ctoralloc = NULL;
- loadinfo->ctors = NULL;
- loadinfo->nctors = 0;
-
- loadinfo->dtoralloc = NULL;
- loadinfo->dtors = NULL;
- loadinfo->ndtors = 0;
-#endif
-
- return OK;
-}
diff --git a/binfmt/libelf/libelf_verify.c b/binfmt/libelf/libelf_verify.c
deleted file mode 100644
index 2e005d516f..0000000000
--- a/binfmt/libelf/libelf_verify.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/****************************************************************************
- * binfmt/libelf/libelf_verify.c
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <string.h>
-#include <debug.h>
-#include <errno.h>
-
-#include <nuttx/elf.h>
-#include <nuttx/binfmt/elf.h>
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Constant Data
- ****************************************************************************/
-
-static const char g_elfmagic[EI_MAGIC_SIZE] = EI_MAGIC;
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: elf_verifyheader
- *
- * Description:
- * Given the header from a possible ELF executable, verify that it
- * is an ELF executable.
- *
- * Returned Value:
- * 0 (OK) is returned on success and a negated errno is returned on
- * failure.
- *
- * -ENOEXEC : Not an ELF file
- * -EINVAL : Not a relocatable ELF file or not supported by the current,
- * configured architecture.
- *
- ****************************************************************************/
-
-int elf_verifyheader(FAR const Elf_Ehdr *ehdr)
-{
- if (!ehdr)
- {
- berr("NULL ELF header!");
- return -ENOEXEC;
- }
-
- /* Verify that the magic number indicates an ELF file */
-
- if (memcmp(ehdr->e_ident, g_elfmagic, EI_MAGIC_SIZE) != 0)
- {
- binfo("Not ELF magic {%02x, %02x, %02x, %02x}\n",
- ehdr->e_ident[0], ehdr->e_ident[1], ehdr->e_ident[2],
- ehdr->e_ident[3]);
- return -ENOEXEC;
- }
-
- /* Verify that this is a relocatable file */
-
- if (ehdr->e_type != ET_REL && ehdr->e_type != ET_EXEC)
- {
- berr("Not a relocatable or executable file: e_type=%d\n",
- ehdr->e_type);
- return -EINVAL;
- }
-
- /* Verify that this file works with the currently configured architecture */
-
- if (!up_checkarch(ehdr))
- {
- berr("Not a supported architecture\n");
- return -ENOEXEC;
- }
-
- /* Looks good so far... we still might find some problems later. */
-
- return OK;
-}
diff --git a/boards/arm/mps/mps2-an500/scripts/Make.defs b/boards/arm/mps/mps2-an500/scripts/Make.defs
index 45e22c1e2b..84f445475f 100644
--- a/boards/arm/mps/mps2-an500/scripts/Make.defs
+++ b/boards/arm/mps/mps2-an500/scripts/Make.defs
@@ -54,4 +54,4 @@ LDNXFLATFLAGS = -e main -s 2048
# ELF module definitions
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/binfmt/libelf/gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
diff --git a/boards/arm/mps/mps3-an547/scripts/Make.defs b/boards/arm/mps/mps3-an547/scripts/Make.defs
index 585f443c18..d31709d88f 100644
--- a/boards/arm/mps/mps3-an547/scripts/Make.defs
+++ b/boards/arm/mps/mps3-an547/scripts/Make.defs
@@ -42,4 +42,4 @@ LDNXFLATFLAGS = -e main -s 2048
# ELF module definitions
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/binfmt/libelf/gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
diff --git a/boards/arm/sama5/sama5d3-xplained/scripts/Make.defs b/boards/arm/sama5/sama5d3-xplained/scripts/Make.defs
index da2ce0355f..dc2238c853 100644
--- a/boards/arm/sama5/sama5d3-xplained/scripts/Make.defs
+++ b/boards/arm/sama5/sama5d3-xplained/scripts/Make.defs
@@ -53,4 +53,4 @@ CELFFLAGS = $(CFLAGS) -mlong-calls # --target1-abs
CXXELFFLAGS = $(CXXFLAGS) -mlong-calls # --target1-abs
LDELFFLAGS = -r -e main
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/binfmt/libelf/gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
diff --git a/boards/sim/sim/sim/scripts/Make.defs b/boards/sim/sim/sim/scripts/Make.defs
index bb4f0f0a97..729c957f15 100644
--- a/boards/sim/sim/sim/scripts/Make.defs
+++ b/boards/sim/sim/sim/scripts/Make.defs
@@ -280,7 +280,7 @@ ifeq ($(CONFIG_LIBC_ARCH_ELF_64BIT),y)
endif
LDELFFLAGS = -r -e main --gc-sections
-LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/binfmt/libelf/gnu-elf.ld)
+LDELFFLAGS += -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/modlib/gnu-elf.ld)
ifeq ($(CONFIG_HOST_MACOS),y)
LDFLAGS += -Wl,-dead_strip
diff --git a/tools/mkexport.sh b/tools/mkexport.sh
index bf1d3f98a2..8c434b220f 100755
--- a/tools/mkexport.sh
+++ b/tools/mkexport.sh
@@ -188,7 +188,7 @@ APPLD=gnu-elf.ld
if [ -f "${BOARDDIR}/scripts/${APPLD}" ]; then
cp -f "${BOARDDIR}/scripts/${APPLD}" "${EXPORTDIR}/scripts/."
else
- cp -f "${TOPDIR}/binfmt/libelf/${APPLD}" "${EXPORTDIR}/scripts/."
+ cp -f "${TOPDIR}/libs/libc/modlib/${APPLD}" "${EXPORTDIR}/scripts/."
fi
if [ "${NUTTX_BUILD}" = "kernel" ]; then