mirror of
https://github.com/apache/nuttx.git
synced 2026-09-30 11:03:53 +00:00
ldnxflat is the last piece of the NXFLAT toolchain that NuttX cannot carry. It descends from elf2flt through four sets of copyright holders, so it is GPL by that descent and not merely by its libbfd dependency. This is a new implementation, written from include/nxflat.h, from what binfmt/libnxflat does with the container, and from the ELF specification. The relocation arithmetic is that of libs/libc/machine/arm/armv7-m/arch_elf.c, which the ELF loader runs on the target for the same relocations, and which brings R_ARM_TARGET1 with it. NXFLAT is not an ARM format. Its loader only adds a base to a 32-bit word, so the segments, the GOT, the relocation records and the header are common to every architecture. An architecture supplies a table entry, an entry-point convention and a relocation handler; an object for a machine with no entry is refused by name. The GOT is built here, because ld -r emits none: one entry per symbol that a GOT-relative reference names, at the start of D-Space, each with a relocation record of its own. An entry may hold a function, which is what makes a function pointer reached through the GOT work. Two defects of the out-of-tree tool do not survive. A GOT entry naming a .bss object lost its section's address and pointed at the start of D-Space, the GOT itself, so on lm3s6965-ek:qemu-nxflat the longjmp test panics with PC 0 and the five tests after it never run. The alignment gap before .bss went missing from h_bssend as well, leaving D-Space short. The tool is built and named like the rest of the toolchain. Makefile.host builds it, Unix.mk makes a configuration that sets CONFIG_NXFLAT depend on it beside mknxflat, and LDNXFLAT points at the tool in the tree rather than one on PATH. All eight C modules of apps/examples/nxflat/tests convert and run to completion under qemu-system-arm -M lm3s6965evb. Assisted-by: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Marco Casaroli <marco.casaroli@gmail.com>
321 lines
9 KiB
Text
321 lines
9 KiB
Text
############################################################################
|
|
# tools/Makefile.host
|
|
#
|
|
# 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.
|
|
#
|
|
############################################################################
|
|
|
|
export TOPDIR ?= $(CURDIR)/..
|
|
-include $(TOPDIR)/Make.defs
|
|
include ${TOPDIR}/tools/Config.mk
|
|
|
|
# Check the endian-ness of the target
|
|
|
|
ifeq ($(CONFIG_ENDIAN_BIG),y)
|
|
CFLAGS += -DTGT_BIGENDIAN=1
|
|
endif
|
|
|
|
# Targets
|
|
|
|
all: b16$(HOSTEXEEXT) bdf-converter$(HOSTEXEEXT) cmpconfig$(HOSTEXEEXT) \
|
|
configure$(HOSTEXEEXT) mkconfig$(HOSTEXEEXT) mkdeps$(HOSTEXEEXT) \
|
|
mksymtab$(HOSTEXEEXT) mksyscall$(HOSTEXEEXT) mkversion$(HOSTEXEEXT) \
|
|
mkpasswd$(HOSTEXEEXT) cnvwindeps$(HOSTEXEEXT) nxstyle$(HOSTEXEEXT) \
|
|
initialconfig$(HOSTEXEEXT) gencromfs$(HOSTEXEEXT) \
|
|
convert-comments$(HOSTEXEEXT) lowhex$(HOSTEXEEXT) \
|
|
detab$(HOSTEXEEXT) rmcr$(HOSTEXEEXT) incdir$(HOSTEXEEXT) \
|
|
mknxflat$(HOSTEXEEXT) jlink-nuttx$(HOSTDYNEXT)
|
|
default: mkconfig$(HOSTEXEEXT) mksyscall$(HOSTEXEEXT) mkdeps$(HOSTEXEEXT) \
|
|
cnvwindeps$(HOSTEXEEXT) incdir$(HOSTEXEEXT)
|
|
|
|
ifdef HOSTEXEEXT
|
|
.PHONY: b16 bdf-converter cmpconfig clean configure kconfig2html mkconfig \
|
|
mkdeps mksymtab mksyscall mkversion mkpasswd cnvwindeps nxstyle \
|
|
initialconfig gencromfs convert-comments lowhex detab rmcr incdir \
|
|
mknxflat ldnxflat
|
|
endif
|
|
ifdef HOSTDYNEXT
|
|
.PHONY: jlink-nuttx
|
|
endif
|
|
.PHONY: clean
|
|
|
|
# b16 - Fixed precision math conversion tool
|
|
|
|
b16$(HOSTEXEEXT): b16.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o b16$(HOSTEXEEXT) b16.c
|
|
|
|
ifdef HOSTEXEEXT
|
|
b16: b16$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# configure - Instantiate a canned NuttX configuration
|
|
|
|
configure$(HOSTEXEEXT): configure.c cfgparser.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o configure$(HOSTEXEEXT) configure.c cfgparser.c
|
|
|
|
ifdef HOSTEXEEXT
|
|
configure: configure$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# mkconfig - Convert a .config file into a C config.h file
|
|
|
|
mkconfig$(HOSTEXEEXT): mkconfig.c cfgdefine.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o mkconfig$(HOSTEXEEXT) mkconfig.c cfgdefine.c
|
|
|
|
ifdef HOSTEXEEXT
|
|
mkconfig: mkconfig$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# cmpconfig - Compare the contents of two configuration files
|
|
|
|
cmpconfig$(HOSTEXEEXT): cmpconfig.c cfgparser.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o cmpconfig$(HOSTEXEEXT) cmpconfig.c cfgparser.c
|
|
|
|
ifdef HOSTEXEEXT
|
|
cmpconfig: cmpconfig$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# kconfig2html - Create an HTML document describing the configuration options
|
|
|
|
kconfig2html$(HOSTEXEEXT): kconfig2html.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o kconfig2html$(HOSTEXEEXT) kconfig2html.c
|
|
|
|
ifdef HOSTEXEEXT
|
|
kconfig2html: kconfig2html$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# mkversion - Convert a .version file into a C version.h file
|
|
|
|
mkversion$(HOSTEXEEXT): mkconfig.c cfgdefine.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o mkversion$(HOSTEXEEXT) mkversion.c cfgdefine.c
|
|
|
|
ifdef HOSTEXEEXT
|
|
mkversion: mkversion$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# mkpasswd - Generate a NuttX /etc/passwd entry with PBKDF2-HMAC-SHA256 hash
|
|
|
|
mkpasswd$(HOSTEXEEXT): mkpasswd.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o mkpasswd$(HOSTEXEEXT) mkpasswd.c
|
|
|
|
ifdef HOSTEXEEXT
|
|
mkpasswd: mkpasswd$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# mksyscall - Convert a CSV file into syscall stubs and proxies
|
|
|
|
mksyscall$(HOSTEXEEXT): mksyscall.c csvparser.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o mksyscall$(HOSTEXEEXT) mksyscall.c csvparser.c
|
|
|
|
ifdef HOSTEXEEXT
|
|
mksyscall: mksyscall$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# mksymtab - Convert a CSV file into a symbol table
|
|
|
|
mksymtab$(HOSTEXEEXT): mksymtab.c csvparser.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o mksymtab$(HOSTEXEEXT) mksymtab.c csvparser.c
|
|
|
|
ifdef HOSTEXEEXT
|
|
mksymtab: mksymtab$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# mknxflat - Generate the thunk file for an NXFLAT module
|
|
# ldnxflat - Convert an ELF object into an NXFLAT module
|
|
|
|
MKNXFLAT_SRCS = nxflat/mknxflat.c nxflat/thunk_arm.c nxflat/thunk_thumb2.c \
|
|
nxflat/nxflat_elf.c
|
|
LDNXFLAT_SRCS = nxflat/ldnxflat.c nxflat/nxflat_elf.c
|
|
|
|
mknxflat$(HOSTEXEEXT): $(MKNXFLAT_SRCS)
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -Inxflat -o mknxflat$(HOSTEXEEXT) \
|
|
$(MKNXFLAT_SRCS)
|
|
|
|
ldnxflat$(HOSTEXEEXT): $(LDNXFLAT_SRCS)
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -Inxflat -o ldnxflat$(HOSTEXEEXT) \
|
|
$(LDNXFLAT_SRCS)
|
|
|
|
ifdef HOSTEXEEXT
|
|
mknxflat: mknxflat$(HOSTEXEEXT)
|
|
ldnxflat: ldnxflat$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# bdf-converter - Converts a BDF font to the NuttX font format
|
|
|
|
bdf-converter$(HOSTEXEEXT): bdf-converter.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o bdf-converter$(HOSTEXEEXT) bdf-converter.c
|
|
|
|
ifdef HOSTEXEEXT
|
|
bdf-converter: bdf-converter$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# nxstyle - Check a file for compliance to NuttX coding style
|
|
|
|
nxstyle$(HOSTEXEEXT): nxstyle.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -DTOPDIR=\"$(realpath $(TOPDIR))\" \
|
|
-o nxstyle$(HOSTEXEEXT) nxstyle.c
|
|
|
|
ifdef HOSTEXEEXT
|
|
nxstyle: nxstyle$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# initialconfig - Create a barebones .config file sufficient only for
|
|
# instantiating the symbolic links necessary to do a real configuration
|
|
# from scratch.
|
|
|
|
initialconfig$(HOSTEXEEXT): initialconfig.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o initialconfig$(HOSTEXEEXT) initialconfig.c
|
|
|
|
ifdef HOSTEXEEXT
|
|
initialconfig: initialconfig$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# gencromfs - Generate a CROMFS file system
|
|
|
|
gencromfs$(HOSTEXEEXT): gencromfs.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o gencromfs$(HOSTEXEEXT) gencromfs.c
|
|
|
|
ifdef HOSTEXEEXT
|
|
gencromfs: gencromfs$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# convert-comments - Convert C++-style comments to C-style comments
|
|
|
|
convert-comments$(HOSTEXEEXT): convert-comments.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o convert-comments$(HOSTEXEEXT) convert-comments.c
|
|
|
|
ifdef HOSTEXEEXT
|
|
convert-comments: convert-comments$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# lowhex - Convert hexadecimal constants to lower cast format
|
|
|
|
lowhex$(HOSTEXEEXT): lowhex.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o lowhex$(HOSTEXEEXT) lowhex.c
|
|
|
|
ifdef HOSTEXEEXT
|
|
lowhex: lowhex$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# detab - Convert tabs to spaces
|
|
|
|
detab$(HOSTEXEEXT): detab.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o detab$(HOSTEXEEXT) detab.c
|
|
|
|
ifdef HOSTEXEEXT
|
|
detab: detab$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# rmcr - Convert tabs to spaces
|
|
|
|
rmcr$(HOSTEXEEXT): rmcr.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o rmcr$(HOSTEXEEXT) rmcr.c
|
|
|
|
ifdef HOSTEXEEXT
|
|
rmcr: rmcr$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# incdir - Generate compiler-specific include paths
|
|
|
|
incdir$(HOSTEXEEXT): incdir.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o incdir$(HOSTEXEEXT) incdir.c
|
|
|
|
ifdef HOSTEXEEXT
|
|
incdir: incdir$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# cnvwindeps - Convert dependences generated by a Windows native toolchain
|
|
# for use in a Cygwin/POSIX build environment
|
|
|
|
cnvwindeps$(HOSTEXEEXT): cnvwindeps.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o cnvwindeps$(HOSTEXEEXT) cnvwindeps.c
|
|
|
|
ifdef HOSTEXEEXT
|
|
cnvwindeps: cnvwindeps$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# Create dependencies for a list of files
|
|
|
|
mkdeps$(HOSTEXEEXT): mkdeps.c csvparser.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -o mkdeps$(HOSTEXEEXT) mkdeps.c
|
|
|
|
ifdef HOSTEXEEXT
|
|
mkdeps: mkdeps$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# jlink-nuttx - Create jlink GDBServer nuttx plugin
|
|
|
|
jlink-nuttx$(HOSTDYNEXT): jlink-nuttx.c
|
|
$(Q) $(HOSTCC) $(HOSTCFLAGS) -shared -fPIC jlink-nuttx.c -o jlink-nuttx$(HOSTDYNEXT)
|
|
|
|
ifdef HOSTDYNEXT
|
|
jlink-nuttx: jlink-nuttx$(HOSTDYNEXT)
|
|
endif
|
|
|
|
clean:
|
|
$(call DELFILE, b16)
|
|
$(call DELFILE, b16.exe)
|
|
$(call DELFILE, bdf-converter)
|
|
$(call DELFILE, bdf-converter.exe)
|
|
$(call DELFILE, cmpconfig)
|
|
$(call DELFILE, cmpconfig.exe)
|
|
$(call DELFILE, cnvwindeps)
|
|
$(call DELFILE, cnvwindeps.exe)
|
|
$(call DELFILE, convert-comments)
|
|
$(call DELFILE, convert-comments.exe)
|
|
$(call DELFILE, configure)
|
|
$(call DELFILE, configure.exe)
|
|
$(call DELFILE, detab)
|
|
$(call DELFILE, detab.exe)
|
|
$(call DELFILE, gencromfs)
|
|
$(call DELFILE, gencromfs.exe)
|
|
$(call DELFILE, initialconfig)
|
|
$(call DELFILE, initialconfig.exe)
|
|
$(call DELFILE, lowhex)
|
|
$(call DELFILE, lowhex.exe)
|
|
$(call DELFILE, Make.dep)
|
|
$(call DELFILE, mkconfig)
|
|
$(call DELFILE, mkconfig.exe)
|
|
$(call DELFILE, mknxflat)
|
|
$(call DELFILE, mknxflat.exe)
|
|
$(call DELFILE, ldnxflat)
|
|
$(call DELFILE, ldnxflat.exe)
|
|
$(call DELFILE, mkdeps)
|
|
$(call DELFILE, mkdeps.exe)
|
|
$(call DELFILE, mksymtab)
|
|
$(call DELFILE, mksymtab.exe)
|
|
$(call DELFILE, mksyscall)
|
|
$(call DELFILE, mksyscall.exe)
|
|
$(call DELFILE, mkversion)
|
|
$(call DELFILE, mkversion.exe)
|
|
$(call DELFILE, mkpasswd)
|
|
$(call DELFILE, mkpasswd.exe)
|
|
$(call DELFILE, nxstyle)
|
|
$(call DELFILE, nxstyle.exe)
|
|
$(call DELFILE, rmcr)
|
|
$(call DELFILE, rmcr.exe)
|
|
$(call DELFILE, jlink-nuttx.so)
|
|
$(call DELFILE, jlink-nuttx.dll)
|
|
ifneq ($(CONFIG_WINDOWS_NATIVE),y)
|
|
$(Q) rm -rf *.dSYM
|
|
endif
|
|
$(Q) $(MAKE) -C pic32 -f Makefile.host clean
|
|
$(Q) $(MAKE) -C cxd56 -f Makefile.host clean
|
|
$(call DELFILE, incdir)
|
|
$(call DELFILE, incdir.exe)
|
|
$(call CLEAN)
|