[PATCH] fix errno location for non-TLS case

Andrew Rybchenko Andrew.Rybchenko at oktetlabs.ru
Fri Dec 2 07:04:50 UTC 2011


Hi Peter,

On 12/01/2011 11:09 PM, Peter Mazinger wrote:
> On 12/01/2011 06:35 PM, Peter Mazinger wrote:
>> > libc_hidden_proto does not hide __errno_location, it hides in 
>> reality __GI___errno_location
>> Yes, exactly. I'm afraid "hidden" term is brought here from GCC and a
>> bit confusing/misleading.
>>
>> As I understand (please, correct me if I'm wrong)
>> ./include/libc-symbols.h line 368 clear states
>> that libc_hidden_proto() should be used for PLT bypassing withing
>> libc.so. It is exactly what
>> happens with __errno_location() if libc_hidden_proto() is used in header
>> - all calls to __errno_location()
>> inside libc go directly to libc implementation of __errno_location()
>> regardless libpthread() linked.
> libc_hidden_proto creates a hidden __GI_X function and redirects all 
> calls from X (in our case __errno_location) to __GI_X (done by 
> definitions in header)
> In a *.c file the libc_hidden_def (or *_weak) creates an alias from 
> __GI_X to X and makes X visible. All internal calls within libc are 
> using __GI_X, external apps will use the visible variant X.
Thanks a lot for detailed description of the technique. If I understand 
your description correct,
it does not change the result. If libc_hidden_proto() is used for 
__errno_location() in header,
all libc calls to __errno_location() will use internal function (not 
__errno_location() provided
by linuxthreads.old).

>> linuxthreads.old implementation just wraps libc socket calls like recv()
>> which set errno.
>> Since errno is set from libc call and libc_hidden_proto() is used for
>> __errno_location(),
>> libc version of the function is called and provides pointer to global
>> errno variable (not
>> thread-specific location).
> the error handling within LT_OLD needs some tweaks to cope with 
> internally hidden __(GI)___errno_location. I have patches locally for 
> this, waiting for commits of future branch to head
That's great. I hope the issue will be fixed in 0.9.31 and 0.9.32 
branches as well.

>> Also it is important here that linuxthreads.old does not use TLS. That's
>> why I use
>> __UCLIBC_HAS_TLS__ conditional.
>>
>> There is no such bug in 0.9.30.x.
> __errno_location has to be defnitely visible for LT_OLD in current 
> shape (see also future branch, where IIRC I fixed this)
Am I right that you talk about e934c55580d707710df6efc52718a8ed26775df4 and
e3c2e81f7d4b359e14af8f4454f6532b5ef0b6f0?
If so, I'll try to check it (since I don't understand how it fixes the 
issue and I'd like to).

Thanks a lot,
      Andrew.

-- 
Andrew Rybchenko
OKTET Labs, St.-Petersburg, Russia    Web: www.oktetlabs.ru
Office: +7 812 7832191  Fax: +7 812 7846591  Mobile: +7 921 7479683



More information about the uClibc mailing list