NetBSD-Users archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: link as -lc -lpthread hangs
Hi,
2009/9/11 Christos Zoulas <christos%astron.com@localhost>:
> In article
> <515c64960909102201g6bb7f8cfr2284bb3a1f53933f%mail.gmail.com@localhost>,
> Channa <channa.kad%gmail.com@localhost> wrote:
>>Hi,
>>
>>2009/9/11 Christos Zoulas <christos%astron.com@localhost>:
>>> In article
>>> <515c64960909100612h29118e2ftf2af05f513aa103a%mail.gmail.com@localhost>,
>>> Channa <channa.kad%gmail.com@localhost> wrote:
>>>>Hi,
>>>>I am using NetBSD rtld implementation in my library.
>>>>I am facing some issue when the application is built by linking
>>>>with libc before libpthread. i.e '-lc -lpthread' as shown below
>>>>
>>>>/usr/local/${ARCH}-linux/gcc app.c -o app -lc -lpthread
>>>>
>>>>When i run the 'app' it hangs.
>>>
>>> This is not supposed to work. You need to link -lpthread before -lc
>>> since pthread overrides some libc functions. In fact the only portable
>>> way to compile threaded programs is using gcc -pthread app.c -o app
>>>
>>> christos
>>
>>Yes true pthread overrides some of the symbols in libc.
>>But there is a way which we can avoid the hang condition.
>>When the application is compiled by the method by linking
>>'-lc -lpthread' in that case the needed section of the application
>>contains the libc.so first and then libpthread.so.
>>
>>In the rtld implementation the needed libraries are loaded on the same
>>order as present in applications needed section, so we can add a fix by
>>not loading libc.so if its the first entry in needed objects.
>>
>>This can be done in the following file
>>
>>$ cat src/libexec/ld.elf_so/load.c
>>:
>>:
>>+ static int flag = 0;
>> for (needed = obj->needed; needed != NULL;
>> needed = needed->next) {
>>+ flag++;
>> const char *name = obj->strtab + needed->name;
>> /*
>> * Avoid loading of 'libc.so' if its the first object
>> * in the needed section
>> */
>>+ if (flag == 1 &&
>>!(strncmp(name,"libc.so",strlen(name))))
>>+ continue;
>> for (needed = obj->needed; needed != NULL;
>> needed = needed->next) {
>>+ flag++;
>> const char *name = obj->strtab + needed->name;
>>
>>:
>>:
>>
>>So by doing this we can avoid loading libc.so first.
>>
>>This will avoid hang condition if the application is built by
>>linking '-lc -lpthread'
>>
>>Please let me know your views on this.
>
> Why special-case this, when it can easily be avoided by not specifying
> -lc in the command line.
>
> christos
Yes i understand this can be avoided by not specifying -lc but some
the application
which i am using having the Makerules which link -lc before -lpthread.
So i wanted to avoid modifying all the Makerules for the applications.
These application work fine on Linux with GNU c libraries.
And also there is no specification saying about the linking order.
So i thought a fix in the rtld would be fine.
So is the fix OK?
Let me know your views.
Thanks & Regards,
Channa
Home |
Main Index |
Thread Index |
Old Index