[PATCH] fix errno location for non-TLS case

Peter Mazinger ps.m at gmx.net
Fri Dec 2 13:26:42 UTC 2011


Hi,

the easiest way to disable the behaviour and have the same __errno_location (visible) in both libc and libpthread is to guard all occurences of libc_hidden_proto(X) and libc_hidden_def/weak(X) with __UCLIBC_HAS_TLS__ (where X=__errno_location)

Peter
-------- Original-Nachricht --------
> Datum: Fri, 02 Dec 2011 11:04:50 +0400
> Von: Andrew Rybchenko <Andrew.Rybchenko at oktetlabs.ru>
> An: Peter Mazinger <ps.m at gmx.net>
> CC: uclibc at uclibc.org
> Betreff: Re: [PATCH] fix errno location for non-TLS case

> 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
> 

-- 
Empfehlen Sie GMX DSL Ihren Freunden und Bekannten und wir
belohnen Sie mit bis zu 50,- Euro! https://freundschaftswerbung.gmx.de


More information about the uClibc mailing list