hidden symbol `__dso_handle' in /usr/lib/crtbegin.o is referenced by DSO

Chuck Swiger cswiger at mac.com
Tue Mar 8 01:49:00 UTC 2011

On Mar 7, 2011, at 5:32 PM, Австин Ким wrote:
> I've lately upgraded from FreeBSD 8.2-RC3 to 8.2-RELEASE via freebsd-update and am now getting the following error when trying to build www/webkit-gtk2 in Ports (this was pulled in by the GIMP meta-port; the tail output of make(1) is appended):
> hidden symbol `__dso_handle' in /usr/lib/crtbegin.o is referenced by DSO
> What does this mean, and how might one go about fixing it?

A quick search finds a quote attributed to Martin Loewis:

>> My guess is that it is the infamous .hidden conflict, where the
>> binutils snapshot implements .hidden by putting a STB_LOCAL symbol in
>> the dynamic symbol table (namely __dso_handle). The dynamic linker
>> fails to find this symbol in the shared library, because it does not
>> consider STB_LOCAL symbols.
>> The work-around is to not define HAVE_GAS_HIDDEN in auto-host.h, and
>> recompile the compiler. I'm not sure what the solution is. Perhaps
>> somebody should sit down and implement .hidden in the same way as
>> local symbols in the symbol versioning feature. Perhaps that someone
>> should be me, but I haven't started, yet.

Some people have reported this to be fixed by making sure that anything which is being compiled as a shared object uses the -shared compiler flag.  (And -fPIC and such, also.)

>  (The more generally applicable the answer, the better, as I've encountered this error on several occasions while trying to rebuild other Ports after upgrading FreeBSD.)
> Finally, after upgrading from 8.2-RC3 to -RELEASE I now get a lot of error messages of the form
> grep: write error: Broken pipe
> while building ports, where `grep' is variously `sed,' `sort,' or a number of other variations.  What's the cause of this, and where should I start looking to fix it?

It's likely not a problem.  If you've got a pipeline and a later part of it completes, then earlier parts of the pipeline will get a SIGPIPE if they keep writing output.

See /usr/src/gnu/usr.bin/grep/ChangeLog

1999-02-06 Alain Magloire

        * tests/*.awk : Linux users are seeing "Broken Pipe" on make check.
        The problem is that grep does not drain its stdin, thus the previous
        process in the pipeline receives a SIGPIPE.  Other shells are silent
        about this.  There is actually no failure, since the broken pipe is
        expected.  You can work around it by changing the pipeline, so that
        the input is drained, like this:
        status=`echo 'check' | { ${GREP} -E -e pattern >/dev/null 2>&1;
        echo $?; cat >/dev/null; }`; if test $status -ne $errnu then ... fi
        Excerpt email from Andreas Schwab.


More information about the freebsd-questions mailing list