Adds __h_errno_loc to glibc's ABI (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 27 May 2015 19:23:31 +0000 (15:23 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 4 Jun 2015 13:40:33 +0000 (09:40 -0400)
commit6486ea2483c3fff91831a723578249a5e2e0d5d8
tree282e53cc1e9da312e56971c9b8a0190fb7a61af5
parent3da88d8575a8d7bb615326a70d4965ed9f6a83c7
Adds __h_errno_loc to glibc's ABI (XCC)

A little background:  I was getting a link error compiling something that was
using h_errno.  As an example, in tests/hello.c:

#include <netdb.h>

...

printf("XME %p\n", h_errno);

Building that gives a link error like:
ros-kernel/tests/hello.c:19: undefined reference to `__h_errno_location'

h_errno is a macro that expands to deref __h_errno_location().

__h_errno_location() is declared in netdb.h and defined in inet/herrno-loc.c.
The symbol is even in libc-2.19.so, so why can't we link against it?

We can see it in an objdump of libc:
    00000000000dab30 l     F .text0000000000000016              __h_errno_location
    00000000000dab30 l     F .text00000000000000160000000000000016              __GI___h_errno_location

But notice the 'l'.  Now look at some other func we have in glibc:
    00000000000c7db0 g     F .text000000000000001600000000000001f9              utimensat

That has a 'g', for global.  For functions to be linkable, they need to be part
of glibc's ABI (check out my old Documentation/glibc.txt for some info).  Now,
normally __h_errno_location is part of the ABI, but we're not building resolv
anymore.  In resolv's Versions file, we have:

libc {
      GLIBC_2.0 {
        _res;

        # helper functions
        __h_errno_location;

Since we don't build resolv, we don't have that as part of the abi.  Thus, we
need to do it manually in Akaros's Versions.  We'll have to do the same things
for other functions that pop up that were part of resolv (or other Subdir's)
Versions that we implement separately.  Hopefully no one is trying to access
_res...

Rebuild glibc.
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/Versions