An NXFLAT module reaches the base firmware through a "thunk" file: one assembly stub per imported function, generated by mknxflat. That tool has always lived outside this repository, in the NuttX buildroot NXFLAT toolchain, so building an NXFLAT module needs a separate checkout and a separate build of a tool that links against libbfd. libbfd is why it stayed out. It is GPL, which an Apache project cannot depend on, and it is awkward to obtain besides -- a stock binutils install often ships libbfd without the libiberty it needs to link. But the dependency was never deep. mknxflat used libbfd for eight calls, all of them opening the file and walking the symbol table; it never relocates or rewrites anything. That is replaced here by reading the ELF symbol table directly, which removes the dependency outright and costs about a hundred lines. The emitted text is unchanged. The format strings live in the .def files, which are carried here byte-for-byte from upstream, and the selection rule for what becomes a thunk is the upstream one: everything undefined that is not explicitly an object. Symbol typing cannot be trusted for this -- imported functions are routinely emitted as STT_NOTYPE rather than STT_FUNC, while a weakly defined object does appear as an undefined object -- so the test is on what a symbol is not. Upstream chose the instruction set at compile time through an "arch" symlink pointing at either arm/ or thumb2/. A symlink cannot be carried in the repository, and one host binary has to serve boards of both flavours, since lpc31xx is ARM while lpc17xx, tiva, stm32f1 and rp23xx are Thumb-2. That choice becomes a runtime "-a" option. The "-f" option, which read further command line arguments from a file, is dropped; nothing in the tree used it. This commit changes no output. Against the upstream tool, for both architectures, with and without -w, over modules exercising the plain, weak and non-returning thunk paths, the generated thunk files are byte-identical. Assisted-by: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Marco Casaroli <marco.casaroli@gmail.com> |
||
|---|---|---|
| .github | ||
| arch | ||
| audio | ||
| binfmt | ||
| boards | ||
| cmake | ||
| crypto | ||
| Documentation | ||
| drivers | ||
| dummy | ||
| fs | ||
| graphics | ||
| include | ||
| libs | ||
| mm | ||
| net | ||
| openamp | ||
| pass1 | ||
| sched | ||
| syscall | ||
| tools | ||
| video | ||
| wireless | ||
| .asf.yaml | ||
| .codespell-ignore-lines | ||
| .codespellrc | ||
| .editorconfig | ||
| .gitignore | ||
| .gitmessage | ||
| .pre-commit-config.yaml | ||
| .yamllint | ||
| AUTHORS | ||
| CMakeLists.txt | ||
| CONTRIBUTING.md | ||
| INVIOLABLES.md | ||
| Kconfig | ||
| LICENSE | ||
| Makefile | ||
| NOTICE | ||
| README.md | ||
| ReleaseNotes | ||
Apache NuttX is a real-time operating system (RTOS) with an emphasis on standards compliance and small footprint. Scalable from 8-bit to 64-bit microcontroller environments, the primary governing standards in NuttX are POSIX and ANSI standards. Additional standard APIs from Unix and other common RTOSs (such as VxWorks) are adopted for functionality not available under these standards, or for functionality that is not appropriate for deeply-embedded environments (such as fork()).
For brevity, many parts of the documentation will refer to Apache NuttX as simply NuttX.
Getting Started
First time on NuttX? Read the Getting Started guide! If you don't have a board available, NuttX has its own simulator that you can run on terminal.
Documentation
You can find the current NuttX documentation on the Documentation Page.
Alternatively, you can build the documentation yourself by following the Documentation Build Instructions.
The old NuttX documentation is still available in the Apache wiki.
Supported Boards
NuttX supports a wide variety of platforms. See the full list on the Supported Platforms page.
Contributing
If you wish to contribute to the NuttX project, read the Contributing guidelines for information on Git usage, coding standard, workflow and the NuttX principles.
License
The code in this repository is under either the Apache 2 license, or a license compatible with the Apache 2 license. See the License Page for more information.