nuttx/fs/Kconfig
Marco Casaroli 1aa32bbc07 libs/libc/elf: Place an FDPIC object's segments independently.
An ET_DYN object is loaded into one allocation with its data behind its
text, because its data references sit at a fixed distance from the code
that makes them.  An FDPIC object does not work that way: it reaches its
data through a base register, so the two segments can be placed wherever
suits, and the point of the format is that the read-only one is left on
the media and executed there while only the writable one is copied.  One
copy of the text then serves every instance.

So libelf_load() grows a second case.  The object announces itself in the
OS/ABI byte, which is noted once in libelf_loadhdrs() rather than
re-derived; e_flags cannot be used for this, as an FDPIC object's are an
unremarkable EABI version and testing them would reject every valid
module.  Text is taken from the media address plus the segment's own file
offset -- the same arithmetic the ET_REL path already does with
sh_offset -- and libelf_loadfile() does not read it.  If the filesystem
cannot show its media, the loader copies the text to RAM instead.  The
module then loses the shared text and the flash saving, but it runs.

Obtaining that address needs two mechanisms, and they are not
interchangeable.  A compacting filesystem can move a file's blocks, so it
hands out an address only with a pin that holds them still and expects
the pin back; xipfs is the one in tree.  A filesystem whose layout never
changes has nothing to hold and answers FIOC_XIPBASE with a bare address;
romfs and tmpfs are those.  libelf_xipacquire() asks for the pin first,
because a filesystem that needs one is not safe without it, and
libelf_unload() gives it back.  The loader asks for a pin only if it can
hold one, or the pin would stay for ever.

The pin is thus not specific to FDPIC.  Any module that executes in place
from a compacting filesystem takes one, and gives it back at unload.

mmap() is not used, though both filesystems implement it.  The mapping
would be recorded against whichever task called the loader, while the
release happens when the module's own task exits, which is a different
group -- so the pin would outlive the module and the extent would never
become movable again.

Unloading has to change with placement: the existing path frees only
textalloc because ET_DYN had a single allocation, which would leak an
FDPIC object's data and free media the filesystem only lent us.

Nothing here runs for a non-FDPIC object; every branch is behind the flag
and the single-allocation path is untouched.  Built and booted
mps3-an547:picostest, which is CONFIG_ELF with CONFIG_PIC, with no change
in behaviour.

Assisted-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Marco Casaroli <marco.casaroli@gmail.com>
2026-09-08 16:31:16 -03:00

196 lines
6 KiB
Text

