nuttx/include
Ville Juven 996625ec58 riscv/arch_elf.c: Handle PCREL_HI20/LO12_I/S relocations correctly
There is a problem with the current elf loader for risc-v: when a pair of
PCREL_HI20 / LO12 relocations are encountered, it is assumed that these
will follow each other immediately, as follows:

label:
	auipc      a0, %pcrel_hi(symbol)    // R_RISCV_PCREL_HI20
	load/store a0, %pcrel_lo(label)(a0) // R_RISCV_PCREL_LO12_I/S

With this assumption, the hi/lo relocations are both done when a hi20
relocation entry is encountered, first to the current instruction (addr)
and to the next instruction (addr + 4).

However, this assumption is wrong. There is nothing in the elf relocation
specification[1] that mandates this. Thus, the hi/lo relocation always
needs to first fixup the hi-part, and when the lo-part is encountered, it
needs to find the corresponding hi relocation entry, via the given "label".
This necessitates (re-)visiting the relocation entries for the current
section as well as looking for "label" in the symbol table.

The NuttX elf loader does not allow such operations to be done in the
machine specific part, so this patch fixes the relocation issue by
introducing an architecture specific cache for the hi20 relocation and
symbol table entries. When a lo12 relocation is encountered, the cache
can be consulted to find the hi20 part.

[1] https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-elf.adoc
2023-12-12 17:32:36 -08:00
..
android
arpa
crypto crypto/rsa_verify: export rsa verify via /dev/crypto 2023-10-18 12:23:13 +08:00
cxx
net ioctl: add definitions related to ethtool 2023-11-03 22:37:50 +08:00
netinet Remove @ and % tag from all comments 2023-12-11 17:00:10 -03:00
netpacket Remove @ and % tag from all comments 2023-12-11 17:00:10 -03:00
nuttx riscv/arch_elf.c: Handle PCREL_HI20/LO12_I/S relocations correctly 2023-12-12 17:32:36 -08:00
ssp
sys Remove @ and % tag from all comments 2023-12-11 17:00:10 -03:00
.gitignore
aio.h aio: change aio_fildes int type 2023-09-08 00:59:31 +03:00
alloca.h libs/alloca: add alloca implement for MSVC 2023-08-28 11:10:08 -03:00
assert.h assert: rename __ASSERT to __ASSERT__ to avoid conflict 2023-10-26 16:21:02 +08:00
byteswap.h
ctype.h libs/ctype/toupper_l: Implement function toupper_l instead of macro 2023-08-22 00:07:16 +08:00
debug.h Add a stepper generic upperhalf driver 2023-10-14 12:28:41 -04:00
dirent.h
dlfcn.h
dsp.h libdsp: update LP_FILTER comment 2023-10-19 21:38:45 +08:00
dspb16.h libdsp: update LP_FILTER comment 2023-10-19 21:38:45 +08:00
elf32.h
elf64.h Fix loading of ET_DYN type of shared objects 2023-09-20 09:35:28 -04:00
elf.h arch/arm64: support relocate for aarch64 2023-10-30 18:20:22 +08:00
endian.h
err.h
errno.h
execinfo.h
fcntl.h
fixedmath.h fixedmath: add abs and sign operations 2023-10-07 21:25:56 +08:00
fnmatch.h
ftw.h
getopt.h
glob.h
grp.h
hex2bin.h
iconv.h
ifaddrs.h
inttypes.h
iso646.h
langinfo.h The character U+ff0c "," could be confused with the ASCII character U+002c ",", which is more common in source code. 2023-10-03 16:53:12 -04:00
libgen.h
libintl.h
limits.h clock: replace all up_perf_xx with perf_xx 2023-10-02 16:11:43 +02:00
locale.h
lzf.h
malloc.h mm: record the maximum system memory usage 2023-11-09 09:08:49 +08:00
mqueue.h
netdb.h
nl_types.h
nxflat.h
obstack.h
poll.h
pthread.h pthread_once: g_lock may lead deadlock 2023-09-26 10:13:00 +08:00
pty.h
pwd.h
regex.h
resolv.h
sched.h
semaphore.h
signal.h sigaction: Expand si_user for non-kernel signals 2023-11-22 08:00:43 -08:00
spawn.h libs/libc/spawn: Add minimal implementation for posix_spawnattr_destory. 2023-10-31 13:42:00 +08:00
stdbool.h
stddef.h
stdint.h
stdio.h libc: add support for open_memstream 2023-11-29 02:13:19 -08:00
stdlib.h
stdnoreturn.h
string.h
strings.h Revert "libc/lib_bzero:Add bzero prototype." 2023-11-21 07:56:52 -08:00
syscall.h
syslog.h
termios.h
threads.h
time.h
unistd.h fs/dup3: impletement dup3/nx_dup3_from_tcb function 2023-10-27 21:15:07 +08:00
utime.h
uuid.h
wchar.h stdio: Implement [clearerr|putc|fflush]_unlocked 2023-10-29 17:09:18 +02:00
wctype.h