[PATCH] Add missing pthread_condattr_{init,
destroy} stubs to libc
Daniel Eischen
eischen at vigrid.com
Fri Nov 27 22:50:50 UTC 2009
On Nov 27, 2009, at 4:47 PM, Joe Marcus Clarke <marcus at FreeBSD.org>
wrote:
> On Fri, 2009-11-27 at 16:19 -0500, Daniel Eischen wrote:
>> On Nov 27, 2009, at 2:14 PM, Joe Marcus Clarke <marcus at freebsd.org>
>> wrote:
>>
>>> On Fri, 2009-11-27 at 15:12 +0200, Kostik Belousov wrote:
>>>> On Fri, Nov 27, 2009 at 12:15:18AM -0500, Joe Marcus Clarke wrote:
>>>>> I would like permission to commit this patch which adds missing
>>>>> pthread_condattr_{init,destroy} symbols to libc. I think I did
>>>>> the
>>>>> symbol addition correctly (and it seems to work). Without this,
>>>>> the
>>>>> weak symbols added in the libpthread-stubs port conflict with
>>>>> those in
>>>>> libthr, and applications with use these symbols can crash.
>>>>>
>>>>> I have temporarily hacked libpthread-stubs to fix this, but I
>>>>> really
>>>>> feel these stubs should be added to libc. I've also copied kib as
>>>>> he
>>>>> has been kind enough to review my work in the past. Thanks.
>>>>>
>>>>> http://www.marcuscom.com/downloads/stubs.diff
>>>>
>>>> It is FBSD_1.2 version that we use for symbols added after HEAD
>>>> become
>>>> CURRENT-9.
>>>
>>> Done.
>>
>> I don't think the symbols belong in FBSD_1.2. They already exist in
>> libthr in a previous namespace. If you use FBSD_1.2, then you
>> probably need to bump them in libthr and libc_r, and add compatible
>> symbols (no problem there since there are no differences) for the
>> previous versions.
>
> How would this be done? Would I add an FBSD_1.2 namespace to
> pthread.map, or would FBSD_1.1 be sufficient? How would the
> compatibility symbols be defined?
I'm away and on an iPhone, you'll have to search for my notes on this
or see how it's been done for other libc compat symbols..
>
>> Still not sure why libc needs all libpthread stubs. Shouldn't be
>> necessary.
>
> Agreed, but the problem comes with the libpthread-stubs port. This
> port
> was added as a dependency of libxcb (which is used by just about
> everything in X). This port defines weak symbols for
> pthread_condattr_destroy and pthread_condattr_init and maps them to a
> function that simply returns 0. The problem is that if a binary is
> linked to both this library and -pthread, and that binary calls
> pthread_condattr_init(), it can be resolved in libpthread-stubs
> instead
> of libthr. When this happens, the init isn't done, and any subsequent
> usage of the pthread_condattr_t structure results in a segfault.
>
> I'm certainly open to other suggestions for fixing this.
You can reference the non-weak underscore versions in libpthread, and
when non-null you know libphread is present and just dereference
them. Or do something similar to libgcc (or is it libstdc++, I
forget) and use pthread_create as you weakly referenced symbol. The
idea is that if the weakly reference symbol is present, then you know
libpthread is present. I may be misusing "reference" instead of
"defined.
static void *create_is_present = pthread_create;
#pragma weak pthread_create
If create_is_present is not NULL then the symbol is present.
On travel, so I can't provide much more info right now.
--
DE
More information about the freebsd-threads
mailing list