On 10/01/20 10:25 pm, Alexander Monakov wrote: > On Fri, 10 Jan 2020, Siddhesh Poyarekar wrote: > >> I spent some time thinking about this and while it's trivial to fix by >> disabling ifuncs for static glibc, I wanted a solution that wasn't such >> a big hammer. The other alternative I could think of is to have an >> exported alias (called __builtin_strlen for example instead of strlen) >> of a default implementation of the builtin function in glibc that gcc >> generates a call to if freestanding && nostartfiles && static. > > In the Linaro bugreport you mention, > >> Basically, IFUNCs and freestanding don't mix. > > but really any libc (Glibc included) and -nostartfiles don't mix: stdio > won't be initialized, TLS won't be setup, and pretty much all other > libc-internal datastructures won't be properly setup. Almost no libc functions > are callable, because for example if they try to access 'errno', they crash. > > Looking at the opening comment of the failing kselftest source: > > * This program tries to be as small as possible itself, to > * avoid perturbing the system memory utilization with its > * own execution. It also attempts to have as few dependencies > * on kernel features as possible. > * > * It should be statically linked, with startup libs avoided. > * It uses no library calls, and only the following 3 syscalls: > * sysinfo(), write(), and _exit() > > so in fact allowing it to link with libc strlen would be contrary to its > intent. > The fix is simple: add -nodefaultlibs next to -nostartfiles in its Makefile, > and > write a trivial loop in place of __builtin_strlen.
That's a valid point. I'll recommend dropping __builtin_strlen from that test. Thanks, Siddhesh