# Linux Kernel Module Cheat

##### 2.2.2.3. Your first glibc hack

We use glibc as our default libc now, and it is tracked as an unmodified submodule at submodules/glibc, at the exact same version that Buildroot has it, which can be found at: package/glibc/glibc.mk. Buildroot 2018.05 applies no patches.

Let’s hack up the `puts` function:

    ./build-buildroot -- glibc-reconfigure

with the patch:

    diff --git a/libio/ioputs.c b/libio/ioputs.c
    index 706b20b492..23185948f3 100644
    --- a/libio/ioputs.c
    +++ b/libio/ioputs.c
    @@ -38,8 +38,9 @@ _IO_puts (const char *str)
       if ((_IO_vtable_offset (_IO_stdout) != 0
            || _IO_fwide (_IO_stdout, -1) == -1)
           && _IO_sputn (_IO_stdout, str, len) == len
    +      && _IO_sputn (_IO_stdout, " hacked", 7) == 7
           && _IO_putc_unlocked ('\n', _IO_stdout) != EOF)
    -    result = MIN (INT_MAX, len + 1);
    +    result = MIN (INT_MAX, len + 1 + 7);

       _IO_release_lock (_IO_stdout);
       return result;

And then:

    ./run --eval-after './c/hello.out'

outputs:

    hello hacked

Lol!

We can also test our hacked glibc on User mode simulation with:

    ./run --userland userland/c/hello.c

I just noticed that this is actually a good way to develop glibc for other archs.

In this example, we got away without recompiling the userland program because we made a change that did not affect the glibc ABI, see this answer for an introduction to ABI stability: https://stackoverflow.com/questions/2171177/what-is-an-application-binary-interface-abi/54967743#54967743

Note that for arch agnostic features that don’t rely on bleeding kernel changes that you host doesn’t yet have, you can develop glibc natively as explained at:

- https://stackoverflow.com/questions/10412684/how-to-compile-my-own-glibc-c-standard-library-from-source-and-use-it/52454710#52454710

- https://stackoverflow.com/questions/847179/multiple-glibc-libraries-on-a-single-host/52454603#52454603

- https://stackoverflow.com/questions/2856438/how-can-i-link-to-a-specific-glibc-version/52550158#52550158 more focus on symbol versioning, but no one knows how to do it, so I answered

Tested on a30ed0f047523ff2368d421ee2cce0800682c44e + 1.