This is the mail archive of the
mailing list for the GCC project.
Re: [RFC] builtin functions and `-ffreestanding -nostartfies` with static binaries
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