#
# For a description of the syntax of this configuration file,
# see the file kconfig-language.txt in the NuttX tools repository.
#
comment "File system configuration"
config FS_PROFILER
bool "VFS Performance Profiler"
default n
---help---
Enable nanosecond/microsecond-level profiling for the Virtual File
System (VFS) operations (open, close, read, write). The profile stats
can be read via /proc/fs/profile if PROCFS is enabled.
config DISABLE_MOUNTPOINT
bool "Disable support for mount points"
default n
config FS_LARGEFILE
bool "Large File Support"
default n
---help---
Support files which's length is larger than 4GB:
https://www.opengroup.org/platform/lfs.html
Note: the protected and kernel mode on 32bit platform can't exceed
the 4GB limitation since the auto generated proxy and stub still
cut 64bit to 32bit value. Please check tools/mksyscall.c for more
information.
config FS_AUTOMOUNTER
bool "Auto-mounter"
default n
depends on !DISABLE_MOUNTPOINT
select SCHED_LPWORK
---help---
The automounter provides an OS-internal mechanism for automatically
mounting and unmounting removable media as the media is inserted and
removed. See include/nuttx/fs/automout.h for interfacing details.
config FS_AUTOMOUNTER_DEBUG
bool "Auto-mounter debug"
default n
depends on FS_AUTOMOUNTER && DEBUG_FEATURES
---help---
Normally, the auto-mounter will generate debug output when sub-system
level file system debug is enabled. This option will select debug
output from the logic related to the auto-mount feature even when file
system debug is not enable. This is useful primarily for in vivo
unit testing of the auto-mount feature.
config FS_AUTOMOUNTER_DRIVER
bool "Auto-mounter driver"
default n
depends on FS_AUTOMOUNTER && !DISABLE_ALL_SIGNALS
---help---
Enabling this option will lead to registering of a character driver
on FS_AUTOMOUNTER_VFS_PATH + mount point path for auto-mounter.
Example: /var/mnt/sdcard0
config FS_AUTOMOUNTER_VFS_PATH
string "Path to auto-mounter driver"
default "/var"
depends on FS_AUTOMOUNTER_DRIVER
---help---
The path to where auto-mounter driver will exist in the VFS namespace.
config FS_NEPOLL_DESCRIPTORS
int "Maximum number of default epoll descriptors for epoll_create1(2)"
default 8
---help---
The maximum number of default epoll descriptors for epoll_create1(2)
config FS_LOCK_BUCKET_SIZE
int "Maximum number of hash bucket using file locks"
default 0
config DISABLE_PSEUDOFS_OPERATIONS
bool "Disable pseudo-filesystem operations"
default DEFAULT_SMALL
---help---
Disable certain operations on pseudo-file systems include mkdir,
rmdir, unlink, and rename. These are necessary for the logical
completeness of the illusion created by the pseudo-filesystem.
However, in practical embedded system, they are seldom needed and
you can save a little FLASH space by disabling the capability.
config PSEUDOFS_ATTRIBUTES
bool "Pseudo-filesystem attributes"
default n
depends on !DISABLE_PSEUDOFS_OPERATIONS
---help---
Enable support for attributes(e.g. mode, uid, gid and time)
in the pseudo file system.
config FS_PIN
bool
default n
---help---
Selected by a file system that can pin a file's blocks in place and
hand out their media address, so that a module's read-only segment
can be executed where it already lies instead of being copied.
The pin is held for as long as the module is loaded and given back
when it is unloaded.
config FS_PERMISSION
bool "Enable UNIX Filesystem Permission Support"
default n
depends on !DISABLE_PSEUDOFS_OPERATIONS
depends on SCHED_USER_IDENTITY
depends on PSEUDOFS_ATTRIBUTES
---help---
Enable filesystem ownership and permission metadata
support for pseudoFS inodes.
Requires SCHED_USER_IDENTITY and
PSEUDOFS_ATTRIBUTES for task credential tracking
and inode ownership/mode metadata support.
This option alone does not enforce runtime
permission checks.
comment "UNIX filesystem permission support requires SCHED_USER_IDENTITY=y, PSEUDOFS_ATTRIBUTES=y and DISABLE_PSEUDOFS_OPERATIONS=n"
depends on !SCHED_USER_IDENTITY || !PSEUDOFS_ATTRIBUTES || DISABLE_PSEUDOFS_OPERATIONS
config FS_LINKS
bool "Pseudo-filesystem soft links"
default n
depends on !DISABLE_PSEUDOFS_OPERATIONS
---help---
Enable support for soft links in the pseudo file system. Soft
links are not supported within mounted volumes by any NuttX file
system. However, if this option is selected, then soft links
may be add in the pseudo file system. This might be useful, for
to link a directory in the pseudo-file system, such as /bin, to
to a directory in a mounted volume, say /mnt/sdcard/bin.
config PSEUDOFS_FILE
bool "Pseudo file support"
default n
depends on !DISABLE_PSEUDOFS_OPERATIONS
---help---
Support to create a file on pseudo filesystem.
config SENDFILE_BUFSIZE
int "sendfile() buffer size"
default 512
---help---
Size of the I/O buffer to allocate in sendfile(). Default: 512b
config FS_HEAPSIZE
int "Independent heap bytes"
default 0
depends on FS_SHMFS || FS_TMPFS || PSEUDOFS_FILE
---help---
Support for shm/tmpfs/fs_pseudofile.c ram based fs memory.
default 0 to use kmm directly. independent heap disabled
config FS_HEAPBUF_SECTION
string "FS heap use Userheap section"
depends on FS_HEAPSIZE > 0
default ""
---help---
Allocated fs heap from the specified section. If not
specified, it will alloc from kernel heap.
source "fs/vfs/Kconfig"
source "fs/aio/Kconfig"
source "fs/semaphore/Kconfig"
source "fs/event/Kconfig"
source "fs/mqueue/Kconfig"
source "fs/shm/Kconfig"
source "fs/mmap/Kconfig"
source "fs/partition/Kconfig"
source "fs/fat/Kconfig"
source "fs/nfs/Kconfig"
source "fs/nxffs/Kconfig"
source "fs/romfs/Kconfig"
source "fs/cromfs/Kconfig"
source "fs/tmpfs/Kconfig"
source "fs/smartfs/Kconfig"
source "fs/binfs/Kconfig"
source "fs/procfs/Kconfig"
source "fs/spiffs/Kconfig"
source "fs/littlefs/Kconfig"
source "fs/unionfs/Kconfig"
source "fs/userfs/Kconfig"
source "fs/hostfs/Kconfig"
source "fs/rpmsgfs/Kconfig"
source "fs/zipfs/Kconfig"
source "fs/mnemofs/Kconfig"
source "fs/xipfs/Kconfig"
source "fs/v9fs/Kconfig"