Created attachment 7550 [details] pthread_test.c При указании флага -pthread gcc не прилинковывает libpthread к получаемому приложению или библиотеке. Воспроизведение: gcc -Wl,--as-needed pthread_test.c -o pthread_test -pthread ./pthread_test Результат: "0" Ожидаемый результат: "Not zero"
Created attachment 7551 [details] gcc_opts.alt.txt Вывод команды "LC_ALL=C gcc -Wl,--as-needed pthread_test.c -o pthread_test -pthread -v" на Altlinux.
Created attachment 7552 [details] gcc_opts.gentoo.txt Вывод команды "LC_ALL=C gcc -Wl,--as-needed pthread_test.c -o pthread_test -pthread -v" на Gentoo.
Created attachment 7553 [details] gcc_opts.fedora.txt Вывод команды "LC_ALL=C gcc -Wl,--as-needed pthread_test.c -o pthread_test -pthread -v" на Fedora.
Если сравнить выводы команды "LC_ALL=C gcc -Wl,--as-needed pthread_test.c -o pthread_test -pthread -v" с использованием прикреплённых исходников в качестве файла pthread_test.c, то можно увидеть что на Gentoo и Fedora перед '-lpthread' появляется опция '--no-as-needed', а на Altlinux - нет. Из-за этого на данных дистрибутивах получается ожидаемый результат "Not zero", в то время как на Altlinux - "0".
А почему, собственно, gcc -Wl,--as-needed -pthread должно принудительно прилинковывать -lpthread вопреки -Wl,--as-needed? Кстати, на Debian не смотрели?
На debian не смотрели. Тесты на gnulib не проходят, а у других проходят. Что касается --as-needed, то в этом же фишка - заменить его на --no-as-needed в случае флага -pthread
(In reply to comment #6) > На debian не смотрели. Посмотрите :) > Тесты на gnulib не проходят, а у других проходят. Если тесты на gnulib не проходят, то это проблема gnulib. Главная идея gnulib - переносимость. > Что касается --as-needed, то в этом же фишка - заменить его на --no-as-needed > в случае флага -pthread Почему? Основная фишка -pthread в том, чтобы собирать софт, использующий posix threads, не задумываясь, как называется -lpthread и в каком месте её надо указать.
Это да, но вот с -pthread приаттаченный пример не компилируется
(In reply to comment #8) > Это да, но вот с -pthread приаттаченный пример не компилируется Этот тест очень похож на гнулибовский USE_POSIX_THREADS_WEAK: он не использует posix threads.
Created attachment 7558 [details] gcc_opts.debian.txt Вариант с Debian
Дим, проблема ровно в том, что у нас поведение gcc в плане -pthread отличается от окружающего мира. Да, вылезло это на gnulib, а точнее их тестах. Можно было бы поправить и там, но мне кажется честнее привести себя в одно состояние с остальными, к тому же исправление в общем то понятно. Более того - у нас даже есть такой пакет как gnulib, в котором это место грязнохакается в процессе сборки ;)
Created attachment 7559 [details] ppc64-debian7.log Вариант с Debian7.
(In reply to comment #12) > Created an attachment (id=7559) [details] > ppc64-debian7.log > > Вариант с Debian7. Debian с gcc7.
Да, на Debian с gcc7 такая же история как у нас, но и тесты на пакетах с gnulib они не запускают (пример - hivex).
(In reply to comment #8) > Это да, но вот с -pthread приаттаченный пример не компилируется Компилируется, но результат не тот: pthread не прилинковывается. (In reply to comment #9) > Этот тест очень похож на гнулибовский USE_POSIX_THREADS_WEAK: > он не использует posix threads. Да, на основе этих гнулибовских тестов данный пример и сделан. Но тест подразумевает, что при линковке с pthread эти weak symbols возьмутся из pthread. Сейчас же несмотря на явный флаг компилятору -pthread, libpthread не прилинковывается, pthread не доступен несмотря на явное указание сделать иначе. (In reply to comment #12) > Created an attachment (id=7559) [details] > ppc64-debian7.log > > Вариант с Debian7. Из аттача: --push-state --as-needed -lgcc_s --pop-state Имхо, самое правильно было бы сделать аналогичное: чтобы '-pthread' разворачивался в '--push-state --no-as-needed -lpthread --pop-state'. Проверил в Debian 9 (Stretch) с gcc 6.3.0-18+deb9u1, результат "Not zero". Проверил в Debian sid с gcc 7.3.0-19, результат "0". Однако, если убрать явное указание '-Wl,--as-needed', то результат на Debian sid становится ожидаемым - "Not zero". На Альте даже с "gcc pthread_test.c -o pthread_test -pthread" всё равно результат "0".
> (In reply to comment #12) > > Created an attachment (id=7559) [details] [details] > > ppc64-debian7.log > > > > Вариант с Debian7. > > Из аттача: --push-state --as-needed -lgcc_s --pop-state Я думаю, что мы сделаем так же при первом удобном случае.
gcc7-7.3.1-alt4 -> sisyphus: Thu May 24 2018 Dmitry V. Levin <ldv@altlinux> 7.3.1-alt4 - Updated to redhat/gcc-7-branch r258210. - Synced with Fedora gcc 7.3.1-5. - Use --push-state --as-needed and --pop-state instead of --as-needed for libgcc (closes: #34935). - Link libasan, liblsan, libtsan, and libubsan always with --no-as-needed. - mips64el: set default ABI to N64.
Надо б было и binutils обновить, наш ld.gold не знает --push-state, --pop-state.
(In reply to comment #18) > Надо б было и binutils обновить, наш ld.gold не знает --push-state, --pop-state. Безобразие!
(In reply to comment #9) > (In reply to comment #8) > > Это да, но вот с -pthread приаттаченный пример не компилируется > > Этот тест очень похож на гнулибовский USE_POSIX_THREADS_WEAK: > он не использует posix threads. JFYI: Тем временем и gnulib поменялся к лучшему: начиная с коммита v0.1-1978-g426320901, там теперь после -pthread добавляют -Wl,--push-state -Wl,--no-as-needed -lpthread -Wl,--pop-state, если компилятор+линкер это поддерживают. Это всё хорошо работает до тех пор, пока в дело не вступает libtool, который у нас эту конструкцию переваривает неправильно, цитирую по логу сборки пакета augeas: 86_64-alt-linux-gcc -DHAVE_CONFIG_H -I. -I../.. -DIN_AUGEAS_GNULIB_TESTS=1 -I. -I. -I../.. -I./../.. -I../../gnulib/lib -I./../../gnulib/lib -pipe -frecord-gcc-switches -Wall -g -O2 -c -o test-thread_create.o test-thread_create.c /bin/sh ../../libtool --tag=CC --preserve-dup-deps --mode=link x86_64-alt-linux-gcc -pipe -frecord-gcc-switches -Wall -g -O2 -o test-thread_create test-thread_create.o libtests.a ../../gnulib/lib/libgnu.la libtests.a -pthread -Wl,--push-state -Wl,--no-as-needed -lpthread -Wl,--pop-state libtool: link: x86_64-alt-linux-gcc -pipe -frecord-gcc-switches -Wall -g -O2 -o test-thread_create test-thread_create.o -pthread -Wl,--push-state -Wl,--no-as-needed -Wl,--pop-state libtests.a ../../gnulib/lib/.libs/libgnu.a -lselinux libtests.a -lpthread -pthread К счастью, комбинация libtool+gnulib редко встречается, но libtool придётся патчить.
Когда ожидать исправления libtool ? Из-за этой проблемы сейчас не пересобирается augeas.