View previous topic :: View next topic |
Author |
Message |
Christian99 Veteran
Joined: 28 May 2009 Posts: 1668
|
Posted: Fri Jun 06, 2014 6:58 pm Post subject: git and -(l)pthread error |
|
|
Since a while (I think beginning of this year and different versions some 1.9s and also 2.0), portage can't build git anymore without my help. The relevant error is this, I think:
Code: | x86_64-pc-linux-gnu-gcc -O2 -pipe -march=native -fomit-frame-pointer -flto -Wl,-O1 -Wl,--as-needed -Wall -I. -DUSE_LIBPCRE -DHAVE_PATHS_H -DHAVE_DEV_TTY -DXDL_FAST_HASH -DSHA1_HEADER='"block-sha1/sha1.h"' -DNO_STRLCPY -DNO_MKSTEMPS -DSHELL_PATH='"/bin/sh"' -o git-imap-send -Wl,-O1 -Wl,--as-needed imap-send.o \
libgit.a xdiff/lib.a -lpcre -lz -lpthread -lssl -lcrypto
utf8.o (symbol from plugin): warning: memset used with constant zero length parameter; this could be due to transposed parameters
utf8.o (symbol from plugin): warning: memset used with constant zero length parameter; this could be due to transposed parameters
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/libgcc_s.so: undefined reference to `pthread_getspecific'
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/libgcc_s.so: undefined reference to `pthread_key_create'
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/libgcc_s.so: undefined reference to `pthread_setspecific'
collect2: error: ld returned 1 exit status |
it is easily fixed by changing the git main Makefile: there is a line Code: | PTHREAD_LIBS = -lpthread | , when changed to Code: | PTHREAD_LIBS = -pthread | the build runs flawless.
So, what's the problem there? why isn't the prober linker flag specified? In /usr/lib64/pkgconfig files, there is a mixture betwenn -lpthread and -pthread. might this be a possible cause? and if yes, how should i correct the .pc files best? or any other ideas?[/code] |
|
Back to top |
|
|
Christian99 Veteran
Joined: 28 May 2009 Posts: 1668
|
Posted: Tue Jun 10, 2014 4:37 pm Post subject: |
|
|
*push* |
|
Back to top |
|
|
Hu Moderator
Joined: 06 Mar 2007 Posts: 21631
|
Posted: Wed Jun 11, 2014 1:54 am Post subject: |
|
|
Does the problem go away if you do not use -flto? Using that flag defers to link time some operations that are otherwise done at compile time. If those operations are influenced by the presence of the -pthread flag, then deferring them to a run which does not specify it would change behavior.
Disclaimer: I have used LTO only briefly and have no specific knowledge that this is your problem or that removing LTO will fix it. On the other hand, you have not received any other advice and your post is no longer considered "unanswered" due to your bump. |
|
Back to top |
|
|
Christian99 Veteran
Joined: 28 May 2009 Posts: 1668
|
Posted: Wed Jun 11, 2014 8:54 pm Post subject: |
|
|
yes, indeed, that helped. Well, I have seen quite a few errors related to lto, but never imagined this one was caused by that, too.
Well, Does anybody know what the difference is between -pthread and -lptread? |
|
Back to top |
|
|
Hu Moderator
Joined: 06 Mar 2007 Posts: 21631
|
Posted: Wed Jun 11, 2014 10:07 pm Post subject: |
|
|
Yes. The first enables various options required to support threading. The second only links to the threading library. For a regular link, this is enough. If you defer code generation to link time, it is not enough. Generally, when using lto, you should pass to the linker all the options that would be passed in a regular compilation phase. Passing -pthread may be sufficient to resolve this particular issue, but it would be better to pass all of CFLAGS or CXXFLAGS, as appropriate. |
|
Back to top |
|
|
Christian99 Veteran
Joined: 28 May 2009 Posts: 1668
|
Posted: Wed Jun 11, 2014 10:18 pm Post subject: |
|
|
ok, thx for the help! |
|
Back to top |
|
|
IdRatherBeCompiling n00b
Joined: 07 Jan 2015 Posts: 2
|
Posted: Wed Jan 07, 2015 10:22 pm Post subject: |
|
|
Hey guys, I just ran into this same problem.
The issue is that in the directory:
Code: | /var/tmp/portage/sys-apps/busybox-1.21.0/work/busybox-1.21.0/scripts/ |
you might need to alter the path a little depending on your busybox version. There is a script called trylink. And this is broken. Run:
Control C it after it's started compiling (otherwise the directory wont exist). And copy the trylink script.
I changed the lines:
Code: | l_list=`echo "$LDLIBS" | sed -e 's/ / -l/g' -e 's/^/-l/' -e 's/^-l$//'`
l_list=`echo "$without_one" | sed -e 's/ / -l/g' -e 's/^/-l/' -e 's/^-l$//'`
l_list=`echo "$LDLIBS" | sed -e 's/ / -l/g' -e 's/^/-l/' -e 's/^-l$//'` |
To:
Code: |
l_list=`echo " $LDLIBS " | sed -e 's: \([^- ][^ ]*\): -l\1:g'`
l_list=`echo " $without_one " | sed -e 's: \([^- ][^ ]*\): -l\1:g'`
l_list=`echo " $LDLIBS " | sed -e 's: \([^- ][^ ]*\): -l\1:g'` |
Then I ran the one liner to copy my hacked trylink script to the busybox directory (necessary because emerge will nuke your file changes):
Code: | while [ 1 ]; do cp trylink /var/tmp/portage/sys-apps/busybox-1.21.0/work/busybox-1.21.0/scripts/; sleep 1; done |
In one terminal and i reran:
In another. Because emerge system kept restarting from the beginning. And this solved my issue.
It's a filthy hack, but it got me past the problem. |
|
Back to top |
|
|
Hu Moderator
Joined: 06 Mar 2007 Posts: 21631
|
Posted: Thu Jan 08, 2015 12:37 am Post subject: |
|
|
That is a disgusting way to modify an existing build, in addition to being racy. If you absolutely must patch a file, do it from an overlay or via the Portage environment overrides, which will both solve the race and ensure that the same change is applied every time you rebuild the affected package. |
|
Back to top |
|
|
IdRatherBeCompiling n00b
Joined: 07 Jan 2015 Posts: 2
|
Posted: Thu Jan 08, 2015 8:36 am Post subject: |
|
|
Yuuuuuuuup, I told you it wasn't pretty.
Ahh I googled for hours and I got nowhere, but i wasn't sure what I was looking for
I'll look into that.
Thanks! |
|
Back to top |
|
|
|