FreeBSD port for 2.0.0 (and a FreeRADIUS patch submission)
David Wood
david at wood2.org.uk
Mon Jan 14 00:58:30 CET 2008
Hi Nicolas,
In message <20080112152004.GG13250 at asuka.dae.sitadelle.com>, Nicolas
Baradakis <nbk at sitadelle.com> writes
>David Wood wrote:
>
>> PATCH SUBMISSION - THREADING ISSUES
>>
>> [...]
>>
>> Firstly, for threading on FreeBSD you should just use -pthread (and not
>> use -lpthread). There are different threading libraries available on
>> FreeBSD; the OS does the correct thing if you just use -pthread.
>
>-pthread vs -lpthread is a long discussion. If the "configure"
>script says -lpthread is supported, I think we can use it in all
>cases. (including FreeBSD)
I know - and I'm sorry to have to ask to complicate things further.
The behaviour of -pthread on at least some FreeBSD systems is explained
in:
http://lists.freebsd.org/pipermail/freebsd-ports/2005-January/019345.html
that is, -pthread means the thread library symbols are resolved by the
linker, but it doesn't emit the DT_NEEDED for the thread library when
building a shared library. At the time post this was written, 7.0 didn't
exist, and I can quite believe that the different gcc and bintools
versions in 7.0 changes things (see later).
FreeBSD 6.x is very different to 7.x - 6.x is a gcc 3.4 based toolchain,
whilst 7.x is gcc 4.2 based; most of the other bintools are similarly
elderly in 6.x. That said, 6.x is still a current release series, and
will need supporting for around another two years.
I mention this to explain why it's quite possible for 6.x and 7.x to
behave quite differently. I can't check, as I haven't got a 5.x machine
to hand, but I suspect 5.x behaves the same as 6.x.
A further complication with -lpthread is that FreeBSD sparc64 doesn't
have libpthread, just libthr. These two threading libraries both conform
(as much as really matters) to the POSIX threading ABI.
>I'm unsure there's a need to make one more special case in the
>mainstream FreeRADIUS tree. Moreover I note that -pthread has been
>removed from the "pthread" manpage.
The reference to gcc -pthread on the pthread man page was because that
flag used to be needed to link against a thread safe libc, libc_r.
libc_r disappeared from FreeBSD 5.x, as did the note about gcc -pthread
on the pthread man page.
-pthread is still the way that threading is handled within FreeBSD ports
- I did reference the appropriate documentation in the patch.
For further confirmation, look at the value of PTHREAD_LIBS in
/usr/ports/Mk/bsd.port.mk - CVSweb at
http://www.freebsd.org/cgi/cvsweb.cgi/ports/Mk/bsd.port.mk
I detest the complexity, but as the FreeRADIUS port maintainer, I have
to live with it. Building FreeRADIUS outside a port could hit problems
on at least some FreeBSD versions unless -pthread is used.
When I was developing the patch, I found at least one other 'well known'
application with logic to use -pthread on FreeBSD - but I can't remember
which - sorry!
>> Secondly, it deals with the case where python is built with threads (as
>> is now the default for python on FreeBSD). As I don't use rlm_python, I
>> can't test whether it works after this patch, but rlm_python won't even
>> build on FreeBSD without it.
>
>I believe this is a problem with the python library. The linker should
>report the dependencies of libpython2.4.so.
>
>I've asked a friend who is running 7.0-CURRENT and it looks OK for him:
>
>$ ldd /usr/local/lib/libpython2.4.so.1
>/usr/local/lib/libpython2.4.so.1:
> libutil.so.6 => /lib/libutil.so.6 (0x800c24000)
> libm.so.4 => /lib/libm.so.4 (0x800d32000)
> libthr.so.2 => /lib/libthr.so.2 (0x800e4c000)
> libc.so.7 => /lib/libc.so.7 (0x800632000)
If the system is showing 7.0-CURRENT, that's rather old - and python 2.5
is now the default version. Recent CURRENT is now 8.0-CURRENT, whilst
7.0 is on course for a release.
[david at osmium ~]$ uname -mrs
FreeBSD 7.0-BETA4 i386
[david at osmium ~]$ ldd /usr/local/lib/libpython2.5.so
/usr/local/lib/libpython2.5.so:
libutil.so.7 => /lib/libutil.so.7 (0x2817d000)
libm.so.5 => /lib/libm.so.5 (0x2818a000)
libthr.so.3 => /lib/libthr.so.3 (0x2819f000)
libc.so.7 => /lib/libc.so.7 (0x28080000)
This system is actually a little beyond 7.0-BETA4 - it's on the way to
7.0-RC1 level, so it's fairly recent. I shall probably rebuild it a
7.0-RC2 level when that's available.
Actually this system is a VMware virtual machine - it's my 7.0
development platform.
However, back on what is still the latest release:
[david at titanium ~]$ uname -mrs
FreeBSD 6.2-RELEASE-p9 i386
[david at titanium ~]$ ldd /usr/local/lib/libpython2.5.so
/usr/local/lib/libpython2.5.so:
libutil.so.5 => /lib/libutil.so.5 (0x482a6000)
libm.so.4 => /lib/libm.so.4 (0x482b3000)
In both cases, python was built via the lang/python25 port without any
special knobs or similar configuration.
Note that there's no threading library in the ldd output of 6.x, even
though the library is threaded. (The lack of a libc.so dependency is
because of the lack of a threading library - both libthr.so and
libpthread.so depend on libc.so.)
>I don't see why you would need to add -pthread to the linker command line.
Because it is quite legitimate on FreeBSD for have shared libraries -
such as libpython<version>.so with thread library symbols, but without a
dependency on a thread library. Without -pthread, you get an error on
such systems when building rlm_python.
It is for that reason that I developed the patch to the configure.in of
rlm_python. It is almost certainly overkill; I suspect all it needs to
do is to try -pthread on FreeBSD and not repeat all the other threading
checks.
Best wishes,
David
--
David Wood
david at wood2.org.uk
More information about the Freeradius-Users
mailing list