Skip libc-shadowing wrappers in codeclib.c under CODECS_STATIC
Native crash inside rb_subscribe_status — addr2line + objdump traced
it back to: String::clone() → memcpy at 0xc780e8 → SEGV reading 0xe0.
But 0xc780e8 turned out to be inside codec_malloc's region — the linker
had resolved memcpy to codeclib.c's wrapper instead of libc's.
codeclib.c provides wrappers for memcpy/memset/memmove/memcmp/strcpy/
strcat/strcmp/memchr/qsort that delegate to ci->memcpy etc. — codec_api
function pointers normally set up when codecs are dlopen'd as separate
shared libs without their own libc. With -Wl,-z,muldefs (which we need
for the ogg duplicate-symbol problem across vorbis/opus/speex/tremor),
the linker picked codeclib's wrappers over libc's. Calling them with
ci == NULL (firmware not booted yet) → null deref.
Gate all the libc-shadowing wrappers in codeclib.c behind
#ifndef CODECS_STATIC so static-link builds use libc directly. The
codec implementations (which were calling memcpy etc.) get the libc
versions transparently — no codec source changes needed.
After the fix, `nm -D librockbox_expo.so | grep memcpy` shows the
expected `U memcpy@LIBC` (resolved by Android's dynamic linker at
runtime) instead of pointing at codec_malloc's region.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>