Hi Marcus,
__errno_location and __h_errno_location are no longer weak symbols and so can not be overwritten any longer. The internal glibc systemcall wrappers no longer call the functions by reference, but directly.
the real problem is even worse. glibc has switched to using thread-local storage for errno (i.e. it is declared as 'extern __thread int errno') when the tool chain supports the __thread keyword.
This means that C source code compiled against the new headers will result in assembler code that *directly* accesses a thread-local variable as defined by the TLS ABI. In the case of errno, this will involve accessing the %gs segment using an offset from the GOT, without any function call being performed. (errno is defined to use the initial-exec TLS storage model.)
The __errno_location routine is provided only for backwards compatibility reasons, it is no longer guaranteed that every access to errno calls it. Thus, if you overwrite the implementation of __errno_location, you will only catch *some* errno accesses, not all of them ...
Bye, Ulrich (who has just implemented TLS for s390 ;-/)